家里有一台 NAS 或者旧电脑想跑点服务?国内家宽两座大山:动态 IP 和端口封锁。这篇文章记录我是怎么用 Cloudflare 的免费套餐,绕开这两个问题,把家里的服务暴露到公网的。
在 Bilibili 看到过一篇家用服务器建站指南,作者买了台 DELL R620 想自建服务,然后踩遍了国内家宽的所有坑:
动态公网 IP:运营商会不定期变更你的公网 IP,域名解析随时失效
端口封锁:80、443、8080 这些常用端口全部封禁,用户必须在域名后面加端口号才能访问(example.com:5555)
搜索引擎不友好:非标准端口域名对 SEO 不友好
作者最后的结论是:"追求稳定、速度的站长,去买云服务器即可"——维护成本、电费、噪音、停电风险算下来,云服务器反而更划算。
这个结论放在 2022 年是对的。但现在有了更好的路:Cloudflare 免费套餐。
传统方案的链路是:
用户 → DNS 解析到家里公网 IP → 路由器端口转发 → 内网服务
这条路上有三个卡点:动态 IP 需要 DDNS 维护、端口转发要配路由器、443/80 可能被封。
Cloudflare Tunnel 的链路完全不同:
用户 → Cloudflare Edge → Tunnel → 家里的 cloudflared → 内网服务
关键区别:连接是从家里主动发起到 Cloudflare 的,不需要开放任何入站端口,路由器不需要任何配置,公网 IP 变了也没关系。
Cloudflare 提供免费域名(*.dpdns.org),同时提供 DNS API。用 favonia/cloudflare-ddns 这个 Docker 镜像,每 5 分钟自动检测公网 IP 并更新 A 记录。
适用场景:SSH 远程登录家里机器、远程桌面、需要直连的服务。
不需要公网 IP,不需要端口转发,甚至不需要路由器支持。
cloudflared 容器在家里启动后,向 Cloudflare 建立持久的出站连接。Cloudflare 的全球边缘节点接受用户请求,通过这条隧道转发到家里的具体服务。
用户访问的是标准 443 端口的 HTTPS,证书由 Cloudflare 签发和管理,家里完全不需要 Certbot 或者 Let's Encrypt。
Cloudflare 账号(免费)
一个 Cloudflare 管理的域名(可以用 CF 赠送的 *.dpdns.org)
家里有台能跑 Docker 的机器(NAS、树莓派、旧电脑都行)
Step 1:申请免费域名
dpdns.org 是 DigitalPlat 提供的永久免费域名,注册后接入 Cloudflare 即可使用:
注册 dash.domain.digitalplat.org(不能用临时邮箱)
完成 KYC 认证(自动审核通过)
在 Domain Registration 申请子域名
将 Cloudflare 的 NS 服务器填入,等待邮件确认接入
注意:每个账号限 1 个免费域名,需每年提前 180 天手动续期,不建议用于生产环境。
Step 2:创建 Cloudflare Tunnel
进入 Zero Trust → Networks → Tunnels → Create a tunnel,复制生成的 Token。
Step 3:配置 Public Hostname
在 Tunnel 配置里添加路由规则,把子域名指向内网服务
Step 4:Docker Compose 一键启动
所有服务统一在一个 docker-compose.yml 里管理。
homelab/
├── docker-compose.yml # 所有服务定义
├── .env # 密钥(不进 git)
├── .env.example # 变量模板(进 git)
├── cloudflare/
│ └── README.md # Tunnel 路由说明
└── data/ # 容器数据目录(不进 git)
├── vaultwarden/
└── alist/
docker-compose.yml 包含以下服务:
services:
cloudflare-ddns: # 自动更新 A 记录,解决动态 IP
cloudflared: # Tunnel 连接,解决内网穿透
vaultwarden: # 密码管理器(Bitwarden 兼容)
jellyfin: # 媒体服务器
alist: # 网盘聚合
这是这套方案最值得强调的地方:
✅ 外网 HTTPS 访问家里服务,URL 干净无端口号
✅ 证书自动管理,浏览器无警告
✅ 不开路由器端口,内网安全边界完整
✅ 运营商换 IP、封端口,对 Tunnel 完全没影响
✅ 流量走 Cloudflare 全球 CDN,国内访问延迟还不错
不能做到的:
❌ 大流量视频流(CF ToS 禁止代理视频),Jellyfin 建议走直连或单独处理
❌ 超低延迟场景(毕竟多了一跳 CF 节点)
两年前那篇 Bilibili 文章的问题,现在用 Cloudflare 免费套餐全部解决,而且更简单:
问题传统方案Cloudflare 方案动态 IPNoIP 免费域名每 30 天需手动确认,否则失效dpdns.org 每 180 天续期一次,CF DDNS 自动更新 IP端口封锁换端口 + CDN 隐性解析Tunnel 根本不用端口HTTPS 证书Certbot + Let's Encrypt + NginxCF 自动签发,无需 Nginx路由器配置端口转发不需要
整套服务跑在 NAS 上,docker compose up -d 一键启动,配置文件全部在 Git 里版本控制。Nginx、Certbot 一行都不需要写。