ESC

開始輸入,可搜尋發票、服務、域名、工單,以及 更多...

搜尋... Ctrl+K
網路與 IP

Cloudflare隱藏源站IP教程:防火牆只允許CF回源

6 個步驟 11 分鐘閱讀 26 次閱讀 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 工單。

相關產品

相關閱讀

這篇文章有幫助嗎?

相關教程