首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Nginx 反向代理獲取真實客戶端 IP 完整指南:單層與多層代理場景實測

     編輯:Java 綜合教學

核心原理

Nginx 反向代理預設會將客戶端 IP 覆蓋為代理伺服器 IP。需透過 --with-http_realip_module 編譯模組,配合 proxy_set_header 將真實 IP 傳遞給上游:

  • X-Real-IP:固定為直接下游的 IP(最可信)
  • X-Forwarded-For:追蹤完整代理鏈路,格式 client, proxy1, proxy2...

一、編譯階段啟用 realip 模組

./configure \
  --prefix=/data/nginx \
  --with-http_realip_module \
  --with-stream \
  --with-pcre=/tmp/X/pcre-8.32 \
  --with-openssl=/tmp/X/openssl-1.0.2a

驗證編譯結果:

nm nginx | grep realip
# 0809c54b t ngx_http_realip

二、Nginx 配置範例

location / {
    proxy_pass https://20.61.28.11:80;
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;              # 必須
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

proxy_set_header 可置於 http/server/location,層層繼承覆蓋。

三、測試程式(CGI 印出環境變數)

#include <stdio.h> #include <stdlib.h>
int main() {
    printf("Content-Type:text/html;charset=utf-8\r\n\r\n");
    printf("<p>HTTP_X_FORWARDED_FOR:%s\n", getenv("HTTP_X_FORWARDED_FOR"));
    printf("<p>HTTP_X_REAL_IP:%s\n", getenv("HTTP_X_REAL_IP"));
    printf("<p>REMOTE_ADDR:%s\n", getenv("REMOTE_ADDR"));
    return 0;
}

四、場景實測與結果分析

拓撲 A:Client → Nginx-A → Nginx-B → Apache

場景X-Forwarded-ForX-Real-IPREMOTE_ADDR
正常請求10.6.81.39, 10.6.223.4410.6.223.4410.6.81.39
Client 偽造 Header8.8.8.7, 10.6.81.39, 10.6.223.4410.6.223.448.8.8.7
Nginx-A 不傳 XFF10.6.223.4410.6.223.4410.6.223.44
Nginx-B 不傳 XFF10.6.81.3910.6.223.4410.6.81.39

拓撲 B:Client → Nginx-B → Apache(單層代理)

場景X-Forwarded-ForX-Real-IPREMOTE_ADDR
正常請求10.6.81.3910.6.81.3910.6.81.39
Client 偽造 Header8.8.8.7, 10.6.81.3910.6.81.398.8.8.7

五、關鍵結論

  1. 單層代理:HTTP_X_REAL_IP 直接可得真實 Client IP
  2. 多層代理:真實 IP 包含在 HTTP_X_FORWARDED_FOR 的第一個值
  3. 最不可信:REMOTE_ADDR 完全可被 Client 竄改(如測試 B 所示)
  4. 最可信:正確編譯配置後,HTTP_X_REAL_IP 永遠為 Nginx 直接下游真實 IP,無法偽造
  5. 金鑰規則:只要編譯配置正確,X-Forwarded-For 永遠包含真實 Client IP(取第一個)

六、生產環境建議

  • 應用層優先信任 X-Real-IP(單層)或解析 X-Forwarded-For 首段(多層)
  • 在邊緣 Nginx(流量入口)啟用 real_ip_header X-Real-IP; 與 set_real_ip_from 信任內部代理 CIDR,自動重寫 $remote_addr
  • 拒絕來自非信任代理的 X-Forwarded-For,防止 IP 偽造攻擊
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved