Nginx 從 Google Cloud CDN 獲得用戶真實 IP

前言

大家常用的 CDN 有很多種,而這其中包括了在 Google Cloud 裡的 Google Cloud CDN。與前幾天寫的 Cloudflare 類似,當這些 CDN 回源向你取得資料時,由網頁伺服器產生的 Log 是無法直接看到用戶的 IP 位址,你看到的應該會是 Google 伺服器的。這篇文章就是來解決這樣的問題。

設定方式

設定方式與 Cloudflare 類似,一樣前往伺服器上的 Nginx 資料夾增加一些內容。通常配置檔會放在 /etc/nginx/sites-enabled/ 底下。

Google Cloud CDN 的回源段為 34.96.0.0/2034.127.192.0/18,但我們需要多設定由 Google 分配給你的 CDN 位址,如下圖。

0001.jpg

且我們必須設定 real_ip_recursive on;,原因是使用 Google Cloud CDN 時,X-Forwarded-For 裡會包含多個 IP 位址,所以我們下這個參數來排除掉信任的 IP 位址,也就是 set_real_ip_from 的這些。

以下是一個 Nginx 設定檔參考範本:

server {
    listen 80;
    server_name www.example.com;

    # Google Cloud CDN Request Source Ranges
    set_real_ip_from 34.96.0.0/20;
    set_real_ip_from 34.127.192.0/18;

    # Your Google Cloud CDN IP Address
    set_real_ip_from 34.36.0.0;
    set_real_ip_from 2600:1901:0:1234::;

    real_ip_header X-Forwarded-For;
    real_ip_recursive on;

    location / {
        try_files $uri $uri/ =404;
    }
}

接者,你可以使用 sudo nginx -t 來確定配置是否有問題。再使用 sudo systemctl restart nginx 重啟網頁伺服器即可。

結語

操作到這邊,你就算是完成囉!接著你可以在 /var/log/nginx 底下的 access.log 看到產出的 Log 為真實的用戶 IP 位址!