全部產品
Search
文件中心

Server Load Balancer:通過ALB擷取用戶端真實IP

更新時間:Jun 19, 2024

當使用ALB監聽轉寄流量時,您可通過HTTP頭部的X-Forwarded-For欄位擷取用戶端真實IP地址。

擷取方法介紹

七層負載平衡(HTTP或HTTPS協議)支援在HTTP頭部的X-Forwarded-For欄位保留用戶端真實IP資訊,伺服器進行相應配置後即可擷取到用戶端真實IP地址。

X-Forwarded-For欄位格式如下:

X-Forwarded-For: <用戶端真實IP, Proxy 伺服器1-IP, Proxy 伺服器2-IP,...>

當使用此方式擷取用戶端真實IP時,擷取的第一個地址就是用戶端真實IP。

操作步驟

步驟一:檢查監聽已開啟通過X-Forwarded-For擷取功能

  1. 登入應用型負載平衡ALB控制台

  2. 在頂部功能表列,選擇執行個體所屬的地區。

  3. 執行個體頁面,找到目標執行個體,單擊執行個體ID。

  4. 在執行個體詳情頁面,單擊監聽頁簽,找到目標監聽,單擊監聽ID。

  5. 在監聽詳情頁面,查看到附加HTTP頭欄位包括開啟通過X-Forwarded-For頭欄位擷取來訪者用戶端IP

    說明

    ALB預設開啟通過X-Forwarded-For頭欄位擷取用戶端真實IP功能,不支援關閉。

步驟二:配置後端伺服器

請根據您所使用的伺服器類型,選擇對應的操作步驟。

配置Nginx伺服器

此處以CentOS 7.9作業系統、Nginx 1.20.1 版本配置為例介紹。具體請以您實際使用的環境為準。

  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模組,可進行下一步。

    已安裝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。

  2. 修改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"';
      
      # ...
    }
    

  3. 執行sudo nginx -s reload命令,重新載入Nginx設定檔。

配置Apache伺服器

此處以CentOS 7.9作業系統、Apache 2.4.6 版本配置為例介紹。具體請以您實際使用的環境為準。

  1. 在伺服器執行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。

  2. 修改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>
    # ...

  3. 執行sudo systemctl restart httpd命令,重啟apache服務。

配置IIS伺服器

此處以Windows Server 2016作業系統配置為例介紹。具體請以您實際使用的環境為準。

  1. 下載並解壓F5XForwardedFor檔案

  2. 根據自己的伺服器作業系統版本將x86\x64\目錄下的F5XFFHttpModule.dllF5XFFHttpModule.ini拷貝到某個目錄,確保IIS進程對該目錄有讀取許可權。

  3. 伺服器管理員中,開啟IIS管理器

  4. 選中伺服器,雙擊模組功能。

  5. 單擊配置本機模組,然後在彈出的對話方塊中,單擊註冊

  6. 添加下載的.dll檔案。

    1. 輸入檔案名稱,選擇路徑之後,單擊確定

    2. 此時系統會自動選中新註冊的模組,請單擊確定註冊模組

  7. 回到伺服器首頁,雙擊日誌模組,配置日誌格式,在日誌中記錄X-Forwarded-For欄位資訊。

    1. 單擊選擇欄位

      image.png

    2. 單擊左下角添加欄位,添加如下日誌欄位並確認。

      image.png

    3. 單擊右上方應用,完成修改。

  8. 重啟IIS伺服器,等待配置生效。

步驟三:驗證後端伺服器已擷取用戶端真實IP

請根據您所使用的伺服器類型,選擇對應的操作步驟。

Nginx伺服器

當Nginx作為後端伺服器時,您可以通過檢查Nginx日誌來判斷是否成功擷取到了用戶端的真實IP地址。

Nginx記錄檔預設路徑為:/var/log/nginx/access.log

每行日誌中,$http_x_forwarded_for變數對應的欄位中,第一個IP地址即為用戶端真實IP地址。

image.png

Apache伺服器

當Apache作為後端伺服器時,您可以通過檢查Apache日誌來判斷是否成功擷取到了用戶端的真實IP地址。

Apache記錄檔預設路徑為:/var/log/httpd/access_log

每行日誌中,%{X-Forwarded-For}i 對應的欄位中,第一個IP地址即為用戶端真實IP地址。

image.png

IIS伺服器

當IIS作為後端伺服器時,您可以通過檢查IIS日誌來判斷是否成功擷取到了用戶端的真實IP地址。

IIS記錄檔路徑,可在日誌模組查看。

image.png

每行日誌中,X-Forwarded-For對應的欄位中,第一個IP地址即為用戶端真實IP地址。

image.png

常見問題

為什麼有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方式有所不同: