跳到正文
minimachine.
← 学习路径
第 16 步 · 网络 进阶 · 15 分钟

☁️Cloudflare Tunnel:干净地对外暴露

用您自己的域名把一个服务放上网,走 HTTPS,不在路由器上开放任何端口。隧道是从您家里往外出, 它不往里进。


Tailscale 解决一个问题:,从您的设备出发,可以从任何地方私密地连上您的机器。用来干活完美。但有时您想要相反的:让公众能访问到您刚搭起来的一个应用。一个要给同事看的演示、一个给团队用的仪表盘、一个您想用一条链接就分享出去的页面。Tailscale 做不到这个, 它天生是私有的。

经典的做法是在路由器上开放端口。这很脆弱(您的 IP 会变、路由器重启、配置失效),而且尤其会把您家的 IP 地址暴露给全世界。馊主意。Cloudflare Tunnel 用一种更聪明的方式把这些都解决了。

改变一切的关键:隧道往外出,不往里进

这是要牢牢记住的思路。一个叫 cloudflared 的小程序跑在您的迷你 PC 上,朝 Cloudflare 打开一条朝外的连接, 就像您的浏览器朝一个网站打开连接一样。抵达 monapp.ton-domaine.com 的公网流量随后顺着这同一条隧道下行,直到您的本地应用。

具体的后果,而且都很漂亮:

  • 路由器上零端口开放。 Freebox/Livebox 那边什么都不用配。
  • 您家的 IP 保持隐藏。 全世界看到的是 Cloudflare,永远看不到您的地址。
  • 免费且自动的 HTTPS。 证书由 Cloudflare 来管。
  • 自带防 DDoS 保护,因为一切都先经过它们的网络。

命名隧道,经久耐用的办法

有一种快捷隧道(最后会讲到),但对于一个要长久运行的服务,我们创建一个命名隧道。它能熬过重启、保持同一份配置,并能干净地装成系统服务。下面是完整的步骤。

在迷你 PC 上安装 cloudflared

我们走 Cloudflare 官方的 apt 仓库,以便自动获得更新:

# 添加 Cloudflare 的 GPG 密钥
sudo mkdir -p --mode=0755 /usr/share/keyrings
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg \
  | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null
# 添加仓库
echo "deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared any main" \
  | sudo tee /etc/apt/sources.list.d/cloudflared.list
# 安装
sudo apt update && sudo apt install cloudflared

把 cloudflared 连到您的账号

cloudflared tunnel login

这会打开您的浏览器。您选择要授权的域名,Cloudflare 会在 ~/.cloudflared/ 里放一个证书。正是它证明这条隧道有权在您的域名上操作。

创建命名隧道

cloudflared tunnel create mini

这会创建一个叫 mini 的隧道,并写出一个 JSON 格式的凭据文件(类似 ~/.cloudflared/<一个很长的-id>.json)。记好显示出来的标识符:紧接着就要用到。

写配置文件

创建 ~/.cloudflared/config.yml。正是它来声明:“隧道 mini 上抵达某域名的流量,转发到某个本地服务。”

tunnel: <ton-tunnel-id>
credentials-file: /home/ton-user/.cloudflared/<ton-tunnel-id>.json

ingress:
  # monapp.ton-domaine.com → 本地 8099 端口上运行的应用
  - hostname: monapp.ton-domaine.com
    service: http://localhost:8099
  # 其余一切返回 404, 列表末尾必须有这一条
  - service: http_status:404

ingress 块自上而下读取。最后一行 http_status:404 是一个必需的兜底:没有它,cloudflared 会拒绝启动。您可以在上面添加更多 hostname,用同一条隧道暴露多个应用。

配置 DNS 路由

cloudflared tunnel route dns mini monapp.ton-domaine.com

这条命令会在 Cloudflare 那里创建 DNS 记录,让您的子域名指向隧道。每个 hostname 只需做一次。

先测试,再装成服务

手动启动隧道,确认一切都有响应:

cloudflared tunnel run mini

在浏览器里打开 https://monapp.ton-domaine.com。如果您的本地应用有响应,那就成了。用 Ctrl+C 停掉,然后把它装成服务,让它能熬过重启:

sudo cloudflared service install

暴露出去的东西就是公开的东西

把风险说清楚,因为它真实存在。一旦您路由了一个 hostname,互联网上任何人都能来敲这扇门。所以:

  • 凡是敏感的东西,前面都放上鉴权。 Cloudflare Access 能按邮箱过滤(只有您授权的账号才能通过), 对少量用户免费,能让您免于把管理后台暴露给所有人。
  • 绝不要把您的原始服务开成隧道SSHOllamaAPI(11434 端口)、数据库。这些就留在 Tailscale 上,别动。Cloudflare Tunnel 是给那些本就为公开而设计的网页应用用的。

记住的口诀:Tailscale 给您自己,Cloudflare Tunnel 给全世界。 在暴露任何东西之前,先去保护访问安全走一圈,搞清楚该锁死什么。

快捷隧道,用于一场五分钟的演示

您不需要一条永久隧道?一条命令,无需配置,无需域名:

cloudflared tunnel --url http://localhost:8099

Cloudflare 会给您吐出一个 trycloudflare.com 的随机 URL,您可以立刻分享。非常适合在会议上给同事展示点东西。但它是临时的:每次启动 URL 都会变,停掉命令就消失。要让一个服务持续存在,请回到上面的命名隧道。