使用 Cloudflare Tunnel 暴露内部服务
✨ Cloudflare Tunnel 是一种免费的内网穿透工具,可以将内部服务暴露到公网上。它通过创建加密通道,在无需公网 IP 和开放端口的情况下,让服务可以公网访问。你可以使用 cloudflared 命令行工具来管理和配置 tunnel。安装并登录授权后,可以通过命令快速创建 tunnel 连接。然后,你需要添加域名 CNAME 记录,并创建 config 配置文件来指定服务映射。验证和测试配置后,你可以运行 tunnel 并将其配置为系统服务。最后,通过一系列命令,你可以管理和控制 tunnel 的运行。
Cloudflare Tunnel 是Cloudflare Zero Trust 中的一个产品,基于此产品可以在你的服务器与Cloudflare的边缘节点间开启一条加密通道,从而在无需公网IP,无需开放服务器端口的情况下将响应的服务实现公网可访问,关键这一切还都是免费的!


配置操作
服务器上是通过cloudflared 的命令行工具来管理tunnel的。可以在页面上手动创建tunnel,并根据相应提示在服务器上执行对应的操作安装并建立连接。

当然也可以通过其他包管理工具来进行安装,具体可参考官方文档:
https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/get-started/安装 cloudflared / 登录授权
# 安装 Debian 为例
wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb && sudo dpkg -i cloudflared-linux-amd64.deb
# 登录 授权
cloudflared tunnel login此时终端会显示URL,在浏览器中打开会提示您登录 Cloudflare 账户。登录后,选择您的主机名。 此外还会在默认的 cloudflared 目录(~/.cloudflared)中生成账户证书—— cert.pem 文件。

完成登录授权后,作为开发者可利用如下命令快速创建 tunnel 连接:
# 执行此命令会生成 https://xxx.trycloudflare.com 的网址访问你设定的目标资源
cloudflared tunnel --url http://localhost:8080创建 tunnel
# 创建完成后,会显示出 tunnel 的 UUID,记录下来,<UUID>.cfargotunnel.com
cloudflared tunnel create <tunnel-name>
添加域名CNAME记录
cloudflared tunnel route dns <tunnel-name> <your-domain-name>
# 例
cloudflared tunnel route dns test test.example.com如有多个其他域名需要绑定,需要在Dashboard网页中添加DNS记录,类型为CNAME,记录值为<UUID>.cfargotunnel.com,UUID 为前面创建tunnel中获取的。
创建 config 配置文件
vim ~/.cloudflared/config.ymltunnel: <UUID>
credentials-file: /home/<user>/.cloudflared/<UUID>.json
ingress:
# 网站,映射到本地 80 端口
- hostname: test.example.com
service: http://localhost:80
# 反代 SSH
- hostname: ssh.example.com
service: ssh://localhost:22
# 兜底规则
- service: http_status:404# 校验 config 文件
cloudflared tunnel ingress validate
# 测试规则是否命中
cloudflared tunnel ingress rule https://test.example.com
# 测试运行
cloudflared --loglevel debug --transport-loglevel warn --config ~/.cloudflared/config.yml tunnel run <UUID>如 cloudflared 已为 service 形式运行,须将此配置文件复制至默认配置文件夹位置
sudo cp ~/.cloudflared/config.yml /etc/cloudflared/config.yml
systemctl restart cloudflared若没有则先为其创建系统服务,再执行上面👆的操作。
cloudflared service install
systemctl start cloudflared
systemctl enable cloudflared
systemctl status cloudflared常用命令集合
cloudflared tunnel create <tunel-name> #创建
cloudflared tunnel list #查看列表
cloudflared tunnel delete <tunnel-name> #删除
cloudflared tunnel run --url <local-source> <tunnel-name or UUID> #启动
cloudflared tunnel route dns <UUID or tunnel-name> <your-domain-name> #绑定域名