項(xiàng)目中Nginx多級(jí)代理是如何獲取客戶(hù)端的真實(shí)IP地址
多級(jí)代理中獲取客戶(hù)端真實(shí)IP
日志的格式
nginx中常用日志格式配置如下:
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;
其中的main為日志格式的別名,在使用的時(shí)候直接使用別名即可。
例子:
10.0.3.137 - - [09/Oct/2020:09:41:02 +0800] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko" "10.1.9.98"
| 變量 | 含義 | 例子 |
|---|---|---|
| $remote_addr | 客戶(hù)端的ip地址(直連的IP,代理服務(wù)器,顯示代理服務(wù)ip) | 10.0.3.137 |
| $remote_user | 用于記錄遠(yuǎn)程客戶(hù)端的用戶(hù)名稱(chēng) | - |
| $time_local | 用于記錄訪問(wèn)時(shí)間和時(shí)區(qū) | 08/Oct/2020:02:37:25 -0400 |
| $request | 用于記錄請(qǐng)求的url、請(qǐng)求方法,協(xié)議的版本 | GET / HTTP/1.1 |
| $status | 響應(yīng)狀態(tài)碼 | 200 |
| $body_bytes_sent | 給客戶(hù)端發(fā)送的文件主體內(nèi)容字節(jié) | 0 |
| $http_referer | 可以記錄用戶(hù)是從哪個(gè)鏈接訪問(wèn)過(guò)來(lái)的 | - |
| $http_user_agent | 用戶(hù)所使用的代理(一般為瀏覽器) | Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko |
| $http_x_forwarded_for | 可以記錄客戶(hù)端IP和所有經(jīng)過(guò)的代理服務(wù)器的IP | 10.1.9.98 |
日積月累下,日志文件會(huì)越來(lái)越大,日志文件太大嚴(yán)重影響服務(wù)器效率,所以需要定時(shí)對(duì)日志文件進(jìn)行切割。
由于這里是演示,所以切割方式是按分鐘來(lái)切割,正常生產(chǎn)上使用一般是按天來(lái)進(jìn)行分割:
#!/bin/bash
#日志文件存放目錄
LOGS_PATH=/usr/local/nginx/logs
#備份文件名稱(chēng)
YESTERDAY=$(date -d "yesterday" +%Y%m%d%H%M)
#重命名日志文件
mv ${LOGS_PATH}/access.log ${LOGS_PATH}/access_${YESTERDAY}.log
mv ${LOGS_PATH}/error.log ${LOGS_PATH}/error_${YESTERDAY}.log
## 向 Nginx 主進(jìn)程發(fā)送 USR1 信號(hào)。USR1 信號(hào)是重新打開(kāi)日志文件
kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)
然后添加定時(shí)任務(wù):
# crontab -e */1 * * * * /bin/bash /usr/local/nginx/logs/nginx_log.sh
獲取客戶(hù)端真實(shí)IP
服務(wù)器資源分配情況如下:
- 10.1.9.98:充當(dāng)客戶(hù)端
- 10.0.3.137:一級(jí)代理
- 10.0.4.105:二級(jí)代理
- 10.0.4.129:三級(jí)代理
- 10.0.4.120:服務(wù)器端,為了方便,這里使用一個(gè)nginx充當(dāng)服務(wù)器端,正常情況下一般是一個(gè)web服務(wù)器,如tomcat。
各個(gè)服務(wù)初始配置如下:
10.0.3.137的配置:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $http_x_forwarded_for - $http_x_real_ip';
access_log logs/access.log main;
server {
listen 80;
location / {
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://10.0.4.105;
}
}
}
10.0.4.105的配置,其他配置與10.0.3.137的一致:
...
location / {
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://10.0.4.129;
}
...
10.0.4.129的配置,其他配置與10.0.3.137的一致:
...
location / {
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://10.0.4.120;
}
...
10.0.4.120的配置,其他配置與10.0.3.137的一致
...
location / {
root html;
index index.html;
}
...
下面的記錄為access.log中打印的結(jié)果:
| 操作 | 10.0.3.137 | 10.0.4.105 | 10.0.4.129 | 10.0.4.120 |
|---|---|---|---|---|
| 10.1.9.98訪問(wèn)curl http://10.0.3.137 | 10.1.9.98 - - - - | 10.0.3.137 - - - - | 10.0.4.105 - - - - | 10.0.4.129 - - - - |
| 10.0.3.137開(kāi)啟X-Forwarded-For | 10.1.9.98 - - - - | 10.0.3.137 - 10.1.9.98 - - | 10.0.4.105 - 10.1.9.98 - - | 10.0.4.129 - 10.1.9.98 - - |
| 10.0.4.105開(kāi)啟X-Forwarded-For | 10.1.9.98 - - - - | 10.0.3.137 - 10.1.9.98 - - | 10.0.4.105 - 10.1.9.98, 10.0.3.137 - - | 10.0.4.129 - 10.1.9.98, 10.0.3.137 - - |
| 10.0.4.129開(kāi)啟X-Forwarded-For | 10.1.9.98 - - - - | 10.0.3.137 - 10.1.9.98 - - | 10.0.4.105 - 10.1.9.98, 10.0.3.137 - - | 10.0.4.129 - 10.1.9.98, 10.0.3.137, 10.0.4.105 - - |
| 10.1.9.98偽造頭部訪問(wèn)curl http://10.0.3.137 -H ‘X-Forwarded-For: 1.1.1.1’ | 10.1.9.98 - 1.1.1.1 - - | 10.0.3.137 - 1.1.1.1, 10.1.9.98 - - | 10.0.4.105 - 1.1.1.1, 10.1.9.98, 10.0.3.137 - - | 10.0.4.129 - 1.1.1.1, 10.1.9.98, 10.0.3.137, 10.0.4.105 - - |
| 10.0.3.137開(kāi)啟X-Real-IP | 10.1.9.98 - - - - | 10.0.3.137 - 10.1.9.98 - 10.1.9.98 | 10.0.4.105 - 10.1.9.98, 10.0.3.137 - 10.1.9.98 | 10.0.4.129 - 10.1.9.98, 10.0.3.137, 10.0.4.105 - 10.1.9.98 |
| 10.0.4.105開(kāi)啟X-Real-IP | 10.1.9.98 - - - - | 10.0.3.137 - 10.1.9.98 - 10.1.9.98 | 10.0.4.105 - 10.1.9.98, 10.0.3.137 - 10.0.3.137 | 10.0.4.129 - 10.1.9.98, 10.0.3.137, 10.0.4.105 - 10.0.3.137 |
| 10.0.4.129開(kāi)啟X-Real-IP | 10.1.9.98 - - - - | 10.0.3.137 - 10.1.9.98 - 10.1.9.98 | 10.0.4.105 - 10.1.9.98, 10.0.3.137 - 10.0.3.137 | 10.0.4.129 - 10.1.9.98, 10.0.3.137, 10.0.4.105 - 10.0.4.105 |
| 10.1.9.98偽造頭部訪問(wèn) curl http://10.0.3.137 -H ‘X-Real-IP: 8.8.8.8’ | 10.1.9.98 - - - 8.8.8.8 | 10.0.3.137 - 10.1.9.98 - 10.1.9.98 | 10.0.4.105 - 10.1.9.98, 10.0.3.137 - 10.0.3.137 | 10.0.4.129 - 10.1.9.98, 10.0.3.137, 10.0.4.105 - 10.0.4.105 |
總結(jié):
- X-Forwarded-For是一個(gè)追加的過(guò)程,后面的代理會(huì)把前面代理的IP追加到X-Forwarded-For尾部,用逗號(hào)進(jìn)行分隔。
- 應(yīng)用服務(wù)器(10.0.4.120)無(wú)法從X-Forwarded-For中獲取到與它直連的代理服務(wù)器的IP(10.0.4.129),此時(shí)我們可以使用r e m o t e a d d r ( 遠(yuǎn) 程 i p , 表 示 直 連 的 那 臺(tái) 代 理 ) 。 當(dāng) 服 務(wù) 器 無(wú) 法 過(guò) remote_addr(遠(yuǎn)程ip,表示直連的那臺(tái)代理)。當(dāng)服務(wù)器無(wú)法過(guò)remote addr(遠(yuǎn)程ip,表示直連的那臺(tái)代理)。當(dāng)服務(wù)器無(wú)法過(guò)http_x_forwarded_for獲得上級(jí)代理或者客戶(hù)端的ip時(shí)(可能沒(méi)有經(jīng)過(guò)代理),應(yīng)該使用$remote_addr。
- 在代理過(guò)程中至少有一個(gè)代理設(shè)置了X-Forwarded-For,否則后面的代理或者應(yīng)用服務(wù)器無(wú)法獲得相關(guān)信息。
- X-Forwarded-For中雖然包含了真實(shí)的客戶(hù)端IP,一般是第一個(gè)IP,但是如果客戶(hù)端偽造了請(qǐng)求頭,那么真實(shí)的客戶(hù)端IP就不是第一個(gè)了。
- HTTP中header里面的X-Real-IP只是一個(gè)變量,后面的設(shè)置會(huì)覆蓋前面的設(shè)置,所以只需要在第一個(gè)代理服務(wù)器上設(shè)置proxy_set_header X-Real-IP $remote_addr即可,然后在應(yīng)用端直接引用$http_x_real_ip就行。
在java中,如果請(qǐng)求沒(méi)有經(jīng)過(guò)nginx代理,可以使用如下方法獲取客戶(hù)端的真實(shí)IP:
# 類(lèi)似nginx中的$remote_addr request.getRemoteHost();
如果請(qǐng)求經(jīng)過(guò)了nginx代理,可以從請(qǐng)求頭中獲?。ㄇ疤崾潜仨氄_配置nginx才能獲取到):
request.getHeader("x-real-ip");
如果是用的其他Apache,Squid等反向代理軟件,同樣是從請(qǐng)求頭中獲取真實(shí)IP,只是屬性名不一樣而已。
到此這篇關(guān)于項(xiàng)目中Nginx多級(jí)代理是如何獲取客戶(hù)端的真實(shí)IP地址的文章就介紹到這了,更多相關(guān)Nginx多級(jí)代理獲取客戶(hù)端真實(shí)IP內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
CentOS6使用nginx搭建web網(wǎng)站服務(wù)的方法
這篇文章主要介紹了CentOS6使用nginx搭建web網(wǎng)站服務(wù)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
nginx動(dòng)態(tài)添加訪問(wèn)白名單的方法
本篇文章主要介紹了nginx動(dòng)態(tài)添加訪問(wèn)白名單的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02
ubuntu中如何使用nginx監(jiān)聽(tīng)80端口進(jìn)行轉(zhuǎn)發(fā)
這篇文章主要介紹了ubuntu中如何使用nginx監(jiān)聽(tīng)80端口進(jìn)行轉(zhuǎn)發(fā)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
nginx 配置虛擬主機(jī),實(shí)現(xiàn)在一個(gè)服務(wù)器可以訪問(wèn)多個(gè)網(wǎng)站的方法
下面小編就為大家分享一篇nginx 配置虛擬主機(jī),實(shí)現(xiàn)在一個(gè)服務(wù)器可以訪問(wèn)多個(gè)網(wǎng)站的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
nginx配置https的方法示例(免費(fèi)證書(shū))
這篇文章主要介紹了nginx配置https的方法示例(免費(fèi)證書(shū)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
nginx隱藏響應(yīng)頭server信息和版本號(hào)信息的操作方法
文章介紹了兩種隱藏或修改Nginx響應(yīng)頭中server信息的方法:一種是通過(guò)修改配置文件全局段添加`server_tokens off`,另一種是重新編譯Nginx并修改Banner信息,兩種方法分別適用于傳統(tǒng)部署和需要更靈活自定義的情況,需要的朋友可以參考下2025-02-02
nginx日志中添加請(qǐng)求的response日志(推薦)
這篇文章主要介紹了nginx日志中添加請(qǐng)求的response日志,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-05-05

