前言
nginx模塊分為兩種,官方和第三方,我們通過命令 nginx -V 查看 nginx安裝信息,可以看到 下面有關 --with的nginx啟動加載的模塊信息。
realip模塊
用途 :當本機 Nginx 處於反向代理後端時可以獲取到用戶的 真實IP地址 。
使用 : realip 功能需要 Nginx 添加 ngx_http_realip_module 模塊,默認情況下是不被編譯,如果需要添加,請在編譯時添加 --with-http_realip_module 選項開啟它。
realip 作用域
set_real_ip_from 、 real_ip_header 和 real_ip_recursive 都可以用於 http 、 server 、 location 區域配置。
realip 部分參數解釋
set_real_ip_from :設置反向代理服務器,即信任服務器IP
real_ip_header X-Forwarded-For :用戶真實IP存在 X-Forwarded-For 請求頭中
real_ip_recursive :
off :會將 real_ip_header 指定的HTTP頭中的最後一個IP作為真實IP
on :會將 real_ip_header 指定的HTTP頭中的最後一個不是信任服務器的IP當成真實IP
http 頭中的 X-Forwarded-For、X-Real-IP、Remote Address 解釋
X-Forwarded-For 位於HTTP請求頭,是HTTP的擴展 header ,用於表示HTTP請求端 真實IP 。
格式如下:
X-Forwarded-For: client, proxy1, proxy2
Nginx 代理一般配置為:
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
解釋:
X-Forwarded-For :Nginx追加上去的,但前面部分來源於nginx收到的請求頭,這部分內容不是 很可信 。符合IP格式的才可以使用,否則容易引發 XSS 或者 SQL注入漏洞 。
Remote Address :HTTP協議沒有IP的概念, Remote Address 來自於TCP連接,表示與服務端建立TCP連接的設備IP,因此,Remote Address無法偽造。
X-Real-IP :HTTP代理用於表示與它產生TCP連接的設備IP,可能是其他代理,也可能是真正的請求端。
realip 功能舉例說明
下面是一個簡單的架構圖:
假設一:
1、如果 Nginx 沒有使用 realip模塊 ,第二臺 Nginx中 X-Forwarded-For 請求是 1.1.1.1,但 remote_addr 地址是 2.2.2.2,這時應用服務可以通過 X-Forwarded-For 字段獲取用戶真實IP。不過這裡有點風險,如果中間多幾層反向代理服務,就無法獲取唯一一個用戶真實IP。
2、如果 Nginx 使用 realip模塊 ,並如下設置;Nginx 會取 X-Forwarded-For 最後一個IP也就是 2.2.2.2 作為真實IP。最後應用服務拿到的地址也是 2.2.2.2,但事實這不是用戶IP。
set_real_ip_from 2.2.2.2; set_real_ip_from 2.2.2.3; real_ip_header X-Forwarded-For; real_ip_recursive off;
3、如果 Nginx 使用 realip模塊 ,並如下設置;由於 2.2.2.2 是信任服務器IP,Nginx 會繼續往前查找,發現 1.1.1.1 不是信任服務器IP,就認為是真實IP。但事實 1.1.1.1 也就是用戶IP。最後應用服務也拿到唯一的用戶真實IP。
set_real_ip_from 2.2.2.2; set_real_ip_from 2.2.2.3; real_ip_header X-Forwarded-For; real_ip_recursive on;
[zmcjlove ] Nginx基礎學習之realip模塊的使用方法已經有625次圍觀