如何给网站套CF和使用Cloudflare Tunnel

26 年 2 月 15 日 星期日 (已编辑)
887 字
5 分钟

传统的”公网 IP + 端口开放”模式存在安全隐患,容易被扫描和攻击。本文介绍如何通过 Cloudflare Tunnel 实现源站 IP 隐藏和零端口暴露。

Cloudflare Tunnel 是一种反向连接技术,让服务器主动向 Cloudflare 节点建立加密隧道,无需开放任何入站端口即可发布服务。

域名托管至 Cloudflare

使用 Cloudflare Tunnel 前需要先将域名托管到 Cloudflare。

托管步骤

  1. 登录 Cloudflare 控制台,添加站点并输入域名。
  2. Cloudflare 会分配两个 Nameservers(如 davis.ns.cloudflare.com)。
  3. 在域名注册商后台修改 DNS 服务器为 Cloudflare 分配的地址。
  4. 等待解析生效,直到 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),通过一条隧道统一发布。

安装客户端

bash
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

yaml
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 记录:

bash
# 为每个域名配置 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 记录,避免冲突。

启动服务

bash
sudo cloudflared service install
sudo systemctl start cloudflared
sudo systemctl enable cloudflared

SSH 连接配置

关闭 22 端口后,需要通过 Tunnel 连接 SSH。

本地配置

  1. 在本地电脑安装 cloudflared
  2. 编辑 ~/.ssh/config
text
Host ssh.example.com
    ProxyCommand cloudflared access ssh --hostname %h
  1. 直接使用 ssh root@ssh.example.com 连接,流量会通过加密隧道到达服务器。

日常维护

添加新服务

  1. 编辑 /etc/cloudflared/config.yml,在 ingress 中添加新域名和端口。
  2. 运行 cloudflared tunnel route dns <隧道ID> <新域名>
  3. 重启服务:sudo systemctl restart cloudflared

查看日志

bash
# 查看服务状态
systemctl status cloudflared

# 查看实时日志
journalctl -u cloudflared -f

常见错误:

  • Refused connection:本地服务端口未启动
  • Authentication error:Token 或证书失效

更新客户端

bash
sudo apt-get update && sudo apt-get install cloudflared
sudo systemctl restart cloudflared

防火墙配置

确认 Tunnel 正常运行后,可以关闭所有入站端口:

bash
sudo ufw deny 80/tcp
sudo ufw deny 443/tcp
sudo ufw deny 22/tcp  # 确保 Tunnel SSH 已配置

总结

通过 Cloudflare Tunnel,实现了:

  1. 源站 IP 隐藏:通过 DNS 和隧道技术完全隐藏源站 IP。
  2. 零端口暴露:关闭所有入站端口,服务器对外不可见。
  3. 统一管理:一个配置文件管理所有 HTTPS 和 SSH 服务。
对比项传统模式Cloudflare Tunnel
IP 暴露暴露隐藏
端口开放必须开放 80/443零端口
SSL 证书本地管理云端自动
内网穿透需要公网 IP原生支持

文章标题:如何给网站套CF和使用Cloudflare Tunnel

文章作者:shirtiny

文章链接:https://kizamu.anror.com/posts/cloudflare-tunnel[复制]

最后修改时间:


商业转载请联系站长获得授权,非商业转载请注明本文出处及文章链接,您可以自由地在任何媒体以任何形式复制和分发作品,也可以修改和创作,但是分发衍生作品时必须采用相同的许可协议。
本文采用CC BY-NC-SA 4.0进行许可。