传统的”公网 IP + 端口开放”模式存在安全隐患,容易被扫描和攻击。本文介绍如何通过 Cloudflare Tunnel 实现源站 IP 隐藏和零端口暴露。
Cloudflare Tunnel 是一种反向连接技术,让服务器主动向 Cloudflare 节点建立加密隧道,无需开放任何入站端口即可发布服务。
域名托管至 Cloudflare
使用 Cloudflare Tunnel 前需要先将域名托管到 Cloudflare。
托管步骤
- 登录 Cloudflare 控制台,添加站点并输入域名。
- Cloudflare 会分配两个 Nameservers(如
davis.ns.cloudflare.com)。 - 在域名注册商后台修改 DNS 服务器为 Cloudflare 分配的地址。
- 等待解析生效,直到 Cloudflare 显示”Active”状态。
托管后可以使用 Cloudflare 的 DNS 解析、免费 SSL 证书和基础 DDoS 防护。
Cloudflare Tunnel 工作原理
传统的 Cloudflare 代理需要服务器开放 80/443 端口供 Cloudflare 节点访问。Cloudflare Tunnel 则让服务器主动向 Cloudflare 建立加密隧道。
Cloudflare Tunnel 通过服务器主动建立的出站连接来转发流量,无需开放任何入站端口。这意味着可以完全关闭防火墙的入站规则,同时支持内网穿透。
主要优势
- 零入站端口:可以关闭所有入站端口(包括 80/443/22),服务器对外不可见。
- 内网穿透:无需公网 IP 即可发布服务。
- 多协议支持:支持 HTTP(S)、SSH、TCP 等多种协议。
在 Ubuntu 24 上部署 Tunnel
假设服务器上运行了多个 Docker 服务(如端口 8084、5001),通过一条隧道统一发布。
安装客户端
curl -L --output cloudflared.deb https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb && sudo dpkg -i cloudflared.deb
创建隧道并配置
执行 cloudflared tunnel login 授权后,创建隧道并编辑配置文件 /etc/cloudflared/config.yml:
tunnel: de7af4b7-xxxx-xxxx # 隧道 ID
credentials-file: /etc/cloudflared/de7af4b7-xxxx.json
ingress:
- hostname: test.example.com
service: http://localhost:8084
- hostname: test2.example.com
service: http://localhost:5001
- hostname: ssh-test.example.com
service: ssh://localhost:22
- service: http_status:404
配置 DNS 路由
为每个域名创建 DNS 记录:
# 为每个域名配置 DNS 路由
cloudflared tunnel route dns de7af4b7-xxxx-xxxx test.example.com
cloudflared tunnel route dns de7af4b7-xxxx-xxxx test2.example.com
cloudflared tunnel route dns de7af4b7-xxxx-xxxx ssh-test.example.com
注意:Tunnel 会自动创建 CNAME 记录,需要先删除 Cloudflare 控制台中的旧 A 记录,避免冲突。
启动服务
sudo cloudflared service install
sudo systemctl start cloudflared
sudo systemctl enable cloudflared
SSH 连接配置
关闭 22 端口后,需要通过 Tunnel 连接 SSH。
本地配置
- 在本地电脑安装
cloudflared。 - 编辑
~/.ssh/config:
Host ssh.example.com
ProxyCommand cloudflared access ssh --hostname %h
- 直接使用
ssh root@ssh.example.com连接,流量会通过加密隧道到达服务器。
日常维护
添加新服务
- 编辑
/etc/cloudflared/config.yml,在ingress中添加新域名和端口。 - 运行
cloudflared tunnel route dns <隧道ID> <新域名>。 - 重启服务:
sudo systemctl restart cloudflared。
查看日志
# 查看服务状态
systemctl status cloudflared
# 查看实时日志
journalctl -u cloudflared -f
常见错误:
Refused connection:本地服务端口未启动Authentication error:Token 或证书失效
更新客户端
sudo apt-get update && sudo apt-get install cloudflared
sudo systemctl restart cloudflared
防火墙配置
确认 Tunnel 正常运行后,可以关闭所有入站端口:
sudo ufw deny 80/tcp
sudo ufw deny 443/tcp
sudo ufw deny 22/tcp # 确保 Tunnel SSH 已配置
总结
通过 Cloudflare Tunnel,实现了:
- 源站 IP 隐藏:通过 DNS 和隧道技术完全隐藏源站 IP。
- 零端口暴露:关闭所有入站端口,服务器对外不可见。
- 统一管理:一个配置文件管理所有 HTTPS 和 SSH 服务。
| 对比项 | 传统模式 | Cloudflare Tunnel |
|---|---|---|
| IP 暴露 | 暴露 | 隐藏 |
| 端口开放 | 必须开放 80/443 | 零端口 |
| SSL 证书 | 本地管理 | 云端自动 |
| 内网穿透 | 需要公网 IP | 原生支持 |