公网家庭服务器安全部署方案
公网家庭服务器安全部署方案
—— UFW + Tailscale + Caddy 反向代理完整实践
在 IPv6 普及的今天,家庭宽带已经可以直接获得公网 IPv6 地址。这意味着:
你的设备不再躲在 NAT 后面,而是真正暴露在公网。
如果不加防护,基本等于裸奔。
本文记录一套完整、安全、可长期运行的家庭服务器架构:
- Debian 13
- 公网 IPv6 + DDNS
- UFW 精细化防火墙控制
- Tailscale 内网穿透
- Caddy 反向代理网关
- 统一通过
mini.keepon.fun/{服务名}访问
一、我的网络环境
主机网络信息如下:
1 | 公网接口:enp2s0 |
域名:
1 | mini.keepon.fun |
通过 DDNS 解析到公网 IPv6。
二、整体架构设计
最终目标架构如下:
1 | 公网 IPv6 |
内网访问:
1 | LAN 或 Tailscale → 直接访问内部服务 |
核心原则:
- 默认拒绝所有公网入站
- 只暴露 80 / 443
- 所有服务不直接暴露公网端口
- 所有内部服务只监听 127.0.0.1
- Tailscale 不受限制
三、UFW 防火墙设计
1️⃣ 启用 IPv6 支持
编辑:
1 | /etc/default/ufw |
确保:
1 | IPV6=yes |
2️⃣ 重置并初始化
1 | sudo ufw reset |
3️⃣ 放行 Tailscale
1 | sudo ufw allow in on tailscale0 |
4️⃣ 放行局域网
1 | sudo ufw allow from 192.168.1.0/24 |
5️⃣ 只开放公网 80 和 443
1 | sudo ufw allow in on enp2s0 to any port 80 proto tcp |
最终 ufw status 结构如下:
1 | Default: deny (incoming) |
此时:
- 公网 IPv6 只开放 80 / 443
- 所有其他端口默认拒绝
- 8096 等内部端口不再暴露
四、部署 Caddy 作为网关
为什么选 Caddy?
- 自动申请 HTTPS 证书
- 自动续期
- 原生支持 IPv6
- 配置简单
- 默认安全
安装 Caddy
1 | sudo apt install caddy |
Caddyfile 示例
编辑:
1 | /etc/caddy/Caddyfile |
示例配置:
1 | mini.keepon.fun { |
重载:
1 | sudo systemctl reload caddy |
五、重要坑点说明
坑 1:路径匹配问题
/jellyfin/* 不匹配 /jellyfin
必须添加:
1 | redir /jellyfin /jellyfin/ 308 |
否则访问会 404。
坑 2:Caddy 默认启用 HTTPS
Caddy 会自动:
- 申请证书
- 强制 HTTP → HTTPS 重定向
如果 443 未开放,就会访问失败。
坑 3:IPv6 没有 NAT
很多人误以为:
“我在路由器后面,很安全”
IPv6 没有 NAT。
你的主机是真公网设备。
必须依赖防火墙。
六、最终安全模型
公网:
1 | 80 → Caddy |
内部:
1 | 127.0.0.1:8096 (Jellyfin) |
Tailscale:
1 | 完全放行 |
局域网:
1 | 完全放行 |
七、安全等级评估
当前方案安全等级:
⭐⭐⭐⭐☆(家庭服务器高等级)
优点:
- 默认拒绝公网
- 只暴露 443
- 自动 HTTPS
- 内部服务隐藏
- Tailscale 隔离
如果再加:
- fail2ban
- rate limit
- HSTS
- 关闭 Caddy 示例站点
可达到:
⭐⭐⭐⭐⭐
八、总结
这套架构实现了:
- IPv6 公网安全暴露
- 精细化防火墙控制
- 零信任内网访问
- 统一网关管理
- 自动 HTTPS
它适合:
- 家庭服务器
- 轻量 VPS
- 个人云
- 开发环境
如果一句话总结:
不再裸奔公网,而是用网关做唯一入口。