Nginx 獲取 CDN X-Forwarded-For

前提條件

  • Nginx 必須編譯 ngx_http_realip_module
    可使用 nginx -V 查看

  • CDN 必須有原始IP 的表頭


準備CDN 提供的 IP列表, 這個列表也可以做白名單的時候使用
這邊使用Cloudflare https://www.cloudflare.com/ips/


配置Nginx

vim /etc/nginx/nginx.conf
將下面配置貼在http 區塊裡面

#cfip4
set_real_ip_from 103.21.244.0/22; #cfipv4
set_real_ip_from 103.22.200.0/22; #cfipv4
set_real_ip_from 103.31.4.0/22; #cfipv4
set_real_ip_from 104.16.0.0/12; #cfipv4
set_real_ip_from 108.162.192.0/18; #cfipv4
set_real_ip_from 131.0.72.0/22; #cfipv4
set_real_ip_from 141.101.64.0/18; #cfipv4
set_real_ip_from 162.158.0.0/15; #cfipv4
set_real_ip_from 172.64.0.0/13; #cfipv4
set_real_ip_from 173.245.48.0/20; #cfipv4
set_real_ip_from 188.114.96.0/20; #cfipv4
set_real_ip_from 190.93.240.0/20; #cfipv4
set_real_ip_from 197.234.240.0/22; #cfipv4
set_real_ip_from 198.41.128.0/17; #cfipv4
#cfip6
set_real_ip_from 2400:cb00::/32; #cfipv6
set_real_ip_from 2405:8100::/32; #cfipv6
set_real_ip_from 2405:b500::/32; #cfipv6
set_real_ip_from 2606:4700::/32; #cfipv6
set_real_ip_from 2803:f800::/32; #cfipv6
set_real_ip_from 2c0f:f248::/32; #cfipv6
set_real_ip_from 2a06:98c0::/29; #cfipv6
#lock
#使用以下任意一个即可
#eal_ip_header CF-Connecting-IP; 
real_ip_header X-Forwarded-For;

關於 CF-Connecting-IP 和 X-Forwarded-For
  1. 如果請求表頭沒有包含 X-Forwarded-For, 那麼會插入 X-Forwarded-For 表頭, 並且內容等價於CF-Connecting-IP, 如:
    "X-Forwarded-For: A.B.C.D"

  2. 如果請求的表頭已經包含X-Forwarded-For, 那他會把原本的X-Forwarded-For 往後排, 並且在最前面插入等價於CF-Connecting-IP 的值, 如:
    "X-Forwarded-For: A.B.C.D[,X.X.X.X,Y.Y.Y.Y,]"

可以參考官方說明 https://support.cloudflare.com/hc/en-us/articles/200170986


參考文章: https://www.hscbook.com/article/servar-cloudflare/