跳到正文
全部 31 篇FREN中文
目录
第 3 部分 · 第 4 篇,共 4 篇 难度:进阶 阅读时间:15 分钟 适用平台:Linux

Cloudflare Tunnel:干净地对外暴露

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

本文目录
  1. 01改变一切的关键:隧道往外出,不往里进
  2. 02命名隧道,经久耐用的办法
  3. 03暴露出去的东西就是公开的东西
  4. 04快捷隧道,用于一场五分钟的演示
  5. 05常见问题

要点速览

Cloudflare Tunnel 让迷你 PC 上的应用以 HTTPS 方式上线到您自己的域名,无需在路由器上开放端口,也不会暴露您的 IP 地址:cloudflared 程序向 Cloudflare 发起出站连接,公网流量再顺着这条隧道回到您的机器。您需要一个由 Cloudflare 托管的域名,免费方案就够用。只用它发布面向公众的网页应用,其余的用 Cloudflare Access 保护起来,SSH、Ollama 或数据库则留在 Tailscale 上。

请先完成: Tailscale:您的私有网络保护访问安全

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

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

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

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

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

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

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

有一种快捷隧道(最后会讲到),但对于一个要长久运行的服务,我们创建一个命名隧道。它能熬过重启、保持同一份配置,并能干净地装成系统服务。下面是完整的步骤:全程命令行,配置写在一个您可以复查、可以纳入版本管理的文件里。

已完成 0 步,共 6 步 勾选记录只保存在此浏览器中。

  1. 在迷你 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
    
  2. 把 cloudflared 连到您的账号

    cloudflared tunnel login
    

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

  3. 创建命名隧道

    cloudflared tunnel create mini
    

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

  4. 写配置文件

    创建 ~/.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,用同一条隧道暴露多个应用。

  5. 配置 DNS 路由

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

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

  6. 先测试,再装成服务

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

    cloudflared tunnel run mini
    

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

    # 用 sudo 时,~ 指向 /root:所以要写出您配置文件的完整路径
    sudo cloudflared --config /home/ton-user/.cloudflared/config.yml service install
    # 启动服务并确认它在运行
    sudo systemctl start cloudflared
    systemctl status cloudflared
    

    经典的坑就在这里:用 sudo 运行却不加 --config,cloudflared 会去 root 的目录里找配置,结果什么也找不到。每次修改 config.yml 之后,执行 sudo systemctl restart cloudflared 让改动生效。

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

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

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

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

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

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

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

Cloudflare 会给您吐出一个 trycloudflare.com 的随机 URL,您可以立刻分享。非常适合在会议上给同事展示点东西。但它是临时的:每次启动 URL 都会变,停掉命令就消失。Cloudflare 也只把这种模式定位于测试和演示,不保证可用性(见其文档)。要让一个服务持续存在,请回到上面的命名隧道。

常见问题

没有域名也能用 Cloudflare Tunnel 吗?

可以,适合快速演示。运行 cloudflared tunnel --url http://localhost:8099,会得到一个随机的 trycloudflare.com 地址,可以马上分享。这个地址是临时的:每次启动都会变,命令一停就失效,而且 Cloudflare 只把这种模式用于测试和演示,不保证可用性。要长期运行的服务,就需要域名和命名隧道。

怎样把自己的域名交给 Cloudflare 管理?

在任意域名注册商购买域名,或者直接在 Cloudflare 购买;一个 .com 域名每年大约十欧元。然后把它的域名服务器(nameservers)指向 Cloudflare,这一步在其控制面板里有引导,大约十分钟就能完成。域名在 Cloudflare 上生效后,就可以创建隧道了。

隧道应该用命令行创建,还是在 Cloudflare 控制面板里创建?

两种都可以。在控制面板里,您用鼠标声明隧道及其主机名,再把一条带令牌的安装命令复制到迷你 PC 上执行,但这样配置就保存在 Cloudflare 那边。用命令行的话,配置写在您本机的 config.yml 文件里,可以随时查看,也能纳入版本管理。

一条 Cloudflare 隧道能发布多个应用吗?

可以。在 config.yml 文件的 ingress 区块里,为每个应用添加一条 hostname 条目,分别指向各自的本地端口,放在最后一行 http_status:404 之前。最后这一行是必需的:没有它,cloudflared 会拒绝启动。每个新子域名都要用 cloudflared tunnel route dns 路由一次。

cloudflared 安装成服务后,为什么找不到自己的配置?

用 sudo 运行时,cloudflared 会去 root 的目录里找配置,结果什么也找不到。所以安装时要把配置文件的完整路径告诉它:sudo cloudflared --config /home/ton-user/.cloudflared/config.yml service install。之后每次修改 config.yml,执行 sudo systemctl restart cloudflared 即可生效。

本文涉及的术语: TailscaleIP 地址Cloudflare Tunnel终端(命令行)SSHOllamaAPI

发现错误?

命令失效了,价格变了?

这些工具每个月都在变。请告诉我这篇文章哪里不对,我会改正并更新日期。

只保留页面、您的留言和选填的联系方式,别无其他。

第 18 / 31 篇 · 第 3 部分 还没有读过任何一篇 打开文章目录