追梦学习库

Cloudflare Tunnel 老是掉线?用 Tailscale Funnel 零成本替代,绑定自定义域名

追梦君 3 阅读
文章摘要

绿联 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 http2restart: 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 添加域名

  1. 打开 https://login.tailscale.com/admin/dns
  2. 点击 HTTPS Certificates 标签
  3. 点击 Add a custom domain
  4. 输入你的域名,例如 sub.example.com
  5. 页面会显示一组 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 的容器里,servefunnel 命令加了 --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+ 撰写,功能以官方最新版本为准。

分享到:

发表评论

请先 登录 再评论