Tailscale Funnel:零成本让内网服务有公网 HTTPS
我的腾讯云服务器没有固定公网 IP?假的,有。但 443 端口只给 Nginx 用了,剩下的服务——微信公众号 webhook、OpenClaw 控制面板——也想暴露到公网,怎么办?
传统方案:买域名 → 配 SSL 证书 → 改 Nginx → 开防火墙端口。每一步都有坑,加起来够写一篇踩坑录了。
但我最后选了一条完全不同的路:Tailscale Funnel。零配置 SSL、零端口暴露、一行命令上线。这篇文章拆解整个方案。
先看结果:哪些服务在用 Funnel
| 服务 | 内网地址 | 公网地址 | 用途 |
|---|---|---|---|
| 微信公众号 Webhook | 127.0.0.1:3080 | funnel.ts.net/wechat | 粉丝消息 AI 回复 |
| OpenClaw 控制面板 | 127.0.0.1:12078 | funnel.ts.net/6cgxl7/ | 远程管理 AI Agent |
这两条通道已经在生产环境跑了两个月,服务过真实用户请求。关键是——从配置到上线,耗时不超过 5 分钟。
Tailscale Funnel 是什么
Tailscale 是一个基于 WireGuard 的组网工具。它让不同设备组成一个虚拟局域网,你可以在家访问公司电脑,在手机上访问服务器。
Funnel 是 Tailscale 的一个附加功能:它把你虚拟局域网里的某个端口,通过 Tailscale 的中继服务器 暴露到公网,并且自动配上 HTTPS 证书。
关键区别:
| 方式 | 公网 IP | 开放端口 | SSL 证书 | 成本 |
|---|---|---|---|---|
| 传统方案 | 需要 | 手动开放 | 手动配置 Let's Encrypt | 域名+时间 |
| Tailscale Funnel | 不需要 | 不需要 | 自动(Tailscale 证书) | 零 |
| Cloudflare Tunnel | 不需要 | 不需要 | 自动 | 零 |
Cloudflare Tunnel 也能做类似的事,但它要求域名 DNS 托管在 Cloudflare。我的域名 jingxuanyoupin.icu 的备案走的是国内流程,换 DNS 有风险。Tailscale Funnel 不碰域名,直接用 Tailscale 自己的子域名——这是它的独特优势。
实操:3 步让内网服务公网可访问
Step 1:安装并登录 Tailscale
# Ubuntu/Debian
curl -fsSL https://tailscale.com/install.sh | sh
# 登录(会打开浏览器或给链接)
tailscale up
装好后,你的机器就加入了一个虚拟局域网,得到一个 100.x.x.x 的内网 IP。这台机器的所有本地端口,现在对整个 Tailscale 网络可见——但还不对公网可见。
Step 2:启用 HTTPS 证书
Tailscale 会自动为你的节点生成 Let's Encrypt 证书:
tailscale cert --cert-file cert.pem --key-file key.pem your-node.tailxxxx.ts.net
实际上 Funnel 模式下不需要手动执行这一句——Funnel 自带证书。但如果你要自己配 Nginx 终结 TLS,这条路也在。
Step 3:一行命令打开 Funnel
# 让公网能访问本机的 80 端口
tailscale funnel 80
# 或者:只暴露特定路径到特定端口
tailscale serve --set-path /wechat http://127.0.0.1:3080
tailscale funnel on
完成。你的服务现在可以通过 https://your-node.tailxxxx.ts.net/wechat 从任何地方访问,有 HTTPS,有证书,不需要任何额外配置。
实战:配合 Nginx 做路径分发
Funnel 只能暴露一个入口端口。如果你的服务器上有多个服务,需要让 Nginx 做路径分发的反向代理。
我的架构是这样的:
公网请求 → Tailscale Funnel (:443)
│
▼
Nginx (:80)
│
├─ /wechat → 127.0.0.1:3080 (微信公众号桥接)
├─ /6cgxl7/ → 127.0.0.1:12078 (OpenClaw 面板)
└─ / → 返回 301 跳转官网 HTTPS
Nginx 配置核心片段:
server {
listen 80;
server_name _;
location /wechat {
proxy_pass http://127.0.0.1:3080;
}
location /6cgxl7/ {
proxy_pass http://127.0.0.1:12078;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location / {
return 301 https://jingxuanyoupin.icu$request_uri;
}
}
注意 /6cgxl7/ 的 WebSocket 代理——OpenClaw 控制面板需要 WebSocket,必须加上 Upgrade 头。忘了这个坑,面板会一直转圈。
微信公众号 Webhook 的特殊处理
微信公众号要求回调 URL 必须是 80 端口或 443 端口,且必须是 备案域名。
Funnel 给的 URL 是 Tailscale 的子域名,未备案。所以我不能直接用 Funnel URL 去微信公众平台配置。解决方式:
微信服务器 → jingxuanyoupin.icu/wechat (:443)
│
▼
Nginx (:443, SSL 证书来自 Let's Encrypt)
│
▼
127.0.0.1:3080 (微信公众号桥接)
域名本身的 443 端口走 Let's Encrypt 独立证书,不经过 Funnel。Funnel 只负责 不方便走域名 443 的那些服务(端口冲突、需要独立域名等场景)。
踩过的坑
坑 1:Funnel 和 Nginx 的端口冲突
如果你的 Nginx 已经监听了 443 端口,Funnel 再去抢会失败。Tailscale 会自动用 IPv6 地址绑定 443([fd7a:115c:a1e0::...]:443),不会抢 IPv4 的 443——但如果你有双栈监听,需要手动调整。
坑 2:Funnel 的带宽限制
Tailscale Funnel 免费版有速率限制(具体数值官方没公开)。公众号 Webhook 的请求量不大,完全够用。但如果要当 CDN 用——别,这不是它的设计目标。
坑 3:中继延迟
Funnel 走 Tailscale 的 DERP 中继服务器。国内到 Tailscale 的中继节点延迟约 20-50ms,稳定但不快。对实时性要求极高的应用慎用。
什么时候不用 Funnel
- 高流量服务:Funnel 有未公开的速率限制,大流量会被削
- 需要自定义域名:Funnel 只能用 Tailscale 的子域名,没法绑你自己的域名
- 需要 CDN:Funnel 是点对点中继,不是 CDN,没有边缘缓存
- 合规要求:某些行业要求数据不出境——Tailscale 的中继节点可能在美国
除了这些场景,Funnel 是内网穿透最省心的方案。
总结
Tailscale Funnel 的核心价值就一句话:不买域名、不配证书、不开端口,也能让内网服务有公网 HTTPS。
我用了两个月,微信公众号的 AI 回复通道和 OpenClaw 的远程管理面板都跑在上面,零事故。
如果你的服务和我的类似——低流量、非关键路径、不想折腾网络配置——Funnel 够用并且免费。
⚡ 一句话:先用 Funnel 跑起来,等流量大到需要优化的时候,再考虑买域名配 CDN。但大概率你等不到那天——因为 Funnel 就是够用。
📱 关注公众号「星尘和光文化传媒」
每周推送 AI 实战技术文章、全栈开发案例和自动化管线拆解。
不写广告,只写踩坑录。
标签:Tailscale · 内网穿透 · Funnel · HTTPS · 零成本 · 运维