我的第二个 Cloudflare Tunnel
Source: Dev.to

问题
快速回顾涉及的隐私和安全问题:
- 端口转发会暴露家庭 IP 地址
- 动态 DNS 需要不断更新
- 开放端口是安全风险
- SSL 证书管理麻烦
我想要的解决方案应当:
- 保持家庭网络安全
- 自动提供 HTTPS
- 添加身份验证
- 易于维护
进入 Cloudflare Tunnel
Cloudflare Tunnel 会从你的网络 向外 创建一个 安全的出站连接 到 Cloudflare 的边缘。对你的域名的请求会通过该隧道路由到你的应用程序,无需任何入站端口。
流程:
Internet → Cloudflare Edge → Tunnel → NAS → Application
所有连接都是从 NAS 出站的,防火墙保持不变。
设置隧道
前置条件
- 一个由 Cloudflare 管理的域名
- NAS 上运行的 Docker 服务
- 你的应用以 Docker 容器运行
创建命名隧道
- 在 Cloudflare Zero Trust 仪表板,进入 Access > Tunnels。
- 点击 Create a tunnel 并选择 Cloudflared。
- 为隧道命名(例如
nas)。 - 复制生成的隧道令牌——稍后会用到。
该令牌用于对隧道进行身份验证。
在 NAS 上运行 cloudflared
拉取官方 Docker 镜像:
docker pull cloudflare/cloudflared:2025.9.1
使用 Synology Docker UI 创建容器,设置如下:
- 容器名称:
cloudflared - 命令:
tunnel --no-autoupdate run - 环境变量:
TUNNEL_TOKEN=(在此粘贴你的令牌) - 网络: 与你的应用相同的网络(例如
bridge)
为 cloudflared 容器创建指向应用容器的链接:
- 链接容器: 应用容器的名称(例如
myapp) - 别名: 同名 (
myapp)
这使得 cloudflared 能够通过 http://myapp: 访问应用,而无需暴露任何端口。
配置公共主机名
- 在 Cloudflare 仪表板打开隧道配置。
- 前往 Public Hostname 选项卡,点击 Add a public hostname。
- 设置子域、域名和服务路径(例如
http://myapp:)。
主机名必须与 Docker 链接别名匹配。如果出现类似错误:
dial tcp: lookup wrongname on 192.168.1.254:53: no such host
请检查链接名称和主机名是否不一致。
添加身份验证
如果不做额外保护,任何拥有链接的人都可以访问应用。Cloudflare Access 提供内置的身份验证,无需修改代码。
- 前往 Access > Applications。
- 点击 Add an application > Self‑hosted。
- 填写应用名称、域名和子域,然后点击 Next。
- 创建策略:
- 策略名称: “Allow myself”
- 操作: Allow
- 包含规则: Emails →
john@doe.it
- 完成后添加该应用。

确保策略已关联到隧道;否则 Cloudflare 不会强制执行身份验证。
结果
从外部访问应用时:
- Cloudflare 显示身份验证页面。
- 输入你的邮箱。
- Cloudflare 发送一次性验证码。
- 输入验证码后完成身份验证。
- 请求通过隧道代理到应用。
现在我可以随时随地安排帖子发布。
结论
Cloudflare Tunnel 为自托管提供了优雅且免费(cost‑free)的解决方案:
- 自动 HTTPS
- 通过 Cloudflare Access 内置身份验证
- 无入站端口,保持家庭网络安全
整个设置大约用了 30 分钟,其中大部分时间用于修正容器名称和策略分配。希望本指南能帮助遇到类似挑战的朋友。
进一步阅读
- Home Assistant 的 Cloudflare Tunnel
- Cloudflare Access 控制
- Cloudflare 策略
- 我终于理解了 Cloudflare Zero Trust 隧道
最初发表于 A Java Geek ,发布日期为 2025 年 11 月 30 日。