服務器架構前面加了防火牆,Nginx如何獲取客戶端真實ip???


在大部分實際業務場景中,網站訪問請求並不是簡單地從用戶(訪問者)的瀏覽器直達網站的源站服務器,中間可能經過所部署的CDN、高防IP、WAF等代理服務器。例如,網站可能采用這樣的部署架構:用戶 > CDN/高防IP/WAF > 源站服務器。這種情況下,訪問請求在經過多層加速或代理轉發后,源站服務器該如何獲取發起請求的真實客戶端IP?

一般情況下,透明的代理服務器在將用戶的訪問請求轉發到下一環節的服務器時,會在HTTP的請求頭中添加一條X-Forwarded-For記錄,用於記錄用戶的真實IP,其記錄格式為X-Forwarded-For:用戶IP。如果期間經歷多個代理服務器,則X-Forwarded-For將以該格式記錄用戶真實IP和所經過的代理服務器IP:X-Forwarded-For:用戶IP, 代理服務器1-IP, 代理服務器2-IP, 代理服務器3-IP, ……。

因此,常見的Web應用服務器可以使用X-Forwarded-For的方式獲取訪問者真實IP。

Nginx配置方案

  • 1、確認nginx安裝時已經安裝http_realip_module模塊

為實現負載均衡,Nginx使用http_realip_module模塊來獲取真實IP。# nginx -V | grep http_realip_module命令查看是否已安裝該模塊。如未安裝,則需要重新編譯Nginx服務並加裝該模塊。方法如下:

wget http://nginx.org/download/nginx-1.14.2.tar.gz
tar zxvf nginx-1.14.2.tar.gz
cd nginx-1.14.2
./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --without-http-cache --with-http_ssl_module --with-http_realip_module
make
make install
kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
kill -QUIT `cat /usr/local/nginx/logs/ nginx.pid.oldbin`
  • 2、修改Nginx對應server的配置

打開www.conf配置文件,在location / {} 中加入以下內容:

set_real_ip_from ip_range1;    #真實服務器上一級代理的IP地址或者IP段,可以寫多行
set_real_ip_from ip_range2;
...
set_real_ip_from ip_rangex;
real_ip_header    X-Forwarded-For;    #從哪個header頭檢索出需要的IP地址
real_ip_recursive on;    #遞歸排除set_real_ip_from里面出現的IP,其余沒有出現的認為是用戶真實IP

說明: 其中,ip_range1,2,...,x 指WAF的回源IP地址,需要分多條分別添加。

如何獲取WAF的回源IP地址???

打開WAF界面-->設置-->產品信息-->即可查看到回源IP段,將這里的IP段按照上面的方式寫進nginx配置當中即可,查看nginx訪問日志就是客戶端真實ip了。不過要說的是阿里的回源IP段真多,用notepad++處理好配置再寫上去更方便!

  • 3、修改日志記錄格式

log_format一般在nginx.conf配置文件中的http配置部分。在log_format中,添加x-forwarded-for字段,替換原來remote-address字段,即將log_format修改為以下內容:

log_format  main  '$http_x_forwarded_for - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" ';


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM