简单来说,Cloudflare Tunnel 是一个可以让你安全地将本地服务(例如网站、API、甚至整个网段等)暴露到公共互联网上的工具,而无需在服务器或路由器上开放任何入站端口。
工作原理
它的工作原理是:
- 在服务器上(比如一台家用电脑、小主机、或云服务器)运行一个名为 cloudflared 的轻量程序。
- cloudflared 会主动向 Cloudflare 在全球的数据中心建立一个持久的、仅出站的加密连接(隧道)。
- 当有用户访问在 Cloudflare 上设置的域名时,请求会先到达 Cloudflare 的网络。
- Cloudflare 会通过已经建立好的安全隧道,将这个请求转发给本地服务器上运行的 cloudflared 程序。
- cloudflared 再将请求转发给本地的实际服务(例如运行在 localhost:8000 的一个网站)。
- 服务的响应再沿着原路通过隧道返回给 Cloudflare,最终送达用户。
主要优势
- 安全:这是最大的优点。因为不需要在防火墙上打开任何端口,可以隐藏源站IP,黑客无法直接扫描或攻击你的服务器,所有的流量都必须先经过 Cloudflare 的安全防护。
- 无需公网IP:即使你的服务器在一个没有公网IP的内网环境中(例如家庭网络),也可以通过 Cloudflare Tunnel 让外界访问你的服务。
- 简化部署:不需要复杂的端口转发或防火墙配置,只需运行 cloudflared 并进行简单的设置即可。
前置条件
- 一个托管在 Cloudflare 上的域名。
- 开通 Cloudflare 的 Zero Trust 计划。
部署步骤
二进制安装(amd64 示例)
一、下载并安装 cloudflared
# 创建配置目录 |
安装完后验证是否安装成功
$ cloudflared version |
二、授权 cloudflared
首先,你需要让本地的 cloudflared 程序关联到你的 Cloudflare 账户。
cloudflared tunnel login |
运行这个命令后,它会生成一个 URL。在浏览器中打开,然后选择你想要授权的域名。授权成功后,cloudflared 会在你的用户目录下创建一个证书文件 (cert.pem),后续操作都需要它。
三、创建隧道
# 将 <TUNNEL_NAME> 替换为你自己想取的名字,例如 my-first-tunnel |
执行成功后,它会返回一个隧道的 UUID,并为你创建一个 JSON 格式的凭证文件。
这个凭证文件默认会保存在 ~/.cloudflared/
目录下。
四、创建配置文件
现在需要告诉隧道具体要代理哪个本地服务。这通过一个 YAML 配置文件来完成。
一般把配置文件放在 /etc/cloudflared/
目录下
sudo nano /etc/cloudflared/config.yml |
将以下内容粘贴到文件中
# 隧道的 UUID,从上一步的输出中复制 |
五、创建 DNS 记录
修改Cloudflare 的 DNS,将你一步配置的域名指向这个 Tunnel。
# 将 <TUNNEL_NAME> 替换为前几步创建的隧道名称 |
或者也可以手动前往 Cloudflare 仪表盘,在 DNS 设置中添加一个 CNAME 记录。
六、安装为系统服务
# 这个命令会自动读取 /etc/cloudflared/config.yml 作为配置文件 |
然后,启动服务:
sudo systemctl start cloudflared |
检查服务状态来确保它正在正常运行:
sudo systemctl status cloudflared |
如果一切正常,你的隧道现在就已经在后台持久运行了!
除了上面那种连接应用程序(单个 HTTP/TCP 服务)以外,还有一种连接私有网络的方式,为授权用户提供对整个 IP 网段的访问权限,替代传统 VPN,且服务不暴露于公网。不过我目前没有这方面的需求,就不展开讲了。