Nginx獲取客戶端真實(shí)IP的原理及配置方法
引言
在現(xiàn)代生產(chǎn)環(huán)境中,Nginx 作為反向代理服務(wù)器被廣泛應(yīng)用于服務(wù)的暴露與負(fù)載均衡。尤其是在面對公網(wǎng)訪問時,通常會在 Nginx 前端部署 CDN 或云廠商負(fù)載均衡器,以提升訪問性能與安全性。如何準(zhǔn)確獲取并傳遞客戶端的真實(shí) IP,成為開發(fā)與運(yùn)維的重要課題。
本文將詳細(xì)剖析 Nginx 獲取客戶端真實(shí) IP 的原理、配置方法以及常用變量的使用場景,幫助您在不同協(xié)議與架構(gòu)下正確處理客戶端 IP。
反向代理與客戶端 IP 獲取的基本問題
默認(rèn)情況下,Nginx 并不會自動修改或添加請求頭中的 X-Forwarded-For,這意味著:
- 如果前端的負(fù)載均衡器或 CDN 不傳遞
X-Forwarded-For,Nginx 獲取到的客戶端 IP 實(shí)際上是負(fù)載均衡器的 IP。 - 如果前端已經(jīng)傳遞了
X-Forwarded-For,Nginx 會原樣保留并轉(zhuǎn)發(fā)該請求頭。
因此,為確保后端服務(wù)能正確識別客戶端真實(shí) IP,通常需要根據(jù)實(shí)際情況對請求頭進(jìn)行配置和調(diào)整。
常用變量及其含義
理解 Nginx 的內(nèi)置變量對于正確配置至關(guān)重要,以下為關(guān)鍵變量解析:
$remote_addr
- 表示與 Nginx 服務(wù)器建立連接的上一層代理或客戶端的 IP 地址。
- 在 TCP 四層負(fù)載均衡場景下(開啟獲取客戶端真實(shí) IP 功能),
$remote_addr通常是客戶端的真實(shí) IP。 - 在 HTTP 七層負(fù)載均衡場景下,
$remote_addr通常是負(fù)載均衡器或 CDN 的 IP,因?yàn)榭蛻舳苏鎸?shí) IP 通過X-Forwarded-For傳遞。
$http_x_forwarded_for
- 獲取請求頭中
X-Forwarded-For的原始值,通常是前端負(fù)載均衡器或 CDN 添加的客戶端 IP 列表。 - 該值可以包含一個或多個 IP 地址,多個 IP 用逗號分隔,從左到右依次表示客戶端真實(shí) IP 及經(jīng)過的代理 IP。
$proxy_add_x_forwarded_for
- Nginx 自帶的復(fù)合變量,用于追加當(dāng)前連接的客戶端 IP(
$remote_addr)到已有的X-Forwarded-For列表中。 - 若請求中沒有原始的
X-Forwarded-For,該變量值即為$remote_addr。 - 例如,如果前端已經(jīng)傳遞了
X-Forwarded-For: 1.1.1.1,且$remote_addr是2.2.2.2,設(shè)置后為:X-Forwarded-For: 1.1.1.1, 2.2.2.2。
典型配置方法及應(yīng)用場景
在 Nginx 配置中傳遞客戶端真實(shí) IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
此配置可以在保持原有 X-Forwarded-For 值的基礎(chǔ)上,追加當(dāng)前連接 IP,適用于多級代理鏈場景,方便后端服務(wù)追蹤來源鏈路。
直接覆蓋 X-Forwarded-For 頭
proxy_set_header X-Forwarded-For $remote_addr;
此配置會覆蓋前面?zhèn)鬟f的所有 X-Forwarded-For 信息,直接將當(dāng)前連接的 IP 作為唯一值。
適用場景:
- 您確信當(dāng)前連接的
$remote_addr是客戶端的真實(shí) IP(如 TCP 四層負(fù)載均衡開啟真實(shí) IP穿透時)。 - 或者想避免鏈路傳遞過長或含有無用代理 IP 時重置 IP 信息。
保持負(fù)載均衡器傳遞的真實(shí) IP
當(dāng)前端負(fù)載均衡器已經(jīng)正確注入客戶端真實(shí) IP 到 X-Forwarded-For,一般無需在 Nginx 反代層修改該頭部,直接轉(zhuǎn)發(fā)即可:
proxy_set_header X-Forwarded-For $http_x_forwarded_for;
或者默認(rèn)不設(shè)置,Nginx 會自動將接收到的請求頭透傳。
不同協(xié)議和監(jiān)聽層級對 IP 的影響
TCP 四層監(jiān)聽(四層負(fù)載均衡):
- 負(fù)載均衡器通過網(wǎng)絡(luò)層直接轉(zhuǎn)發(fā)流量,若開啟“獲取客戶端真實(shí) IP”,則
$remote_addr即真實(shí)客戶端 IP,X-Forwarded-For通常不存在。
- 負(fù)載均衡器通過網(wǎng)絡(luò)層直接轉(zhuǎn)發(fā)流量,若開啟“獲取客戶端真實(shí) IP”,則
HTTP 七層監(jiān)聽(七層負(fù)載均衡):
- 負(fù)載均衡器通過 HTTP 協(xié)議代理請求,將客戶端真實(shí) IP 放進(jìn)
X-Forwarded-For頭部,$remote_addr是負(fù)載均衡器實(shí)例 IP。
- 負(fù)載均衡器通過 HTTP 協(xié)議代理請求,將客戶端真實(shí) IP 放進(jìn)
綜上,確定您的架構(gòu)和協(xié)議環(huán)境,是選擇合適真實(shí) IP 獲取策略的前提。
Nginx 訪問日志中打印真實(shí) IP
為了在日志中更準(zhǔn)確地記錄客戶端的真實(shí) IP,配置訪問日志時可使用:
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
其中,$http_x_forwarded_for 可顯示真實(shí)的客戶端 IP 鏈路,方便排查和分析。
安全防護(hù)建議
由于 X-Forwarded-For 頭容易被客戶端偽造,建議:
- 只信任來自可信負(fù)載均衡/代理服務(wù)器的 IP 和
X-Forwarded-For。 - 使用
real_ip模塊(ngx_http_realip_module)替換$remote_addr為真實(shí)客戶端 IP,配置如下:
set_real_ip_from 192.168.0.0/16; # 代理服務(wù)器 IP 段 real_ip_header X-Forwarded-For; real_ip_recursive on;
此配置確保后端應(yīng)用能夠獲得正確的 $remote_addr,并防止偽造。
總結(jié)
- 理解負(fù)載均衡器的協(xié)議層級和“獲取客戶端真實(shí) IP”功能對于正確配置 Nginx 與后端應(yīng)用至關(guān)重要。
$proxy_add_x_forwarded_for是追加客戶端 IP 的最佳實(shí)踐,適合多級代理環(huán)境。- 通過
real_ip模塊配置,可將真實(shí)客戶端 IP 映射到$remote_addr,方便應(yīng)用處理。 - 日志中打印
$http_x_forwarded_for有助于追蹤多跳代理鏈路。
合理配置與使用這些變量,能幫助您在復(fù)雜的負(fù)載均衡與代理環(huán)境中準(zhǔn)確獲取客戶端真實(shí) IP,確保業(yè)務(wù)的穩(wěn)定運(yùn)行和安全防護(hù)。
以上就是Nginx獲取客戶端真實(shí)IP的原理及配置方法的詳細(xì)內(nèi)容,更多關(guān)于Nginx獲取客戶端真實(shí)IP的資料請關(guān)注腳本之家其它相關(guān)文章!
- Nginx代理后如何獲取客戶端真實(shí)IP地址
- nginx經(jīng)過多層代理后獲取真實(shí)來源ip過程詳解
- 基于Nginx 反向代理獲取真實(shí)IP的問題詳解
- Nginx 獲取客戶端真實(shí)IP $remote_addr與X-Forwarded-For的實(shí)現(xiàn)
- nginx如何獲取用戶真實(shí)ip
- Nginx獲取客戶端真實(shí)IP(real_ip_header)的實(shí)現(xiàn)
- Nginx反向代理后無法獲取客戶端真實(shí)IP地址
- nginx獲取真實(shí)的ip的方法
- 基于nginx獲取代理服務(wù)ip以及客戶端真實(shí)ip詳解
- nginx獲取客戶端真實(shí)ip的常用方法
- Nginx獲取IP地址變量的幾種方式
相關(guān)文章
nginx強(qiáng)制使用https訪問的方法(http跳轉(zhuǎn)到https)
這篇文章主要介紹了nginx強(qiáng)制使用https訪問的方法(http跳轉(zhuǎn)到https),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-01-01
Nginx1.21.6生產(chǎn)環(huán)境升級步驟
這篇文章主要介紹了Nginx1.21.6生產(chǎn)環(huán)境升級步驟,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01
Nginx+PHP8.0支持視頻上傳的項(xiàng)目實(shí)踐
在Ubuntu 20.04上配置Nginx和PHP 8.0以支持視頻上傳,介紹了調(diào)整Nginx和PHP的配置文件,增加上傳文件大小限制,調(diào)整超時時間和緩沖區(qū)大小等相關(guān)配置,感興趣的可以了解一下2025-02-02
Nginx 緩存系統(tǒng) proxy_cache工作原理解析
Nginx 的 proxy_cache 模塊允許 Nginx 作為反向代理服務(wù)器時緩存后端服務(wù)器的響應(yīng),本文給大家介紹Nginx 緩存系統(tǒng) proxy_cache的工作原理,感興趣的朋友跟隨小編一起看看吧2024-12-12
Nginx配置Basic Auth登錄認(rèn)證的實(shí)現(xiàn)方法
這篇文章主要介紹了Nginx配置Basic Auth登錄認(rèn)證的實(shí)現(xiàn)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-09-09

