使用 Cloudflare Tunnel(简称 CF Tunnel)来实现家用主机突破 80/443 端口封锁,是目前公认最优雅、最安全的方案。
下面是为您整理的保姆级配置步骤:
第一步:将域名 DNS 解析迁移到 Cloudflare (免费)
Cloudflare Tunnel 要求域名必须由 Cloudflare 解析。
- 登录 Cloudflare 官网 注册一个免费账号。
- 点击 Add a Site (添加站点),输入你的域名(如
imdld.com),选择 Free (免费) 计划。 - Cloudflare 会自动扫描你现有的 DNS 记录(比如在 GoDaddy 上的记录)。扫描完成后点击继续。
- Cloudflare 会给你两个 Nameservers(域名服务器) 地址(例如
hank.ns.cloudflare.com和heather.ns.cloudflare.com)。 - 去 GoDaddy 修改设置:
- 登录 GoDaddy,找到你的域名,进入 DNS 管理。
- 找到“域名服务器 (Nameservers)”,将其修改为 Cloudflare 提供的那两个地址。
- 注:修改 DNS 服务器需要几分钟到几小时生效,期间不影响你的现有解析。
第二步:在 Cloudflare 创建 Tunnel
DNS 迁移完成后,就可以在网页端创建隧道了。
- 在 Cloudflare 控制台左侧菜单,点击 Zero Trust(如果是第一次进入,根据提示开通即可,完全免费,不需要绑定信用卡)。
- 在 Zero Trust 面板中,依次点击 Networks -> Tunnels。
- 点击 Create a Tunnel,选择 Cloudflare Tunnel (named)。
- 给你的隧道起个名字(例如
my-nas-tunnel),点击保存。 - 保存后,页面会显示一串安装命令。找到包含
--token后面的一长串密钥(Token),把它复制保存下来。
第三步:在 NAS/家用主机上运行 Tunnel 客户端
因为你的 NAS 项目涉及 Docker/Podman,这里推荐直接使用 Docker 运行客户端(cloudflared):
在你的 NAS 上执行以下命令(将 <YOUR_TOKEN> 替换为你上一步复制的 Token):
docker run -d \
--name cloudflared \
--restart unless-stopped \
cloudflare/cloudflared:latest \
tunnel --no-autoupdate run --token <YOUR_TOKEN>运行成功后: 回到 Cloudflare 的网页端,你会看到刚才创建的 Tunnel 状态变成了 Active(绿色健康状态)。这说明你的内网主机已经和 Cloudflare 建立了专属的加密通道!
第四步:在网页端配置域名映射(实现无端口访问)
有了通道后,你可以任意分配子域名到你的内网服务,完全不需要配置路由器端口转发,甚至不需要使用 Caddy(除非你有特殊反代需求)。
在刚才的 Tunnel 页面中,点击该 Tunnel 的 Edit (编辑) ➡️ 进入 Public Hostname (公共主机名) 选项卡:
- 点击 Add a public hostname。
- 配置你的子域名:
- Subdomain (子域名): 输入
story - Domain (域名): 选择
imdld.com - Path (路径): 留空
- Subdomain (子域名): 输入
- 配置内网服务指向(Service):
- Type (类型): 选择
HTTP - URL (链接): 输入你内网服务的地址和端口,例如
192.168.1.20:4567(或者如果 Docker 在同一台机器上,可以写localhost:4567)。
- Type (类型): 选择
- 点击 Save hostname 保存。
🎉 享受成果!
现在,在任意地方的浏览器中输入:
https://story.imdld.com (标准的 443 端口,无需加任何端口号)
整个访问流程是这样的:
- 访客请求
https://story.imdld.com。 - 流量到达 Cloudflare 节点,Cloudflare 自动提供合法的 HTTPS 证书 并建立安全连接。
- Cloudflare 将流量打包,通过你刚才建立的隧道(Tunnel)直接发送到你 NAS 上的
cloudflared容器。 cloudflared容器将流量解包并传给内网的192.168.1.20:4567。
💡 常见问题与优势补充
-
我如果有多个服务怎么办? 超级简单!你只需要在这个 Tunnel 页面里继续点击 Add a public hostname,比如:
nas.imdld.com➡️ 指向内网localhost:8080(NAS 管理后台)movie.imdld.com➡️ 指向内网localhost:32400(Plex/Emby 媒体库) 所有的子域名都可以共享这一个 Docker 隧道容器,且全部自动支持免端口 HTTPS 访问!
-
这个方案有什么缺点吗?
- 延迟(Latency)略微增加:因为所有流量都会经过 Cloudflare 的节点进行中转,如果连接国内的 Cloudflare 节点不理想,速度可能会稍微受到影响(对于网页、API、听歌绰绰有余;如果用于大文件上传下载或 4 K 观影,速度取决于 Cloudflare 节点的带宽)。
- 大文件限制:Cloudflare 免费版对单个 HTTP 请求的文件上传大小有限制(通常为 100 MB),如果需要上传超大文件,可能需要调整客户端或者走其他通道。