通過NLB獲取客戶端真實(shí)IP
網(wǎng)絡(luò)型負(fù)載均衡NLB四層監(jiān)聽支持后端服務(wù)器獲取客戶端真實(shí)IP地址。通常情況下,在創(chuàng)建后端服務(wù)器組時開啟客戶端地址保持,后端服務(wù)器即可獲取客戶端真實(shí)IP地址。但當(dāng)客戶端使用IPv6地址訪問IPv4服務(wù)、NLB使用TCPSSL監(jiān)聽、NLB掛載IP類型后端服務(wù)器組時,需要在NLB監(jiān)聽與后端服務(wù)器同時開啟Proxy Protocol,后端服務(wù)器才可獲取客戶端真實(shí)IP地址。
獲取方法介紹
通過服務(wù)器組客戶端地址保持功能獲取
正常情況下,在創(chuàng)建 NLB 服務(wù)器組時,將開啟客戶端地址保持字段設(shè)置為開啟,此時在后端服務(wù)器上獲取的源IP即為客戶端真實(shí)IP地址。
部分特殊場景下,該功能無法使用,需要通過Proxy Protocol配置,后端服務(wù)器才能獲取客戶端真實(shí)IP地址,參見通過Proxy Protocol功能獲取。
通過Proxy Protocol功能獲取
Proxy Protocol是一種通信協(xié)議,用于在代理服務(wù)器和后端服務(wù)器之間傳遞客戶端的原始網(wǎng)絡(luò)連接信息。
通常情況下,代理服務(wù)器在轉(zhuǎn)發(fā)客戶端請求到后端服務(wù)器時會重寫請求頭部,將客戶端的源IP地址和端口等信息替換為代理服務(wù)器自身的信息。這樣后端服務(wù)器就無法獲得客戶端的真實(shí)網(wǎng)絡(luò)連接信息。
而使用Proxy Protocol,代理服務(wù)器在轉(zhuǎn)發(fā)請求時將客戶端的原始網(wǎng)絡(luò)連接信息封裝在請求頭部中,發(fā)送給后端服務(wù)器。后端服務(wù)器通過解析Proxy Protocol頭部,就可以獲得客戶端的真實(shí)網(wǎng)絡(luò)連接信息,包括源IP地址、源端口以及傳輸協(xié)議等。
通過使用Proxy Protocol,后端服務(wù)器可以準(zhǔn)確獲取客戶端的原始網(wǎng)絡(luò)連接信息,從而進(jìn)行更準(zhǔn)確的日志記錄、訪問控制、流量監(jiān)控等操作。
注意Proxy Protocol需要代理服務(wù)器和后端服務(wù)器都支持該協(xié)議才能正常使用。如果后端服務(wù)器不具備解析Proxy Protocol協(xié)議能力,直接打開特性開關(guān),很可能會導(dǎo)致后端服務(wù)解析異常,從而影響服務(wù)可用性。
NLB監(jiān)聽支持通過Proxy Protocol攜帶原始連接信息(源IP、目的IP、源端口、目的端口等)并添加到TCP或UDP數(shù)據(jù)頭中,且不會丟棄或覆蓋任何原有數(shù)據(jù)。
NLB僅支持Proxy Protocol v2版本。Proxy Protocol v2版本支持多種傳輸協(xié)議,如TCP和UDP,更多信息,請參見The PROXY protocol。
以下場景,需要在NLB及后端服務(wù)器上開啟Proxy Protocol來獲取客戶端真實(shí)IP地址。
客戶端使用IPv6地址訪問后端的IPv4服務(wù)
NLB使用TCPSSL監(jiān)聽(TCPSSL監(jiān)聽不能選擇已開啟客戶端地址保持功能的服務(wù)器組)
NLB掛載IP類型的后端服務(wù)器組(IP類型的服務(wù)器組不支持開啟客戶端地址保持功能)
操作步驟
通過服務(wù)器組客戶端地址保持功能配置
前提條件
您已經(jīng)創(chuàng)建可用的NLB服務(wù)器組并添加了后端服務(wù)器。本文以創(chuàng)建了服務(wù)器類型的服務(wù)器組、后端協(xié)議為TCP、后端服務(wù)器為ECS、后端部署的應(yīng)用端口為80舉例說明,具體操作,請參見創(chuàng)建和管理服務(wù)器組。
您已經(jīng)創(chuàng)建NLB實(shí)例并為該實(shí)例添加了監(jiān)聽。本文以TCP監(jiān)聽、監(jiān)聽端口為80舉例說明,具體操作,請參見創(chuàng)建和管理NLB實(shí)例、添加TCP監(jiān)聽。
步驟一:檢查服務(wù)器組已開啟客戶端地址保持功能
在頂部菜單欄,選擇實(shí)例所屬的地域。
在服務(wù)器組頁面,找到目標(biāo)服務(wù)器組,單擊服務(wù)器組ID。
在服務(wù)器組詳情頁面,查看到開啟客戶端地址保持字段為已開啟。如果是未開啟,可單擊編輯基本信息在配置頁面中開啟該功能。
步驟二:驗(yàn)證后端服務(wù)器可獲取客戶端真實(shí)IP
當(dāng)Nginx作為后端服務(wù)器時,您可以通過檢查Nginx日志來判斷是否成功獲取到了客戶端的真實(shí)IP地址。
Nginx日志字段默認(rèn)配置示例如下:
http {
# 默認(rèn)配置
log_format main '$remote_addr- $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#...
}
Nginx日志文件默認(rèn)路徑為:/var/log/nginx/access.log
每行日志中第一個IP地址即為客戶端真實(shí)IP地址。
通過Proxy Protocol功能配置
前提條件
您已經(jīng)創(chuàng)建可用的NLB服務(wù)器組并添加了后端服務(wù)器。本文以創(chuàng)建了服務(wù)器類型的服務(wù)器組、后端協(xié)議為TCP、后端服務(wù)器為ECS、后端部署的應(yīng)用端口為80舉例說明,具體操作,請參見創(chuàng)建和管理服務(wù)器組。
您已經(jīng)創(chuàng)建NLB實(shí)例并為該實(shí)例添加了監(jiān)聽。本文以TCP監(jiān)聽、監(jiān)聽端口為80舉例說明,具體操作,請參見創(chuàng)建和管理NLB實(shí)例。
說明啟用Proxy Protocol之前,請確保您的后端服務(wù)器支持Proxy Protocol v2版本,否則會導(dǎo)致新建連接失敗。
如果實(shí)例的多個NLB監(jiān)聽掛載同一組后端服務(wù)器,必須將所有實(shí)例的監(jiān)聽都開啟Proxy Protocol功能。
Nginx Plus R16及以后版本或者開源Nginx 1.13.11及以后版本支持Proxy Protocol v2版本。
步驟一:為監(jiān)聽開啟Proxy Protocol
在頂部菜單欄,選擇實(shí)例所屬的地域。
在實(shí)例頁面,找到目標(biāo)實(shí)例,單擊實(shí)例ID。
在實(shí)例詳情頁面,單擊監(jiān)聽頁簽,找到目標(biāo)監(jiān)聽,單擊監(jiān)聽ID。
在監(jiān)聽詳情頁面,查看到開啟ProxyProtocol字段為已開啟。如果未開啟,可單擊編輯監(jiān)聽在彈出的對話框中開啟該功能。
步驟二:為后端服務(wù)器開啟Proxy Protocol
此處以CentOS 7.9操作系統(tǒng)、Nginx 1.20.1 版本配置為例介紹。具體請以您實(shí)際使用的環(huán)境為準(zhǔn)。
登錄后端服務(wù)器,執(zhí)行
nginx -t
命令查看配置文件所在路徑。默認(rèn)通常為/etc/nginx/nginx.conf
,具體請以實(shí)際環(huán)境為準(zhǔn)。修改配置文件中的Proxy Protocol內(nèi)容并保存,修改點(diǎn)可參考下方說明。
http { # 確保設(shè)置$proxy_protocol_addr,該變量用于記錄客戶端真實(shí)IP log_format main '$proxy_protocol_addr - $remote_addr- $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; # 以80監(jiān)聽端口為例,增加proxy_protocol字段 server { listen 80 proxy_protocol; #... } }
執(zhí)行
sudo nginx -s reload
命令,重新加載Nginx配置文件。
步驟三:驗(yàn)證后端服務(wù)器可獲取客戶端真實(shí)IP
當(dāng)Nginx作為后端服務(wù)器時,您可以通過檢查Nginx日志來判斷是否成功獲取到了客戶端的真實(shí)IP地址。
Nginx日志文件默認(rèn)路徑為:/var/log/nginx/access.log
每行日志中,$proxy_protocol_addr
變量對應(yīng)的IP地址即為客戶端真實(shí)IP地址。
Proxy Protocol v2報(bào)文參考
如您未使用上述示例中的服務(wù)器,您可參考Proxy Protocol v2報(bào)文結(jié)構(gòu)及The PROXY protocol進(jìn)行自定義解析,具體請參考您所使用的服務(wù)器的官方資料。
攜帶客戶端IPv4地址的Proxy Protocol v2二進(jìn)制頭格式如下所示:
攜帶客戶端IPv6地址的Proxy Protocol v2二進(jìn)制頭格式如下所示:
常見問題
ACK場景下使用負(fù)載均衡時如何獲取客戶端真實(shí)IP
當(dāng)您在ACK集群中使用負(fù)載均衡時,獲取方式相同,具體操作有部分差異,具體操作請參考ACK容器集群Pod如何獲取客戶端真實(shí)IP?
相關(guān)文檔
不同負(fù)載均衡類型獲取客戶端真實(shí)IP方式有所不同:
當(dāng)您使用CLB四層監(jiān)聽時,可通過直接獲取或開啟Proxy Protocol功能獲取客戶端真實(shí)IP,可參考通過CLB四層監(jiān)聽獲取客戶端真實(shí)IP。
當(dāng)您使用CLB七層監(jiān)聽時,可通過X-Forwarded-For字段獲取客戶端真實(shí)IP,可參考通過CLB七層監(jiān)聽獲取客戶端真實(shí)IP。
當(dāng)您使用ALB時,可通過X-Forwarded-For字段獲取客戶端真實(shí)IP,可參考通過ALB獲取客戶端真實(shí)IP。