全部產品
Search
文件中心

Server Load Balancer:後端伺服器通過ALB擷取用戶端真實IP

更新時間:Jan 08, 2026

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功能

  1. 登入ALB控制台,單擊目標執行個體ID進入執行個體詳情頁。

  2. 監聽頁簽,單擊目標監聽ID,在監聽詳情頁的監聽基本資料地區,確認附加 HTTP頭欄位包含開啟通過X-Forwarded-For頭欄位擷取來訪者用戶端IP已開啟-附加

    該選項預設開啟;如未開啟,使用者可單擊監聽基本資料地區的編輯監聽,在高級配置地區開啟。

步驟二:配置後端伺服器

Nginx伺服器

本文以Alibaba Cloud Linux 3.2104nginx/1.20.1為例,具體以使用者的實際環境為準。

Nginx通過http_realip_module模組解析X-Forwarded-For並擷取用戶端真實IP。

  1. 確認模組已安裝:在伺服器執行nginx -V 2>&1 | grep --color=auto http_realip_module。如輸出包含--with-http_realip_module,則模組已安裝。

    image

    主流Linux系統通過包管理器(如yum/apt)安裝的Nginx通常預設編譯此模組。如該模組未安裝,建議通過包管理器安裝或升級Nginx。
  2. 修改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;
        #  ...
    }
  3. 重新載入配置:執行sudo nginx -t檢查配置文法無誤後,執行sudo nginx -s reload使配置生效。

Apache伺服器

本文以Alibaba Cloud Linux 3.2104Apache/2.4.37為例,具體以使用者的實際環境為準。

Apache通過mod_remoteip模組解析X-Forwarded-For並擷取用戶端真實IP。

  1. 確認模組已安裝:在伺服器執行httpd -M | grep remoteip_module。如輸出包含remoteip_module (shared),則模組已安裝。

    image

    主流Linux系統通過包管理器(如yum/apt)安裝的Apache通常將預設編譯此模組。如該模組未安裝,建議通過包管理器安裝或升級Apache。
  2. 修改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>
    # ...
  3. 重新載入配置:執行sudo systemctl restart httpd,使配置生效。

IIS伺服器

本文以Windows Server 2022 21H2IIS 10.0為例,具體以使用者的實際環境為準。

  1. 在IIS管理器左側串連窗格選中目標伺服器,在主面板中雙擊日誌功能。

    image

  2. 記錄檔地區單擊選擇欄位

    image

  3. 在彈出的W3C記錄欄位對話方塊單擊添加欄位。在添加自訂欄位對話方塊配置欄位資訊,單擊確定儲存退出。

    • 欄位名稱:輸入X-Forwarded-For

    • 源類型:保持預設請求標題

    • :輸入X-Forwarded-For

    image

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

    image

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

    image

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

檢查後端Web伺服器的訪問日誌來驗證其是否已擷取用戶端真實IP。

Nginx伺服器

Nginx訪問日誌預設路徑為/var/log/nginx/access.log

每條日誌中,$http_x_forwarded_for變數對應欄位即為用戶端真實IP。

image

Apache伺服器

Apache訪問日誌預設路徑為/var/log/httpd/access_log

每條日誌中,%{X-Forwarded-For}i變數對應欄位即為用戶端真實IP。

image

IIS伺服器

IIS訪問日誌預設路徑為%SystemDrive%\inetpub\logs\LogFiles

每條日誌中,末尾X-Forwarded-For欄位對應的值即為用戶端真實IP。

image

應用於生產環境

  • 驗證和過濾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。

    1. CDN預設支援攜帶Ali-Cdn-Real-Ip要求標頭回源,用於向來源站點傳遞用戶端與 CDN 節點建立串連的真實 IP。

    2. 接入WAF時用戶端IP判定方式選擇Ali-Cdn-Real-Ip為指定Header欄位。

    3. 後端Nginx伺服器配置日誌變數$http_Ali_Cdn_Real_Ip,即可從該欄位擷取用戶端真實IP。

  • 使用ALB的監聽轉寄規則寫入Header向請求添加HTTP頭欄位(索引值對)。業務架構為用戶端 > GA > ALB > ECS。

    1. 在ALB監聽轉寄規則中配置轉寄動作寫入Header,本例添加鍵為client-real-ip,值為系統定義用戶端IP地址

      寫入header

    2. 開啟監聽的尋找真實用戶端源IP開關,將GA的終端節點出公網IP加入可信IP列表

    3. 後端Nginx伺服器配置日誌變數$http_client_real_ip,即可從該欄位擷取用戶端真實IP。

ACK情境下使用ALB時如何擷取用戶端真實IP?

參考擷取來訪者用戶端IP