nginx如何根據(jù)用戶真實(shí)IP限源
一、背景介紹
1、正常情況,nginx 限制ip訪問(wèn)方式:(根據(jù)remote_addr限制)
# nginx http\server 塊中配置 allow 192.168.6.0/16; # allow all; deny 1.2.3.4/32; # deny all;
2、當(dāng)經(jīng)過(guò)waf或者cdn等代理后(remote_addr總是waf或者cdn等上一步代理地址)
3、確認(rèn)上層代理是否將用戶IP傳遞到http_x_forwarded_for中
4、一般http_x_forwarded_for中第一個(gè)地址為用戶IP,為了避免被人篡改,暫不采取直接拿第一個(gè)地址作為用戶真實(shí)IP
二、基礎(chǔ)知識(shí)介紹
1、remote_addr
HTTP協(xié)議沒(méi)有IP的概念,Remote Address來(lái)自于TCP連接,表示與服務(wù)端建立TCP連接的設(shè)備IP,因此,Remote Address無(wú)法偽造。
注意,這里的客戶端指的是直接請(qǐng)求Nginx的客戶端,非間接請(qǐng)求的客戶端。
用戶客戶端–發(fā)送請(qǐng)求->Nginx1 --轉(zhuǎn)發(fā)請(qǐng)求–>Nginx2->后端服務(wù)器
默認(rèn)情況下,針對(duì)Nginx1而言,remote_addr為用戶客戶端IP,對(duì)Nginx2而言,$remote_addr則為Nginx1的IP。
2、X-Real-IP
HTTP代理用于表示與它產(chǎn)生TCP連接的設(shè)備IP,可能是其他代理,也可能是真正的請(qǐng)求端。
用途:當(dāng)本機(jī) Nginx 處于反向代理后端時(shí)可以獲取到用戶的真實(shí)IP地址。
realip 功能介紹
使用:realip 功能需要 Nginx 添加 ngx_http_realip_module 模塊,默認(rèn)情況下是不被編譯,如果需要添加,請(qǐng)?jiān)诰幾g時(shí)添加 --with-http_realip_module 選項(xiàng)開(kāi)啟它。
realip 作用域
set_real_ip_from、real_ip_header 和 real_ip_recursive 都可以用于 http、 server、location 區(qū)域配置。
realip 部分參數(shù)解釋
set_real_ip_from:設(shè)置反向代理服務(wù)器,即信任服務(wù)器IP real_ip_header X-Forwarded-For:用戶真實(shí)IP存在X-Forwarded-For請(qǐng)求頭中 real_ip_recursive: off:會(huì)將real_ip_header指定的HTTP頭中的最后一個(gè)IP作為真實(shí)IP on:會(huì)將real_ip_header指定的HTTP頭中的最后一個(gè)不是信任服務(wù)器的IP當(dāng)成真實(shí)IP
3、X-Forwarded-For
Nginx追加上去的,但前面部分來(lái)源于nginx收到的請(qǐng)求頭,這部分內(nèi)容不是很可信。符合IP格式的才可以使用,否則容易引發(fā)XSS或者SQL注入漏洞。
每次經(jīng)過(guò)proxy轉(zhuǎn)發(fā)都會(huì)有記錄,格式就是 client1,proxy1,proxy2,以逗號(hào)隔開(kāi)各個(gè)地址,由于它是非rfc標(biāo)準(zhǔn),所以默認(rèn)是沒(méi)有的,需要強(qiáng)制添加。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
追加一個(gè)X-Forwarded-For的值,實(shí)際上當(dāng)你搭建兩臺(tái)nginx在不同的ip上,并且都使用了這段配置,那你會(huì)發(fā)現(xiàn)在web服務(wù)器端通過(guò)request.getAttribute(“X-Forwarded-For”)獲得的將會(huì)是客戶端ip和第一臺(tái)nginx的ip。
4、deny機(jī)制
Nginx的deny和allow指令是由ngx_http_access_module模塊提供,Nginx安裝默認(rèn)內(nèi)置了該模塊。
語(yǔ)法
語(yǔ)法:allow/deny address | CIDR | unix: | all
它表示,允許/拒絕某個(gè)ip或者一個(gè)ip段訪問(wèn).如果指定unix:,那將允許socket的訪問(wèn)。
注意:unix在1.5.1中新加入的功能。
在nginx中,allow和deny的規(guī)則是按順序執(zhí)行的。
allow 指令
1、允許哪些 IP 訪問(wèn),all 表示允許所有;
2、作用域 http / server / location / limit_except ;
deny 指令
?1、禁止哪些 IP 訪問(wèn),all 表示禁止所有;
2、作用域 http / server / location / limit_except ;
運(yùn)行機(jī)制
根據(jù)remote_addr參數(shù)限制允許還是拒絕
三、當(dāng)前場(chǎng)景問(wèn)題
1、real_ip獲取用戶真實(shí)IP
經(jīng)過(guò)waf代理,remote_addr 為waf出口地址
- 開(kāi)啟real_ip,取X-Forwarded-For中最后一個(gè)ip作為real_ip
- 設(shè)置信任ip(中間代理服務(wù)器出口地址,本場(chǎng)景為waf出口地址),設(shè)置后real_ip在取值時(shí)候會(huì)過(guò)濾掉 X-Forwarded-For中信任的ip
- 本場(chǎng)景作用域?yàn)閔ttp
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;
2、賦值給remote_addr,使得deny生效
本場(chǎng)景此處作用域?yàn)閘ocation
proxy_set_header X-Real-IP $remote_addr;
3、如何限制用戶訪問(wèn)
本場(chǎng)景此處作用域?yàn)閘ocation,寫在上一步之后
include whitelist.conf;
其中whitelist.conf路徑為nginx.conf同級(jí)目錄中,文件中寫入內(nèi)容為:
allow 112.17.28.67 ; allow 112.17.79.152/29; deny all;
四、測(cè)試
1、檢查配置文件
nginx -t
2、重新加載nginx
nginx -s reload
3、測(cè)試白名單中有的地址能否訪問(wèn)
4、測(cè)試白名單中沒(méi)有的地址能否訪問(wèn)
五、注意
一定要檢查配置文件地址跟改動(dòng)的配置文件地址是否一致,否則會(huì)導(dǎo)致更改失效
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
寶塔使用Nginx?Proxy?Manager申請(qǐng)SSL的實(shí)現(xiàn)
本文主要介紹了寶塔使用Nginx?Proxy?Manager申請(qǐng)SSL,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02
nginx關(guān)閉favicon.ico、robots.txt日志記錄配置
這篇文章主要介紹了nginx關(guān)閉favicon.ico、robots.txt日志記錄配置,同時(shí)提供了不允許訪問(wèn)某些隱藏文件的配置方法,需要的朋友可以參考下2014-05-05
Nginx配置WSS安全WebSocket代理的實(shí)現(xiàn)
本文詳細(xì)介紹Nginx配置WSS(WebSocket安全連接)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-12-12
nginx 解決首頁(yè)跳轉(zhuǎn)問(wèn)題詳解
這篇文章主要介紹了nginx 解決首頁(yè)跳轉(zhuǎn)問(wèn)題詳解的相關(guān)資料,需要的朋友可以參考下2016-12-12
Nginx防盜鏈根據(jù)UA屏蔽惡意User Agent請(qǐng)求(防蜘蛛)
相對(duì)于 Apache,Nginx 占用的系統(tǒng)資源更少,更適合 VPS 使用。惡意盜鏈的 User Agent 無(wú)處不在,博客更換到 WordPress 沒(méi)幾天,就被 SPAM(垃圾留言)盯上,又被暴力破解后臺(tái)用戶名密碼。今天來(lái)介紹 Nginx 屏蔽惡意 User Agent請(qǐng)求的方法2016-07-07
Nginx設(shè)置成服務(wù)并開(kāi)機(jī)自動(dòng)啟動(dòng)的配置
Nginx?是一個(gè)高性能的HTTP和反向代理web服務(wù)器,同時(shí)也提供了IMAP/POP3/SMTP服務(wù),接下來(lái)通過(guò)本文給大家介紹Nginx設(shè)置成服務(wù)并開(kāi)機(jī)自動(dòng)啟動(dòng)的配置,需要的朋友可以參考下2022-01-01

