使用 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.yml
tunnel: <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


SSH https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/use_cases/ssh/
常用命令集合
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> #绑定域名