只有透過 Cloudflare 代理的流量才能順利讀取網頁

獲取 Cloudflare IP 列表

在設定防火牆之前,必須先取得 Cloudflare 官方提供的 IP 位段。這包含 IPv4 與 IPv6 兩個部分。你可以直接從 Cloudflare 官網查看,或是使用 curl 指令在終端機抓取。

使用 UFW 設定步驟

UFW 是 Ubuntu 內建較簡單的防火牆工具。設定的邏輯是先拒絕所有連入 80 與 443 埠的流量,再逐一放行 Cloudflare 的 IP。

首先,確保你的 SSH 連線(通常是 22 埠)已經放行,否則你會把自己鎖在伺服器外:

Bash

sudo ufw allow 22/tcp

接著,利用迴圈將 Cloudflare 的 IP 加入允許清單:

Bash

# 允許 IPv4
for ip in $(curl -s https://www.cloudflare.com/ips-v4); do sudo ufw allow from $ip to any port 80,443 proto tcp; done

# 允許 IPv6
for ip in $(curl -s https://www.cloudflare.com/ips-v6); do sudo ufw allow from $ip to any port 80,443 proto tcp; done

最後啟用防火牆並檢查狀態:

Bash

sudo ufw enable
sudo ufw status

使用 iptables 設定方式

如果你偏好使用 iptables,原理相同,即針對特定的來源 IP 開放目的連接埠。

Bash

# 允許 IPv4
for ip in $(curl -s https://www.cloudflare.com/ips-v4); do sudo iptables -I INPUT -p tcp -s $ip --dport 80 -j ACCEPT; sudo iptables -I INPUT -p tcp -s $ip --dport 443 -j ACCEPT; done

請注意,iptables 的設定在重啟後會失效,建議安裝 iptables-persistent 來儲存規則。

自動化更新腳本

Cloudflare 的 IP 偶爾會變動。為了避免失效,建議將上述指令寫成一個 shell 腳本,並利用 crontab 設定每週執行一次。這樣當 Cloudflare 增加新機房時,你的防火牆規則也會自動同步,確保網站服務不會中斷。


如何設定 crontab 來定期自動執行這些指令?

建立自動化更新腳本

為了確保防火牆規則永遠跟隨 Cloudflare 的最新 IP 清單,我們可以寫一個簡單的腳本。請在你的家目錄建立一個檔案,例如叫 update_cf_ips.sh。

Bash

#!/bin/bash

# 先刪除現有的 Cloudflare UFW 規則(可選,或直接覆蓋)
# 這裡建議直接執行允許指令,UFW 會自動處理重複的規則

# 下載最新的 IPv4 並加入 UFW
for ip in $(curl -s https://www.cloudflare.com/ips-v4); do
    sudo ufw allow from $ip to any port 80,443 proto tcp
done

# 下載最新的 IPv6 並加入 UFW
for ip in $(curl -s https://www.cloudflare.com/ips-v6); do
    sudo ufw allow from $ip to any port 80,443 proto tcp
done

# 重新載入防火牆
sudo ufw reload

儲存後,記得給予執行權限:

Bash

chmod +x update_cf_ips.sh

設定 Crontab 定期執行

接著我們使用 crontab 讓系統每週一凌晨三點自動執行這個腳本。

輸入以下指令進入編輯介面:

Bash

sudo crontab -e

在檔案最後面加入這行(請將路徑替換成你實際存放腳本的位置):

Plaintext

0 3 * * 1 /home/youruser/update_cf_ips.sh > /dev/null 2>&1

驗證規則是否生效

設定完成後,你可以從外部直接輸入你的伺服器 IP(而非網域名稱)來測試。如果防火牆運作正常,瀏覽器應該會顯示連線逾時,因為你的個人電腦 IP 不在 Cloudflare 的允許清單內。只有透過 Cloudflare 代理的流量才能順利讀取網頁。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *