開始輸入,可搜尋發票、服務、域名、工單,以及 更多...
把網站接入 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 工單。