nginx如何根據(jù)用戶真實(shí)IP限源
一、背景介紹
1、正常情況,nginx 限制ip訪問方式:(根據(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)過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é)議沒有IP的概念,Remote Address來自于TCP連接,表示與服務(wù)端建立TCP連接的設(shè)備IP,因此,Remote Address無法偽造。
注意,這里的客戶端指的是直接請(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)開啟它。
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追加上去的,但前面部分來源于nginx收到的請(qǐng)求頭,這部分內(nèi)容不是很可信。符合IP格式的才可以使用,否則容易引發(fā)XSS或者SQL注入漏洞。
每次經(jīng)過proxy轉(zhuǎn)發(fā)都會(huì)有記錄,格式就是 client1,proxy1,proxy2,以逗號(hào)隔開各個(gè)地址,由于它是非rfc標(biāo)準(zhǔn),所以默認(rèn)是沒有的,需要強(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ù)器端通過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)置了該模塊。
語法
語法:allow/deny address | CIDR | unix: | all
它表示,允許/拒絕某個(gè)ip或者一個(gè)ip段訪問.如果指定unix:,那將允許socket的訪問。
注意:unix在1.5.1中新加入的功能。
在nginx中,allow和deny的規(guī)則是按順序執(zhí)行的。
allow 指令
1、允許哪些 IP 訪問,all 表示允許所有;
2、作用域 http / server / location / limit_except ;
deny 指令
?1、禁止哪些 IP 訪問,all 表示禁止所有;
2、作用域 http / server / location / limit_except ;
運(yùn)行機(jī)制
根據(jù)remote_addr參數(shù)限制允許還是拒絕
三、當(dāng)前場(chǎng)景問題
1、real_ip獲取用戶真實(shí)IP
經(jīng)過waf代理,remote_addr 為waf出口地址
- 開啟real_ip,取X-Forwarded-For中最后一個(gè)ip作為real_ip
- 設(shè)置信任ip(中間代理服務(wù)器出口地址,本場(chǎng)景為waf出口地址),設(shè)置后real_ip在取值時(shí)候會(huì)過濾掉 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、如何限制用戶訪問
本場(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è)試白名單中有的地址能否訪問
4、測(cè)試白名單中沒有的地址能否訪問
五、注意
一定要檢查配置文件地址跟改動(dòng)的配置文件地址是否一致,否則會(huì)導(dǎo)致更改失效
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Nginx使用反向代理實(shí)現(xiàn)負(fù)載均衡過程解析
這篇文章主要介紹了Nginx使用反向代理實(shí)現(xiàn)負(fù)載均衡過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
nginx中封禁ip和允許內(nèi)網(wǎng)ip訪問的實(shí)現(xiàn)示例
Nginx不僅僅只是一款反向代理和負(fù)載均衡服務(wù)器,本文主要介紹了nginx中封禁ip和允許內(nèi)網(wǎng)ip訪問的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
nginx鏡像構(gòu)建的知識(shí)點(diǎn)及方法步驟詳解
這篇文章主要為大家介紹了nginx鏡像構(gòu)建的知識(shí)點(diǎn)詳解,<BR>有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
nginx做代理轉(zhuǎn)發(fā)前端請(qǐng)求到后端的代碼示例
Nginx作為反向代理服務(wù)器,可以有效處理請(qǐng)求并轉(zhuǎn)發(fā)到后端服務(wù)器,這篇文章主要介紹了nginx做代理轉(zhuǎn)發(fā)前端請(qǐng)求到后端的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-01-01
nginx 配置location匹配規(guī)則實(shí)例講解
在本篇文章里小編給大家整理的是關(guān)于nginx 配置location匹配規(guī)則實(shí)例講解內(nèi)容,需要的朋友們學(xué)習(xí)下。2020-03-03
Nginx學(xué)習(xí)之靜態(tài)文件服務(wù)器配置方法
本篇文章主要介紹了Nginx學(xué)習(xí)之靜態(tài)文件服務(wù)器配置方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-02-02

