开始输入,可搜索发票、服务、域名、工单,以及 更多...
把网站接入 Cloudflare 后,访客和攻击者看到的是 Cloudflare 的节点 IP,而不是你的服务器 IP。但如果真实 IP 已经泄露,或者服务器仍然接受来自任意地址的 80/443 访问,攻击者完全可以绕过 CDN 直接打源站。本文从接入、排查泄露到防火墙白名单,一步步把源站真正“藏起来”。
在 Cloudflare 控制台的 DNS 页面,将网站的 A/AAAA 记录代理状态设为“已代理”(橙色云朵)。此时用 dig +short example.com 查询,返回的应是 Cloudflare 的 IP 而不是你的服务器 IP。
在 SSL/TLS 设置中选择 Full (strict)。源站证书可以使用 Let's Encrypt,也可以在 Cloudflare 控制台生成免费的 Origin CA 证书(仅被 Cloudflare 信任,有效期可长达 15 年)。不要使用 Flexible 模式,它会让 Cloudflare 到源站之间以明文传输,还容易造成重定向循环。
接入 CDN 前域名可能已经直接解析过服务器 IP,常见泄露途径包括:
mail、ftp、dev 等子域名为灰色云朵,直接指向同一台服务器。如果确认 IP 已经泄露,仅靠 Cloudflare 无法完全解决,建议更换服务器 IP。IMIDC 用户可以通过客户中心提交工单,咨询更换 IP 或增加 IP 的方案。
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 对外提供服务。
为 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
经过 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
在另一台机器上执行,应连接失败或超时;而通过域名访问正常:
curl -m 10 -I http://你的服务器IP
curl -I https://example.com
说明 Cloudflare 无法连接源站。检查防火墙是否包含全部 Cloudflare IP 段(包括 IPv6),Nginx 是否正常运行,以及 SSL 模式与源站证书是否匹配。
免费版只代理 HTTP/HTTPS 流量,且仅限特定端口。SSH、数据库、游戏等 TCP/UDP 服务不会经过 Cloudflare,仍需依靠服务器自身的防火墙和机房级 DDoS 防护。
可以在 Cloudflare 中开启 Authenticated Origin Pulls(mTLS),源站 Nginx 只接受携带 Cloudflare 客户端证书的请求,防止他人用自己的 Cloudflare 账号把流量指向你的 IP。
先确认攻击类型和流量规模,再更换 IP 并完成上述防护配置。大流量攻击会直接打满上游带宽,此时需要服务商提供的高防方案配合处理。
隐藏源站 IP 的关键在于三点:全部流量经过 Cloudflare 代理、排查并消除历史泄露、源站防火墙只允许 Cloudflare 回源。对于非 HTTP 业务或超大流量攻击,CDN 无法单独应对,IMIDC 提供带 DDoS 防护的 VPS 与独立服务器,并支持多 IP 配置,可作为源站的底层防护。如需更换 IP 或评估防护方案,欢迎通过客户中心提交 7x24 工单。