如果您的網站有開啟 Cloudflare 的 CDN (Content Delivery Network) 服務,您可能會發現,在 Nginx 的 log 檔案之中所記錄的 IP 位址全都來自 Cloudflare。這是因為 Cloudflare 利用「反向代理」(Reverse Proxy) 來提供 CDN 與 DoS/DDoS 防範服務。

當我們今天要使用 fail2ban 等方式防止惡意攻擊時,由於其原理是監控 log 檔,故記錄檔中的 IP 一定要正確,別讓 Cloudflare 成為代罪羔羊哦!

首先,我們建立一個 cloudflare.conf 的設定檔 (檔名好記就可以了),並填入以下內容。請您注意,Cloudflare 的 IP 位址可能會有異動,所以可以參考一下官網的 IP Ranges 看看有沒有更新。

筆者撰文時官網的 Last updated: February 21, 2019

# cloudflare.conf
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 104.16.0.0/12;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 131.0.72.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2c0f:f248::/32;
set_real_ip_from 2a06:98c0::/29;

之後在網站原本的 Nginx 設定檔中,include cloudflare.conf 進去即可。

server
{
    listen 80;
    listen 443 ssl http2;
    # .....其他設定 (略).....

    include /檔案路徑/cloudflare.conf;
    real_ip_header X-Forwarded-For;

    # .....其他設定 (略).....
}

real_ip_header 就是告訴 Nginx 真實的 IP 其實是在 X-Forwarded-For 這個 header 中,這樣就大功告成了,快去看看日誌檔是否已經記錄到正確 IP 了!

日誌記錄的位置定義在 Nginx 設定文件中 access_log

access_log  /檔案路徑/access.log;