← 返回博客

Tailscale Funnel:零成本让内网服务有公网 HTTPS

2026-05-19 · 约 7 分钟

我的腾讯云服务器没有固定公网 IP?假的,有。但 443 端口只给 Nginx 用了,剩下的服务——微信公众号 webhook、OpenClaw 控制面板——也想暴露到公网,怎么办?

传统方案:买域名 → 配 SSL 证书 → 改 Nginx → 开防火墙端口。每一步都有坑,加起来够写一篇踩坑录了。

但我最后选了一条完全不同的路:Tailscale Funnel。零配置 SSL、零端口暴露、一行命令上线。这篇文章拆解整个方案。

先看结果:哪些服务在用 Funnel

服务内网地址公网地址用途
微信公众号 Webhook127.0.0.1:3080funnel.ts.net/wechat粉丝消息 AI 回复
OpenClaw 控制面板127.0.0.1:12078funnel.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 自己的子域名——这是它的独特优势。

💡 选 Tailscale 的理由:不需要你有自己的域名,不需要改 DNS,不需要开任何云防火墙端口。内网服务跑在 localhost,外面的人通过 Tailscale 中继访问,中间是 WireGuard 加密隧道。

实操: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 的那些服务(端口冲突、需要独立域名等场景)。

💡 双轨制:备案域名的 HTTPS 走 Nginx + Let's Encrypt,非备案域名的服务走 Tailscale Funnel。两套 TLS 终结方式在同一个服务器上和平共处。

踩过的坑

坑 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 是内网穿透最省心的方案。

总结

Tailscale Funnel 的核心价值就一句话:不买域名、不配证书、不开端口,也能让内网服务有公网 HTTPS。

我用了两个月,微信公众号的 AI 回复通道和 OpenClaw 的远程管理面板都跑在上面,零事故。

如果你的服务和我的类似——低流量、非关键路径、不想折腾网络配置——Funnel 够用并且免费。

⚡ 一句话:先用 Funnel 跑起来,等流量大到需要优化的时候,再考虑买域名配 CDN。但大概率你等不到那天——因为 Funnel 就是够用。

🛠️ 需要类似系统?

AI系统集成 · 自动化管线开发 · 全栈定制——咨询免费,能做就做。

💬 微信:星尘和光文化传媒 | 🌐 官网 →

公众号二维码

📱 关注公众号「星尘和光文化传媒」

每周推送 AI 实战技术文章、全栈开发案例和自动化管线拆解。
不写广告,只写踩坑录。

标签:Tailscale · 内网穿透 · Funnel · HTTPS · 零成本 · 运维