ESC

开始输入,可搜索发票、服务、域名、工单,以及 更多...

搜索... Ctrl+K
网络与 IP

Cloudflare隐藏源站IP教程:防火墙只允许CF回源

6 个步骤 11 分钟阅读 22 次阅读 0
本文目录

把网站接入 Cloudflare 后,访客和攻击者看到的是 Cloudflare 的节点 IP,而不是你的服务器 IP。但如果真实 IP 已经泄露,或者服务器仍然接受来自任意地址的 80/443 访问,攻击者完全可以绕过 CDN 直接打源站。本文从接入、排查泄露到防火墙白名单,一步步把源站真正“藏起来”。

要点速览

  • Cloudflare 代理只隐藏解析出来的 IP,如果源站仍对任意地址开放 80/443 端口,攻击者可以绕过 CDN 直接攻击源站。
  • 源站真实 IP 常见的泄露途径包括 DNS 历史记录、未代理的子域名、邮件服务、IP 直连时返回的 SSL 证书以及程序主动外连。
  • 防止绕过 Cloudflare 的关键是让源站防火墙只允许 Cloudflare 官方 IP 段访问 80/443 端口。
  • Cloudflare 免费版只代理 HTTP/HTTPS 流量,SSH、数据库、游戏等 TCP/UDP 服务仍需依靠服务器自身防火墙和机房级 DDoS 防护。
  • IMIDC 提供带 DDoS 防护的 VPS 与独立服务器并支持多 IP 配置,用户可通过客户中心工单咨询更换 IP。

适用环境 / 准备工作

  • 网站域名已托管到 Cloudflare(已将域名 NS 修改为 Cloudflare 分配的名称服务器)
  • 服务器系统:Ubuntu 22.04 / 24.04、Debian 12、Rocky Linux 9、AlmaLinux 9,Web 服务使用 Nginx
  • 已通过 SSH 登录并具备 sudo 权限
  • 务必先确认 SSH 端口已在防火墙中放行,避免修改规则后把自己锁在外面;建议同时打开服务商提供的 VNC/控制台作为备用登录方式

操作步骤

步骤 1:开启 Cloudflare 代理

在 Cloudflare 控制台的 DNS 页面,将网站的 A/AAAA 记录代理状态设为“已代理”(橙色云朵)。此时用 dig +short example.com 查询,返回的应是 Cloudflare 的 IP 而不是你的服务器 IP。

步骤 2:配置 SSL 模式为 Full (strict)

在 SSL/TLS 设置中选择 Full (strict)。源站证书可以使用 Let's Encrypt,也可以在 Cloudflare 控制台生成免费的 Origin CA 证书(仅被 Cloudflare 信任,有效期可长达 15 年)。不要使用 Flexible 模式,它会让 Cloudflare 到源站之间以明文传输,还容易造成重定向循环。

步骤 3:排查真实 IP 泄露途径

接入 CDN 前域名可能已经直接解析过服务器 IP,常见泄露途径包括:

  • DNS 历史记录:公开的 DNS 历史查询网站会保存过去的解析记录。
  • 未代理的子域名:如 mail、ftp、dev 等子域名为灰色云朵,直接指向同一台服务器。
  • 邮件服务:MX 记录指向本机,或网站发出的邮件头中包含服务器 IP。
  • SSL 证书与默认站点:直接用 IP 访问 443 端口时返回了含有你域名的证书,会被全网扫描引擎收录。
  • 程序主动外连:网站的 Webhook、远程图片抓取、pingback 等功能会向外暴露源站 IP。

如果确认 IP 已经泄露,仅靠 Cloudflare 无法完全解决,建议更换服务器 IP。IMIDC 用户可以通过客户中心提交工单,咨询更换 IP 或增加 IP 的方案。

步骤 4:防火墙只允许 Cloudflare IP 访问 80/443

Cloudflare 的 IP 段官方发布在 https://www.cloudflare.com/ips-v4 和 https://www.cloudflare.com/ips-v6,下面的命令会直接读取最新列表。

Ubuntu / Debian(UFW):

sudo ufw allow OpenSSH        # 若改过 SSH 端口,改为 sudo ufw allow 端口号/tcp

for ip in $(curl -fsS https://www.cloudflare.com/ips-v4) $(curl -fsS https://www.cloudflare.com/ips-v6); do
  sudo ufw allow proto tcp from "$ip" to any port 80,443 comment 'Cloudflare'
done

# 删除之前对所有来源开放 80/443 的规则(按实际存在的规则删除)
sudo ufw delete allow 'Nginx Full'
sudo ufw delete allow 80/tcp
sudo ufw delete allow 443/tcp

sudo ufw enable
sudo ufw status numbered

删除规则时提示 “Could not delete non-existent rule” 可以忽略。

Rocky / Alma 9(firewalld + ipset):

sudo firewall-cmd --permanent --new-ipset=cf4 --type=hash:net
sudo firewall-cmd --permanent --new-ipset=cf6 --type=hash:net --option=family=inet6

for ip in $(curl -fsS https://www.cloudflare.com/ips-v4); do
  sudo firewall-cmd --permanent --ipset=cf4 --add-entry="$ip"
done
for ip in $(curl -fsS https://www.cloudflare.com/ips-v6); do
  sudo firewall-cmd --permanent --ipset=cf6 --add-entry="$ip"
done

for svc in http https; do
  sudo firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source ipset=cf4 service name=$svc accept"
  sudo firewall-cmd --permanent --add-rich-rule="rule family=ipv6 source ipset=cf6 service name=$svc accept"
done

# 移除对所有来源开放的 http/https 服务
sudo firewall-cmd --permanent --remove-service=http --remove-service=https
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

Cloudflare 的 IP 段偶尔会更新,建议每隔几个月对照官方列表检查一次。

注意:使用 Docker 发布的端口会绕过 UFW 规则。如果网站跑在 Docker 中,请把容器端口绑定到 127.0.0.1,由宿主机 Nginx 对外提供服务。

步骤 5:拒绝直接用 IP 访问的请求

为 Nginx 添加默认站点,直接访问 IP 或未知域名时断开连接,避免证书暴露域名:

sudo tee /etc/nginx/conf.d/00-default.conf > /dev/null <<'EOF'
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    return 444;
}
server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;
    server_name _;
    ssl_reject_handshake on;
}
EOF

ssl_reject_handshake 需要 Nginx 1.19.4 及以上,Ubuntu 24.04、Debian 12 和 Rocky/Alma 9 自带版本均满足;Ubuntu 22.04 自带的 1.18 不支持,可改用 nginx.org 官方源升级。Ubuntu/Debian 还需删除自带的默认站点,避免 default_server 冲突:

sudo rm -f /etc/nginx/sites-enabled/default

步骤 6:让 Nginx 记录访客真实 IP

经过 Cloudflare 后,Nginx 日志中的来源 IP 会变成 Cloudflare 节点。用 realip 模块还原:

{
  for ip in $(curl -fsS https://www.cloudflare.com/ips-v4) $(curl -fsS https://www.cloudflare.com/ips-v6); do
    echo "set_real_ip_from $ip;"
  done
  echo "real_ip_header CF-Connecting-IP;"
} | sudo tee /etc/nginx/conf.d/cloudflare-realip.conf > /dev/null

sudo nginx -t && sudo systemctl reload nginx

步骤 7:验证效果

在另一台机器上执行,应连接失败或超时;而通过域名访问正常:

curl -m 10 -I http://你的服务器IP
curl -I https://example.com

常见问题 FAQ

配置后网站打不开,显示 Cloudflare 521/522 错误?

说明 Cloudflare 无法连接源站。检查防火墙是否包含全部 Cloudflare IP 段(包括 IPv6),Nginx 是否正常运行,以及 SSL 模式与源站证书是否匹配。

Cloudflare 能保护 SSH、游戏端口等非网站服务吗?

免费版只代理 HTTP/HTTPS 流量,且仅限特定端口。SSH、数据库、游戏等 TCP/UDP 服务不会经过 Cloudflare,仍需依靠服务器自身的防火墙和机房级 DDoS 防护。

有比 IP 白名单更严格的回源校验吗?

可以在 Cloudflare 中开启 Authenticated Origin Pulls(mTLS),源站 Nginx 只接受携带 Cloudflare 客户端证书的请求,防止他人用自己的 Cloudflare 账号把流量指向你的 IP。

源站 IP 已经被攻击了怎么办?

先确认攻击类型和流量规模,再更换 IP 并完成上述防护配置。大流量攻击会直接打满上游带宽,此时需要服务商提供的高防方案配合处理。

总结

隐藏源站 IP 的关键在于三点:全部流量经过 Cloudflare 代理、排查并消除历史泄露、源站防火墙只允许 Cloudflare 回源。对于非 HTTP 业务或超大流量攻击,CDN 无法单独应对,IMIDC 提供带 DDoS 防护的 VPS 与独立服务器,并支持多 IP 配置,可作为源站的底层防护。如需更换 IP 或评估防护方案,欢迎通过客户中心提交 7x24 工单。

相关产品

相关阅读

这篇文章有帮助吗?

相关教程