前言
上面突然說,需要檢查Nginx反向代理的安全問題并給出了修改方法,小白的我一臉懵逼,明明都是中文,連在一起咋就看不明白了。于是乎,對著修改內(nèi)容簡單學(xué)習(xí)了一下,在此做個記錄,如有問題請大佬們指點指點。
1、proxy_set_header的參數(shù)
在Nginx中的location里,我們通常會配置proxy_set_header,如下代碼:
# 定義轉(zhuǎn)發(fā)分配規(guī)則
upstream kwtest {
server ip1:port;
server ip2:port;
}
server {
listen 8080; # Nginx監(jiān)聽端口
location /testApi {
# 反向代理
proxy_pass http://kwtest;
# 在原本的nginx中,這個是默認(rèn)的
proxy_set_header Host $http_host;
}
}
1.1 具體參數(shù)
這里來解釋一下這個參數(shù)$http_host
,以及后面會講到的參數(shù)。
proxy_set_header參數(shù) | 含義 |
---|---|
$http_host |
請求頭中的完整的主機名或IP地址(包括端口號) |
$host |
請求頭中的Host字段,主機名或IP地址(不包括端口號) |
$remote_addr |
是客戶端的IP地址 |
$proxy_add_x_forwarded_for |
獲取客戶端真實的 IP 地址 |
1.2 客戶端請求過來的 HTTP 請求頭中的主機名或IP地址,與客戶端的 IP 地址有什么不同
- 客戶端請求過來的 HTTP 請求頭中的主機名或IP地址:這里的IP不是客戶端的IP,是服務(wù)器端的IP【eg.系統(tǒng)部署的地方】
- 客戶端的 IP 地址:用戶的IP地址【eg.瀏覽器打開的頁面】
1.3 客戶端的IP地址 與 獲取客戶端真實的 IP 地址有什么不同
$remote_addr
是 Nginx 服務(wù)器記錄的發(fā)起連接的客戶端 IP 地址,是從網(wǎng)絡(luò)層獲取的客戶端 IP,也就是請求到達(dá) Nginx 服務(wù)器的 IP 地址。這個變量通常在直接與客戶端通信的情況下使用,例如,客戶端直接請求 Nginx 服務(wù)器時,可以通過$remote_addr
獲取客戶端的真實 IP 地址。
$proxy_add_x_forwarded_for
是 Nginx 在作為反向代理服務(wù)器時,從 HTTP 請求頭中提取客戶端的真實 IP 地址。當(dāng) Nginx 作為反向代理服務(wù)器時,客戶端請求會經(jīng)過反向代理服務(wù)器,再由反向代理服務(wù)器轉(zhuǎn)發(fā)給后端的真實服務(wù)器處理。在這個過程中,Nginx 在請求頭中添加了X-Forwarded-For
字段,并將客戶端的真實 IP 地址追加到該字段的末尾。$proxy_add_x_forwarded_for
可以從這個字段中提取出客戶端的真實 IP 地址,從而獲取客戶端的真實 IP 地址。
因此,$remote_addr
和$proxy_add_x_forwarded_for
都是用于獲取客戶端 IP 地址的,但是 $remote_addr
適用于直接與客戶端通信的場景,而 $proxy_add_x_forwarded_for
適用于 Nginx 作為反向代理服務(wù)器時獲取客戶端真實 IP 地址的場景,二者的使用場景不同。
2、X-Forwarded-For偽造客戶端IP漏洞
這部分主要看利用X-Forwarded-For偽造客戶端IP漏洞成因及防范這篇文章。雖然很詳細(xì),但理解完后,過一段時間忘了又得再理解。因此,以下內(nèi)容主要對這篇文章的總結(jié),快速回憶。
- 注意:
$proxy_add_x_forwarded_for
會將和Nginx直接連接的客戶端IP追加在請求原有X-Forwarded-For值的右邊。$remote_addr
這個是無法偽造的,即使客戶端偽造也會被覆蓋掉,而不是追加。
- 存在多層Nginx情況下:
# 外層
server {
listen 8080; # Nginx監(jiān)聽端口
location /testApi1 {
# 反向代理
proxy_pass http://kwtest1;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
# 內(nèi)層
server {
listen 8080; # Nginx監(jiān)聽端口
location /testApi2 {
# 反向代理
proxy_pass http://kwtest2;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
如果有多層代理,那么只要在直接對外訪問的Nginx上配置X-Forwarded-For為$remote_addr
,內(nèi)部層的Nginx還是要配置為$proxy_add_x_forwarded_for
,不然內(nèi)部層的Nginx又會覆蓋掉客戶端的真實IP。文章來源:http://www.zghlxwxcb.cn/news/detail-826120.html
- 單層Nginx,即對內(nèi)又對外的情況:
# 內(nèi)外層
server {
listen 8080; # Nginx監(jiān)聽端口
location /testApi3 {
# 反向代理
proxy_pass http://kwtest3;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
X-Real-IP
頭部會包含真實的客戶端 IP 地址,X-Forwarded-For
頭部會包含一個逗號分隔的 IP 地址列表,其中第一個 IP 地址應(yīng)該是真實的客戶端 IP 地址文章來源地址http://www.zghlxwxcb.cn/news/detail-826120.html
到了這里,關(guān)于【Nginx】proxy_set_header的變量與X-Forwarded-For偽造客戶端IP漏洞的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!