通過CLB七層監(jiān)聽獲取客戶端真實(shí)IP
當(dāng)使用CLB七層監(jiān)聽轉(zhuǎn)發(fā)流量時(shí),您可通過HTTP頭部的X-Forwarded-For字段獲取客戶端真實(shí)IP地址。
獲取方法介紹
七層負(fù)載均衡(HTTP或HTTPS協(xié)議)支持在HTTP頭部的X-Forwarded-For字段保留客戶端真實(shí)IP信息,服務(wù)器進(jìn)行相應(yīng)配置后即可獲取到客戶端真實(shí)IP地址。
X-Forwarded-For字段格式如下:
X-Forwarded-For: <客戶端真實(shí)IP, 代理服務(wù)器1-IP, 代理服務(wù)器2-IP,...>
當(dāng)使用此方式獲取客戶端真實(shí)IP時(shí),獲取的第一個(gè)地址就是客戶端真實(shí)IP。
CLB的HTTPS監(jiān)聽是在負(fù)載均衡服務(wù)上進(jìn)行的加密控制,負(fù)載均衡服務(wù)與后端服務(wù)器之間使用的是HTTP協(xié)議。因此如果即使使用的是HTTPS監(jiān)聽,在后端服務(wù)器也只需配置HTTP協(xié)議。
操作步驟
前提條件
您已經(jīng)創(chuàng)建CLB實(shí)例并為該實(shí)例添加了七層監(jiān)聽。本文以HTTP監(jiān)聽、監(jiān)聽端口為80舉例說明,具體操作,請參見創(chuàng)建和管理CLB實(shí)例、添加HTTP監(jiān)聽。
您已經(jīng)創(chuàng)建可用的CLB服務(wù)器組并添加了后端服務(wù)器。本文以創(chuàng)建了虛擬服務(wù)器組、后端協(xié)議為HTTP、后端服務(wù)器為ECS、后端應(yīng)用端口為80舉例說明,具體操作,請參見創(chuàng)建和管理虛擬服務(wù)器組。
步驟一:檢查監(jiān)聽已開啟通過X-Forwarded-For獲取功能
在頂部菜單欄,選擇實(shí)例所屬的地域。
在實(shí)例管理頁面,找到目標(biāo)實(shí)例,單擊實(shí)例ID。
在實(shí)例詳情頁面,單擊監(jiān)聽頁簽,找到目標(biāo)七層監(jiān)聽,單擊監(jiān)聽ID。
在監(jiān)聽詳情頁面,查看到附加HTTP頭字段包括通過X-Forwarded-For頭字段獲取客戶端真實(shí)IP。
說明CLB七層監(jiān)聽默認(rèn)開啟通過X-Forwarded-For頭字段獲取客戶端真實(shí)IP功能,不支持關(guān)閉。
步驟二:配置后端服務(wù)器
請根據(jù)您所使用的服務(wù)器類型,選擇對應(yīng)的操作步驟。
配置Nginx服務(wù)器
此處以CentOS 7.9操作系統(tǒng)、Nginx 1.20.1 版本配置為例介紹。具體請以您實(shí)際使用的環(huán)境為準(zhǔn)。
在服務(wù)器執(zhí)行
nginx -V | grep http_realip_module
命令,檢查Nginx服務(wù)器是否安裝了http_realip_module模塊。Nginx使用http_realip_module模塊解析X-Forwarded-For記錄。如果返回信息中包括
--with-http_realip_module
,表示已安裝http_realip_module模塊,可進(jìn)行下一步。nginx version: nginx/1.20.1 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) built with OpenSSL 1.1.1k FIPS 25 Mar 2021 TLS SNI support enabled configure arguments: --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-compat --with-debug --with-file-aio --with-google_perftools_module --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_degradation_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_mp4_module --with-http_perl_module=dynamic --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-http_xslt_module=dynamic --with-mail=dynamic --with-mail_ssl_module --with-pcre --with-pcre-jit --with-stream=dynamic --with-stream_ssl_module --with-stream_ssl_preread_module --with-threads --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic' --with-ld-opt='-Wl,-z,relro -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -Wl,-E'
說明Nginx 1.0.4 版本(2011年)開始支持http_realip_module 模塊。如果您使用的Nginx版本過老,建議您備份配置數(shù)據(jù)并升級(jí)Nginx版本。
如果未安裝http_realip_module模塊,需要重新編譯安裝Nginx并安裝http_realip_module 模塊。操作較為繁瑣,建議您使用類似yum的包管理器安裝Nginx。
修改Nginx服務(wù)配置文件并保存,修改點(diǎn)可參考下方說明。執(zhí)行
nginx -t
命令查看配置文件所在路徑,默認(rèn)通常為/etc/nginx/nginx.conf
,具體請以實(shí)際環(huán)境為準(zhǔn)。http { # 確保設(shè)置$http_x_forwarded_for,該變量用于記錄X-Forwarded-For的值 log_format main '$remote_addr- $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; # ... }
執(zhí)行
sudo nginx -s reload
命令,重新加載Nginx配置文件。
配置Apache服務(wù)器
此處以CentOS 7.9操作系統(tǒng)、Apache 2.4.6 版本配置為例介紹。具體請以您實(shí)際使用的環(huán)境為準(zhǔn)。
在服務(wù)器執(zhí)行
httpd -M | grep remoteip_module
命令,檢查Apache服務(wù)器是否安裝了remoteip_module模塊。Apache使用remoteip_module模塊解析X-Forwarded-For記錄。如果返回信息中包括
remoteip_module (shared)
,表示已安裝該模塊,可進(jìn)行下一步。說明Apache 2.4.0 版本(2012年)開始支持remoteip_module 模塊。如果您使用的Apache版本過老,建議您備份配置數(shù)據(jù)并升級(jí)Apache版本。
如果未安裝remoteip_module 模塊,需要重新編譯安裝Apache并安裝remoteip_module 模塊。操作較為繁瑣,建議您使用類似yum的包管理器安裝Apache。
修改Apache服務(wù)配置文件并保存,修改點(diǎn)可參考下方說明。默認(rèn)通常為
/etc/httpd/conf/httpd.conf
,具體請以實(shí)際環(huán)境為準(zhǔn)。# ... <IfModule log_config_module> # 增加%{X-Forwarded-For}i ,用于記錄X-Forwarded-For信息 LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b" common #... </IfModule> # ...
執(zhí)行
sudo systemctl restart httpd
命令,重啟apache服務(wù)。
配置IIS服務(wù)器
此處以Windows Server 2016操作系統(tǒng)配置為例介紹。具體請以您實(shí)際使用的環(huán)境為準(zhǔn)。
下載并解壓F5XForwardedFor文件。
根據(jù)自己的服務(wù)器操作系統(tǒng)版本將
x86\
或x64\
目錄下的F5XFFHttpModule.dll
和F5XFFHttpModule.ini
拷貝到某個(gè)目錄,確保IIS進(jìn)程對該目錄有讀取權(quán)限。在服務(wù)器管理器中,打開IIS管理器。
選中服務(wù)器,雙擊模塊功能。
單擊配置本機(jī)模塊,然后在彈出的對話框中,單擊注冊。
添加下載的.dll文件。
輸入文件名稱,選擇路徑之后,單擊確定。
此時(shí)系統(tǒng)會(huì)自動(dòng)選中新注冊的模塊,請單擊確定。
回到服務(wù)器主頁,雙擊日志模塊,配置日志格式,在日志中記錄
X-Forwarded-For
字段信息。單擊選擇字段。
單擊左下角添加字段,添加如下日志字段并確認(rèn)。
單擊右上角應(yīng)用,完成修改。
重啟IIS服務(wù)器,等待配置生效。
步驟三:驗(yàn)證后端服務(wù)器已獲取客戶端真實(shí)IP
請根據(jù)您所使用的服務(wù)器類型,選擇對應(yīng)的操作步驟。
Nginx服務(wù)器
當(dāng)Nginx作為后端服務(wù)器時(shí),您可以通過檢查Nginx日志來判斷是否成功獲取到了客戶端的真實(shí)IP地址。
Nginx日志文件默認(rèn)路徑為:/var/log/nginx/access.log
每行日志中,$http_x_forwarded_for
變量對應(yīng)的字段中,第一個(gè)IP地址即為客戶端真實(shí)IP地址。
Apache服務(wù)器
當(dāng)Apache作為后端服務(wù)器時(shí),您可以通過檢查Apache日志來判斷是否成功獲取到了客戶端的真實(shí)IP地址。
Apache日志文件默認(rèn)路徑為:/var/log/httpd/access_log
每行日志中,%{X-Forwarded-For}i
對應(yīng)的字段中,第一個(gè)IP地址即為客戶端真實(shí)IP地址。
IIS服務(wù)器
當(dāng)IIS作為后端服務(wù)器時(shí),您可以通過檢查IIS日志來判斷是否成功獲取到了客戶端的真實(shí)IP地址。
IIS日志文件路徑,可在日志模塊查看。
每行日志中,X-Forwarded-For
對應(yīng)的字段中,第一個(gè)IP地址即為客戶端真實(shí)IP地址。
常見問題
為什么有100開頭的IP在頻繁訪問ECS實(shí)例
負(fù)載均衡系統(tǒng)除了會(huì)通過系統(tǒng)服務(wù)器的內(nèi)網(wǎng)IP將來自外部的訪問請求轉(zhuǎn)到后端ECS實(shí)例之外,還會(huì)對ECS實(shí)例進(jìn)行健康檢查和可用性監(jiān)控,這些訪問的來源都是由負(fù)載均衡系統(tǒng)發(fā)起的。
負(fù)載均衡系統(tǒng)的地址段為100.64.0.0/10(100.64.0.0/10是阿里云保留地址,其他用戶無法分配到該網(wǎng)段內(nèi),不會(huì)存在安全風(fēng)險(xiǎn)),所以會(huì)有很多100開頭的IP地址訪問ECS實(shí)例。
為了確保您對外服務(wù)的可用性,請確保您的所有服務(wù)器均對上述地址的訪問配置了安全組放行規(guī)則。
與WAF/CDN/GA等配合使用時(shí),如何獲取客戶端真實(shí)IP
流量在經(jīng)過負(fù)載均衡前,如果經(jīng)過WAF、CDN、GA等轉(zhuǎn)發(fā),也可以通過X-Forwarded-For字段獲取客戶端真實(shí)IP地址,這些產(chǎn)品默認(rèn)透傳X-Forwarded-For字段,無需進(jìn)行其他配置。
如果您業(yè)務(wù)安全性要求較高,想避免X-Forwarded-For偽造,您可通過在其他產(chǎn)品中指定header字段記錄客戶端真實(shí)IP。假如您采用客戶端 > CDN > WAF > 負(fù)載均衡 > ECS架構(gòu)時(shí),CDN透傳HTTP頭部的Ali-Cdn-Real-Ip字段,在WAF中接入時(shí)客戶端IP判定方式選擇指定header字段為Ali-Cdn-Real-Ip,后端Nginx服務(wù)器配置日志變量為$http_Ali_Cdn_Real_Ip,日志中獲取的亦為客戶端真實(shí)IP。
您也可以通過其他多種手段加固系統(tǒng)安全性,例如:
驗(yàn)證和過濾XFF頭部:在后端服務(wù)器中,對XFF頭部進(jìn)行驗(yàn)證和過濾,以確保它是合法且可信的。您可以檢查XFF頭部的格式和IP地址,拒絕非法或可疑的值。
使用防火墻和訪問控制列表:在負(fù)載均衡器和后端服務(wù)器之間,使用防火墻和訪問控制列表來限制和過濾針對XFF頭部的惡意請求。
SSL/TLS加密:使用SSL/TLS加密來保護(hù)通信,包括XFF頭部的傳輸。這樣可以減少中間人攻擊和數(shù)據(jù)篡改的風(fēng)險(xiǎn)。
ACK場景下使用負(fù)載均衡時(shí)如何獲取客戶端真實(shí)IP
當(dāng)您在ACK集群中使用負(fù)載均衡時(shí),獲取方式相同,具體操作有部分差異,具體操作請參考ACK容器集群Pod如何獲取客戶端真實(shí)IP?
相關(guān)文檔
不同負(fù)載均衡類型獲取客戶端真實(shí)IP方式有所不同:
當(dāng)您使用ALB時(shí),可通過X-Forwarded-For字段獲取客戶端真實(shí)IP,可參考通過ALB獲取客戶端真實(shí)IP。
當(dāng)您使用NLB時(shí),可通過服務(wù)器組客戶端地址保持功能或開啟Proxy Protocol功能獲取客戶端真實(shí)IP,可參考通過NLB獲取客戶端真實(shí)IP。
當(dāng)您使用CLB四層監(jiān)聽時(shí),可通過直接獲取或開啟Proxy Protocol功能獲取客戶端真實(shí)IP,可參考通過CLB四層監(jiān)聽獲取客戶端真實(shí)IP。