ALB轉寄請求時,後端伺服器看到的源IP為ALB自身的IP地址。ALB支援將用戶端真實IP附加在HTTP要求標頭的X-Forwarded-For欄位,後端伺服器簡單配置後即可擷取。
X-Forwarded-For欄位格式如下:
X-Forwarded-For: <用戶端真實IP, Proxy 伺服器1-IP, Proxy 伺服器2-IP, ...>操作步驟
步驟一:確認監聽已開啟通過X-Forwarded-For擷取用戶端IP功能
登入ALB控制台,單擊目標執行個體ID進入執行個體詳情頁。
在監聽頁簽,單擊目標監聽ID,在監聽詳情頁的監聽基本資料地區,確認附加 HTTP頭欄位包含
開啟通過X-Forwarded-For頭欄位擷取來訪者用戶端IP已開啟-附加。該選項預設開啟;如未開啟,使用者可單擊監聽基本資料地區的編輯監聽,在高級配置地區開啟。
步驟二:配置後端伺服器
Nginx伺服器
本文以Alibaba Cloud Linux 3.2104、nginx/1.20.1為例,具體以使用者的實際環境為準。
Nginx通過http_realip_module模組解析X-Forwarded-For並擷取用戶端真實IP。
確認模組已安裝:在伺服器執行
nginx -V 2>&1 | grep --color=auto http_realip_module。如輸出包含--with-http_realip_module,則模組已安裝。
主流Linux系統通過包管理器(如
yum/apt)安裝的Nginx通常預設編譯此模組。如該模組未安裝,建議通過包管理器安裝或升級Nginx。修改Nginx設定檔:執行
sudo 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"'; # 確保訪問日誌應用了上述日誌格式。 access_log /var/log/nginx/access.log main; # ... }重新載入配置:執行
sudo nginx -t檢查配置文法無誤後,執行sudo nginx -s reload使配置生效。
Apache伺服器
本文以Alibaba Cloud Linux 3.2104、Apache/2.4.37為例,具體以使用者的實際環境為準。
Apache通過mod_remoteip模組解析X-Forwarded-For並擷取用戶端真實IP。
確認模組已安裝:在伺服器執行
httpd -M | grep remoteip_module。如輸出包含remoteip_module (shared),則模組已安裝。
主流Linux系統通過包管理器(如
yum/apt)安裝的Apache通常將預設編譯此模組。如該模組未安裝,建議通過包管理器安裝或升級Apache。修改Apache設定檔:執行
httpd -V查看設定檔所在路徑,預設通常為/etc/httpd/conf/httpd.conf。# ... <IfModule log_config_module> # ... #確保日誌格式包含%{X-Forwarded-For}i,該變數用於記錄X-Forwarded-For的值。 LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{X-Forwarded-For}i" combined # ... #確保訪問日誌應用了上述日誌格式。 CustomLog "logs/access_log" combined </IfModule> # ...重新載入配置:執行
sudo systemctl restart httpd,使配置生效。
IIS伺服器
本文以Windows Server 2022 21H2、IIS 10.0為例,具體以使用者的實際環境為準。
在IIS管理器左側串連窗格選中目標伺服器,在主面板中雙擊日誌功能。

在記錄檔地區單擊選擇欄位。

在彈出的W3C記錄欄位對話方塊單擊添加欄位。在添加自訂欄位對話方塊配置欄位資訊,單擊確定儲存退出。
欄位名稱:輸入
X-Forwarded-For。源類型:保持預設
請求標題。源:輸入
X-Forwarded-For。

確認已成功添加自訂欄位,單擊確定儲存退出。

在右側的操作窗格中單擊應用使配置生效。

步驟三:驗證後端伺服器已擷取用戶端真實IP
檢查後端Web伺服器的訪問日誌來驗證其是否已擷取用戶端真實IP。
Nginx伺服器
Nginx訪問日誌預設路徑為/var/log/nginx/access.log。
每條日誌中,$http_x_forwarded_for變數對應欄位即為用戶端真實IP。

Apache伺服器
Apache訪問日誌預設路徑為/var/log/httpd/access_log。
每條日誌中,%{X-Forwarded-For}i變數對應欄位即為用戶端真實IP。

IIS伺服器
IIS訪問日誌預設路徑為%SystemDrive%\inetpub\logs\LogFiles。
每條日誌中,末尾X-Forwarded-For欄位對應的值即為用戶端真實IP。

應用於生產環境
驗證和過濾XFF頭部:在後端伺服器中,對XFF頭部進行驗證和過濾,以確保它是合法且可信的。使用者可以檢查XFF頭部的格式和IP地址,拒絕非法或可疑的值。
使用安全性原則:在ALB和後端伺服器之間,使用阿里雲安全性群組或其他第三方安全性原則來限制和過濾針對XFF頭部的惡意請求。
TLS加密:使用TLS加密來保護通訊,包括XFF頭部的傳輸。這樣可以減少中間人攻擊和資料篡改的風險。
常見問題
為什麼有100開頭的IP頻繁訪問後端服務?
ALB升級執行個體:使用其所屬交換器網段內的私網地址(Local IP)與後端伺服器通訊。
未升級ALB執行個體:使用
100.64.0.0/10位址區段(阿里雲保留地址,不存在安全風險)與後端伺服器通訊。
除了將監聽到的請求轉寄給後端伺服器,ALB還會持續對後端伺服器進行健全狀態檢查。如使用者使用存量未升級ALB執行個體,則會在後端伺服器的訪問日誌中看到大量100開頭的IP的訪問請求。
為確保ALB執行個體與後端服務正常連通,如訪問鏈路中存在安全性原則(包括阿里雲安全性群組和其他第三方安全性原則),建議提前放通ALB執行個體所屬交換器網段或100.64.0.0/10位址區段。
與WAF/CDN/GA等配合使用時,如何擷取用戶端真實IP?
若流量在到達ALB前,已經過阿里雲WAF、CDN或Global Acceleration(GA)等轉寄,也可通過X-Forwarded-For欄位擷取用戶端真實IP。上述產品預設透傳該欄位,無需額外配置。
為避免X-Forwarded-For偽造,使用者也可使用其他HTTP要求標頭欄位來記錄用戶端真實IP:
使用阿里雲CDN的
Ali-Cdn-Real-Ip。業務架構為用戶端 > CDN > WAF > ALB > ECS。CDN預設支援攜帶
Ali-Cdn-Real-Ip要求標頭回源,用於向來源站點傳遞用戶端與 CDN 節點建立串連的真實 IP。接入WAF時用戶端IP判定方式選擇
Ali-Cdn-Real-Ip為指定Header欄位。後端Nginx伺服器配置日誌變數
$http_Ali_Cdn_Real_Ip,即可從該欄位擷取用戶端真實IP。
使用ALB的監聽轉寄規則寫入Header向請求添加HTTP頭欄位(索引值對)。業務架構為用戶端 > GA > ALB > ECS。
在ALB監聽轉寄規則中配置轉寄動作為寫入Header,本例添加鍵為
client-real-ip,值為系統定義、用戶端IP地址。
開啟監聽的尋找真實用戶端源IP開關,將GA的終端節點出公網IP加入可信IP列表。
後端Nginx伺服器配置日誌變數
$http_client_real_ip,即可從該欄位擷取用戶端真實IP。
ACK情境下使用ALB時如何擷取用戶端真實IP?
參考擷取來訪者用戶端IP。