全部產品
Search
文件中心

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

更新時間:Jun 19, 2024

網路型負載平衡NLB四層監聽支援後端伺服器擷取用戶端真實IP地址。通常情況下,在建立後端伺服器組時開啟用戶端地址保持,後端伺服器即可擷取用戶端真實IP地址。但當用戶端使用IPv6地址訪問IPv4服務、NLB使用TCPSSL監聽、NLB掛載IP類型後端伺服器組時,需要在NLB監聽與後端伺服器同時開啟Proxy Protocol,後端伺服器才可擷取用戶端真實IP地址。

擷取方法介紹

擷取用戶端真實IP

通過伺服器組用戶端地址保持功能擷取

正常情況下,在建立 NLB 伺服器組時,將開啟用戶端地址保持欄位設定為開啟,此時在後端伺服器上擷取的源IP即為用戶端真實IP地址。

部分特殊情境下,該功能無法使用,需要通過Proxy Protocol配置,後端伺服器才能擷取用戶端真實IP地址,參見通過Proxy Protocol功能擷取

通過Proxy Protocol功能擷取

Proxy Protocol是一種通訊協定,用於在Proxy 伺服器和後端伺服器之間傳遞用戶端的原始網路連接資訊。

通常情況下,Proxy 伺服器在轉寄用戶端請求到後端伺服器時會重寫要求標頭部,將用戶端的源IP地址和連接埠等資訊替換為Proxy 伺服器自身的資訊。這樣後端伺服器就無法獲得用戶端的真實網路連接資訊。

而使用Proxy Protocol,Proxy 伺服器在轉寄請求時將用戶端的原始網路連接資訊封裝在要求標頭部中,發送給後端伺服器。後端伺服器通過解析Proxy Protocol頭部,就可以獲得用戶端的真實網路連接資訊,包括源IP地址、源連接埠以及傳輸協議等。

通過使用Proxy Protocol,後端伺服器可以準確擷取用戶端的原始網路連接資訊,從而進行更準確的日誌記錄、存取控制、流量監控等操作。

重要
  • 注意Proxy Protocol需要Proxy 伺服器和後端伺服器都支援該協議才能正常使用。如果後端伺服器不具備解析Proxy Protocol協議能力,直接開啟特性開關,很可能會導致後端服務解析異常,從而影響服務可用性。

  • NLB監聽支援通過Proxy Protocol攜帶原始串連資訊(源IP、目的IP、源連接埠、目的連接埠等)並添加到TCP或UDP資料頭中,且不會丟棄或覆蓋任何原有資料。

  • NLB僅支援Proxy Protocol v2版本。Proxy Protocol v2版本支援多種傳輸協議,如TCP和UDP,更多資訊,請參見The PROXY protocol

以下情境,需要在NLB及後端伺服器上開啟Proxy Protocol來擷取用戶端真實IP地址。

  • 用戶端使用IPv6地址訪問後端的IPv4服務

  • NLB使用TCPSSL監聽(TCPSSL監聽不能選擇已開啟用戶端地址保持功能的伺服器組)

  • NLB掛載IP類型的後端伺服器組(IP類型的伺服器組不支援開啟用戶端地址保持功能)

操作步驟

通過伺服器組用戶端地址保持功能配置

前提條件

  • 您已經建立可用的NLB伺服器組並添加了後端伺服器。本文以建立了伺服器類型的伺服器組、後端協議為TCP、後端伺服器為ECS、後端部署的應用連接埠為80舉例說明,具體操作,請參見建立和管理伺服器組

步驟一:檢查伺服器組已開啟用戶端地址保持功能

  1. 登入網路型負載平衡NLB控制台

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

  3. 伺服器組頁面,找到目標伺服器組,單擊伺服器組ID。

  4. 在伺服器組詳情頁面,查看到開啟用戶端地址保持欄位為已開啟。如果是未開啟,可單擊編輯基本資料在配置頁面中開啟該功能。

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

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

Nginx日誌欄位預設配置樣本如下:

http {
  # 預設配置
  log_format  main  '$remote_addr- $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
	#...
}

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

每行日誌中第一個IP地址即為用戶端真實IP地址。

image.png

通過Proxy Protocol功能配置

前提條件

  • 您已經建立可用的NLB伺服器組並添加了後端伺服器。本文以建立了伺服器類型的伺服器組、後端協議為TCP、後端伺服器為ECS、後端部署的應用連接埠為80舉例說明,具體操作,請參見建立和管理伺服器組

  • 您已經建立NLB執行個體並為該執行個體添加了監聽。本文以TCP監聽、監聽連接埠為80舉例說明,具體操作,請參見建立和管理NLB執行個體

    說明
    • 啟用Proxy Protocol之前,請確保您的後端伺服器支援Proxy Protocol v2版本,否則會導致建立串連失敗。

    • 如果執行個體的多個NLB監聽掛載同一組後端伺服器,必須將所有執行個體的監聽都開啟Proxy Protocol功能。

    • Nginx Plus R16及以後版本或者開源Nginx 1.13.11及以後版本支援Proxy Protocol v2版本。

步驟一:為監聽開啟Proxy Protocol

  1. 登入網路型負載平衡NLB控制台

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

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

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

  5. 在監聽詳情頁面,查看到開啟ProxyProtocol欄位為已開啟。如果未開啟,可單擊編輯監聽在彈出的對話方塊中開啟該功能。

步驟二:為後端伺服器開啟Proxy Protocol

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

  1. 登入後端伺服器,執行nginx -t命令查看設定檔所在路徑。預設通常為 /etc/nginx/nginx.conf,具體請以實際環境為準。

  2. 修改設定檔中的Proxy Protocol內容並儲存,修改點可參考下方說明。

    http {
      # 確保設定$proxy_protocol_addr,該變數用於記錄用戶端真實IP
      log_format  main  '$proxy_protocol_addr - $remote_addr- $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
      # 以80監聽連接埠為例,增加proxy_protocol欄位
      server {
        listen 80   proxy_protocol;
        #...
      }
    }
    
  3. 執行sudo nginx -s reload命令,重新載入Nginx設定檔。

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

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

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

每行日誌中,$proxy_protocol_addr變數對應的IP地址即為用戶端真實IP地址。

image.png

Proxy Protocol v2報文參考

如您未使用上述樣本中的伺服器,您可參考Proxy Protocol v2報文結構及The PROXY protocol進行自訂解析,具體請參考您所使用的伺服器的官方資料。

  • 攜帶用戶端IPv4地址的Proxy Protocol v2二進位頭格式如下所示:IPv4

  • 攜帶用戶端IPv6地址的Proxy Protocol v2二進位頭格式如下所示:IPv6

常見問題

ACK情境下使用負載平衡時如何擷取用戶端真實IP

當您在ACK叢集中使用負載平衡時,擷取方式相同,具體操作有部分差異,具體操作請參考ACK容器叢集Pod如何擷取用戶端真實IP?

相關文檔

不同負載平衡類型擷取用戶端真實IP方式有所不同: