當使用ALB監聽轉發流量時,您可通過HTTP頭部的X-Forwarded-For字段獲取客戶端真實IP地址。
獲取方法介紹
七層負載均衡(HTTP或HTTPS協議)支持在HTTP頭部的X-Forwarded-For字段保留客戶端真實IP信息,服務器進行相應配置后即可獲取到客戶端真實IP地址。
X-Forwarded-For字段格式如下:
X-Forwarded-For: <客戶端真實IP, 代理服務器1-IP, 代理服務器2-IP,...>
當使用此方式獲取客戶端真實IP時,獲取的第一個地址就是客戶端真實IP。
操作步驟
步驟一:檢查監聽已開啟通過X-Forwarded-For獲取功能
在頂部菜單欄,選擇實例所屬的地域。
在實例頁面,找到目標實例,單擊實例ID。
在實例詳情頁面,單擊監聽頁簽,找到目標監聽,單擊監聽ID。
在監聽詳情頁面,查看到附加HTTP頭字段包括開啟通過X-Forwarded-For頭字段獲取來訪者客戶端IP。
說明ALB默認開啟通過X-Forwarded-For頭字段獲取客戶端真實IP功能,不支持關閉。
步驟二:配置后端服務器
請根據您所使用的服務器類型,選擇對應的操作步驟。
配置Nginx服務器
此處以CentOS 7.9操作系統、Nginx 1.20.1 版本配置為例介紹。具體請以您實際使用的環境為準。
在服務器執行
nginx -V | grep http_realip_module
命令,檢查Nginx服務器是否安裝了http_realip_module模塊。Nginx使用http_realip_module模塊解析X-Forwarded-For記錄。如果返回信息中包括
--with-http_realip_module
,表示已安裝http_realip_module模塊,可進行下一步。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版本過老,建議您備份配置數據并升級Nginx版本。
如果未安裝http_realip_module模塊,需要重新編譯安裝Nginx并安裝http_realip_module 模塊。操作較為繁瑣,建議您使用類似yum的包管理器安裝Nginx。
修改Nginx服務配置文件并保存,修改點可參考下方說明。執行
nginx -t
命令查看配置文件所在路徑,默認通常為/etc/nginx/nginx.conf
,具體請以實際環境為準。http { # 確保設置$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"'; # ... }
執行
sudo nginx -s reload
命令,重新加載Nginx配置文件。
配置Apache服務器
此處以CentOS 7.9操作系統、Apache 2.4.6 版本配置為例介紹。具體請以您實際使用的環境為準。
在服務器執行
httpd -M | grep remoteip_module
命令,檢查Apache服務器是否安裝了remoteip_module模塊。Apache使用remoteip_module模塊解析X-Forwarded-For記錄。如果返回信息中包括
remoteip_module (shared)
,表示已安裝該模塊,可進行下一步。說明Apache 2.4.0 版本(2012年)開始支持remoteip_module 模塊。如果您使用的Apache版本過老,建議您備份配置數據并升級Apache版本。
如果未安裝remoteip_module 模塊,需要重新編譯安裝Apache并安裝remoteip_module 模塊。操作較為繁瑣,建議您使用類似yum的包管理器安裝Apache。
修改Apache服務配置文件并保存,修改點可參考下方說明。默認通常為
/etc/httpd/conf/httpd.conf
,具體請以實際環境為準。# ... <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> # ...
執行
sudo systemctl restart httpd
命令,重啟apache服務。
配置IIS服務器
此處以Windows Server 2016操作系統配置為例介紹。具體請以您實際使用的環境為準。
下載并解壓F5XForwardedFor文件。
根據自己的服務器操作系統版本將
x86\
或x64\
目錄下的F5XFFHttpModule.dll
和F5XFFHttpModule.ini
拷貝到某個目錄,確保IIS進程對該目錄有讀取權限。在服務器管理器中,打開IIS管理器。
選中服務器,雙擊模塊功能。
單擊配置本機模塊,然后在彈出的對話框中,單擊注冊。
添加下載的.dll文件。
輸入文件名稱,選擇路徑之后,單擊確定。
此時系統會自動選中新注冊的模塊,請單擊確定。
回到服務器主頁,雙擊日志模塊,配置日志格式,在日志中記錄
X-Forwarded-For
字段信息。單擊選擇字段。
單擊左下角添加字段,添加如下日志字段并確認。
單擊右上角應用,完成修改。
重啟IIS服務器,等待配置生效。
步驟三:驗證后端服務器已獲取客戶端真實IP
請根據您所使用的服務器類型,選擇對應的操作步驟。
Nginx服務器
當Nginx作為后端服務器時,您可以通過檢查Nginx日志來判斷是否成功獲取到了客戶端的真實IP地址。
Nginx日志文件默認路徑為:/var/log/nginx/access.log
每行日志中,$http_x_forwarded_for
變量對應的字段中,第一個IP地址即為客戶端真實IP地址。
Apache服務器
當Apache作為后端服務器時,您可以通過檢查Apache日志來判斷是否成功獲取到了客戶端的真實IP地址。
Apache日志文件默認路徑為:/var/log/httpd/access_log
每行日志中,%{X-Forwarded-For}i
對應的字段中,第一個IP地址即為客戶端真實IP地址。
IIS服務器
當IIS作為后端服務器時,您可以通過檢查IIS日志來判斷是否成功獲取到了客戶端的真實IP地址。
IIS日志文件路徑,可在日志模塊查看。
每行日志中,X-Forwarded-For
對應的字段中,第一個IP地址即為客戶端真實IP地址。
常見問題
為什么有100開頭的IP在頻繁訪問ECS實例
負載均衡系統除了會通過系統服務器的內網IP將來自外部的訪問請求轉到后端ECS實例之外,還會對ECS實例進行健康檢查和可用性監控,這些訪問的來源都是由負載均衡系統發起的。
負載均衡系統的地址段為100.64.0.0/10(100.64.0.0/10是阿里云保留地址,其他用戶無法分配到該網段內,不會存在安全風險),所以會有很多100開頭的IP地址訪問ECS實例。
為了確保您對外服務的可用性,請確保您的所有服務器均對上述地址的訪問配置了安全組放行規則。
與WAF/CDN/GA等配合使用時,如何獲取客戶端真實IP
流量在經過負載均衡前,如果經過WAF、CDN、GA等轉發,也可以通過X-Forwarded-For字段獲取客戶端真實IP地址,這些產品默認透傳X-Forwarded-For字段,無需進行其他配置。
如果您業務安全性要求較高,想避免X-Forwarded-For偽造,您可通過在其他產品中指定header字段記錄客戶端真實IP。假如您采用客戶端 > CDN > WAF > 負載均衡 > ECS架構時,CDN透傳HTTP頭部的Ali-Cdn-Real-Ip字段,在WAF中接入時客戶端IP判定方式選擇指定header字段為Ali-Cdn-Real-Ip,后端Nginx服務器配置日志變量為$http_Ali_Cdn_Real_Ip,日志中獲取的亦為客戶端真實IP。
您也可以通過其他多種手段加固系統安全性,例如:
驗證和過濾XFF頭部:在后端服務器中,對XFF頭部進行驗證和過濾,以確保它是合法且可信的。您可以檢查XFF頭部的格式和IP地址,拒絕非法或可疑的值。
使用防火墻和訪問控制列表:在負載均衡器和后端服務器之間,使用防火墻和訪問控制列表來限制和過濾針對XFF頭部的惡意請求。
SSL/TLS加密:使用SSL/TLS加密來保護通信,包括XFF頭部的傳輸。這樣可以減少中間人攻擊和數據篡改的風險。
ACK場景下使用負載均衡時如何獲取客戶端真實IP
當您在ACK集群中使用負載均衡時,獲取方式相同,具體操作有部分差異,具體操作請參考ACK容器集群Pod如何獲取客戶端真實IP?
相關文檔
不同負載均衡類型獲取客戶端真實IP方式有所不同:
當您使用CLB七層監聽時,可通過X-Forwarded-For字段獲取客戶端真實IP,可參考通過CLB七層監聽獲取客戶端真實IP。
當您使用CLB四層監聽時,可通過直接獲取或開啟Proxy Protocol功能獲取客戶端真實IP,可參考通過CLB四層監聽獲取客戶端真實IP。
當您使用NLB時,可通過服務器組客戶端地址保持功能或開啟Proxy Protocol功能獲取客戶端真實IP,可參考通過NLB獲取客戶端真實IP。