Cloudflare Tunnel 老是掉线?用 Tailscale Funnel 零成本替代,绑定自定义域名
绿联 NAS Docker 部署 · 扔掉 CF Tunnel · 一行命令公网访问 · 支持自定义域名 · 免费 HTTPS
Cloudflare Tunnel 老是掉线?用 Tailscale Funnel 零成本替代,绑定自定义域名
绿联 NAS Docker 部署 · 扔掉 CF Tunnel · 一行命令公网访问 · 支持自定义域名 · 免费 HTTPS
背景
我之前用绿联 NAS 的 Docker 部署了 Cloudflare Tunnel,把家里的服务通过自己的域名暴露到公网。但 CF Tunnel 在国内环境下频繁掉线——QUIC 协议被运营商掐、NAT 超时回收、Docker 容器动不动就断连。日志里全是:
WRN Failed to dial a quic connection error="timeout: no recent network activity"
ERR Connection terminated
折腾了好几轮 --protocol http2、restart: always、健康检查……治标不治本。
后来发现 Tailscale Funnel 才是正解。它直接复用你已经跑通的 Tailscale 网络底座,一行命令把服务暴露到公网,自带 HTTPS 和自定义域名绑定,彻底甩掉 CF Tunnel 这个不稳定因素。
这篇教程完整记录从迁移到上线的每一步。
前置条件
- 绿联 NAS 已部署 Tailscale(Docker 或套件版均可)
- Tailscale 已登录,设备在线
- 有一个自己的域名,DNS 托管在任意服务商
- NAS 上的服务正常运行(假设跑在
8080端口)
第一步:确认 Tailscale 正常工作
SSH 登录 NAS,检查 Tailscale 状态:
tailscale status
应该能看到你的 NAS 设备在线,记住它的 Tailscale IP(形如 100.x.x.x)。
如果是 Docker 部署的 Tailscale:
docker exec tailscale tailscale status
第二步:启用 HTTPS 证书
Funnel 需要 TLS 证书。Tailscale 可以自动签发 Let's Encrypt 证书:
tailscale cert --cert-file /tmp/ts-cert.pem --key-file /tmp/ts-key.pem
如果是 Docker 部署:
docker exec tailscale tailscale cert \
--cert-file /tmp/ts-cert.pem \
--key-file /tmp/ts-key.pem
这一步 Tailscale 会自动完成域名验证,无需手动操作 DNS。
第三步:开启 Tailscale Funnel
假设你的服务跑在 NAS 的 8080 端口,一行命令暴露:
# 先开启 serve(HTTPS 反向代理)
tailscale serve --bg --https=443 8080
# 再开启 funnel(公网访问)
tailscale funnel 8080 on
Docker 环境:
docker exec tailscale tailscale serve --bg --https=443 8080
docker exec tailscale tailscale funnel 8080 on
现在已经可以通过 https://你的NAS主机名.tailnet名称.ts.net 从公网访问了。
第四步:绑定自定义域名
Funnel 默认用的是 Tailscale 的 ts.net 域名,但你可以绑定自己的域名(例如 sub.example.com):
4.1 在 Tailscale Admin Console 添加域名
- 打开 https://login.tailscale.com/admin/dns
- 点击 HTTPS Certificates 标签
- 点击 Add a custom domain
- 输入你的域名,例如
sub.example.com - 页面会显示一组 TXT 验证记录
4.2 在域名 DNS 服务商添加 TXT 记录
去你的域名 DNS 管理后台(如 Cloudflare、阿里云 DNS、DNSPod),添加两条记录:
| 类型 | 主机记录 | 记录值 |
|---|---|---|
| TXT | _acme-challenge.sub |
Tailscale 提供的验证值 |
| TXT | _acme-challenge.sub |
第二条验证值(如果有) |
4.3 等待验证
回到 Tailscale Admin Console,点击 Verify。通常几分钟内生效。验证通过后,证书会自动签发。
4.4 配置 Funnel 使用自定义域名
验证通过后,指定域名重新启用 Funnel:
# 先关闭之前的 funnel
tailscale funnel 8080 off
# 用自定义域名重新开启
tailscale serve --bg --https=443 --set-path / 8080
tailscale funnel --bg --set-path / 8080 on
Docker 环境:
docker exec tailscale tailscale funnel 8080 off
docker exec tailscale tailscale serve --bg --https=443 --set-path / 8080
docker exec tailscale tailscale funnel --bg --set-path / 8080 on
第五步:DNS 解析到 Tailscale IP(关键)
到你的域名 DNS 管理后台,添加一条 A 记录:
| 类型 | 主机记录 | 记录值 |
|---|---|---|
| A | sub |
你的 NAS 的 Tailscale IP(100.x.x.x) |
⚠️ 注意:这一步是把域名指向 Tailscale IP,不是指向公网 IP。只有加入你 Tailnet 的设备能通过域名访问。如果需要完全公网访问,直接用 Funnel 自带的
ts.net域名即可,不需要这一步。
第六步:验证
# 在任意设备上测试
curl -I https://sub.example.com
# 或用浏览器直接打开
# https://sub.example.com
看到 HTTP/2 200 就是成功了。
停掉旧的 Cloudflare Tunnel
既然 Tailscale Funnel 已经跑通了,可以停掉 CF Tunnel 容器:
docker stop cloudflared
docker rm cloudflared
不再需要维护这个不稳定的隧道了。
Docker Compose 长期运行配置
如果你想让 Funnel 在 Docker 里持久化运行,在当前运行 Tailscale 的容器里,serve 和 funnel 命令加了 --bg 就会后台常驻。Tailscale 容器本身已经设了 restart: always,重启 NAS 后 Funnel 也会自动恢复。
不需要额外容器。
常见问题
Q: Funnel 跑起来后,从外网访问很慢?
Funnel 走 Tailscale 的 DERP 中继节点,速度取决于中继节点的位置。国内访问一般可以接受,但如果你的服务是流媒体/大文件传输,Funnel 不适合(Tailscale ToS 也禁止)。
Q: 自定义域名只能 Tailnet 内访问?
对。如果你把域名 A 记录指向 Tailscale IP(100.x.x.x),只有加入你 Tailnet 的设备能解析和访问。如果需要完全公网访问,直接用 Funnel 分配的 ts.net 域名,自动对全网开放。
Q: 和 Cloudflare Tunnel 比,少了什么?
Funnel 没有 CDN 缓存、没有 WAF、没有 DDoS 防护。但换来的是稳定不掉线。对于个人 NAS 服务来说,稳定比这些附加功能重要得多。
Q: 免费版有流量限制吗?
Tailscale 免费版 Funnel 没有明确的流量硬限制,但 ToS 禁止跑流媒体和大量文件传输。个人 Web 服务、Dashboard、API 完全够用。
总结
| 对比 | Cloudflare Tunnel | Tailscale Funnel |
|---|---|---|
| 稳定性 | 国内频繁掉线 | 极其稳定 |
| 配置量 | Docker + Token + 配置 | 一行命令 |
| HTTPS | 自动 | 自动 |
| 自定义域名 | ✅ | ✅ |
| 费用 | 免费 | 免费 |
| 额外依赖 | 依赖 CF 网络 | 复用 Tailscale |
CF Tunnel 在国内就是一个大坑,Tailscale Funnel 才是 NAS 玩家正确的公网暴露方式。
本文基于绿联 NAS + Docker + Tailscale v1.80+ 撰写,功能以官方最新版本为准。
发表评论