傳統型負載平衡CLB四層監聽支援後端伺服器擷取用戶端真實IP地址。通常情況下,無需操作,後端伺服器即可擷取用戶端真實IP地址。但當用戶端使用IPv6地址訪問IPv4服務時,需要在CLB監聽與後端伺服器同時開啟Proxy Protocol,後端伺服器才可擷取用戶端真實IP地址。
擷取方法介紹
直接擷取
正常情況下,CLB四層監聽通過源地址透傳,在後端伺服器上擷取的源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協議能力,直接開啟特性開關,很可能會導致後端服務解析異常,從而影響服務可用性。
CLB四層監聽支援通過Proxy Protocol攜帶原始串連資訊(源IP、目的IP、源連接埠、目的連接埠等)並添加到TCP或UDP資料頭中,且不會丟棄或覆蓋任何原有資料。
CLB僅支援Proxy Protocol v2版本。Proxy Protocol v2版本支援多種傳輸協議,如TCP和UDP,更多資訊,請參見The PROXY protocol。
用戶端使用IPv6地址訪問CLB後端的IPv4服務情境下,需要在CLB四層監聽及後端服務上開啟Proxy Protocol來擷取用戶端真實IP地址。
操作步驟
直接擷取
直接擷取的情境下,可直接在後端伺服器中擷取用戶端真實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地址。
通過Proxy Protocol功能配置
前提條件
您已經建立CLB執行個體並為該執行個體添加了監聽。本文以TCP監聽、監聽連接埠為80舉例說明,具體操作,請參見建立和管理CLB執行個體、添加TCP監聽。
您已經建立可用的CLB伺服器組並添加了後端伺服器。本文以建立了虛擬伺服器組、後端協議為TCP、後端伺服器為ECS、後端部署的應用連接埠為80舉例說明,具體操作,請參見建立和管理CLB虛擬伺服器組。
說明啟用Proxy Protocol之前,請確保您的後端伺服器支援Proxy Protocol v2版本,否則會導致建立串連失敗。
Nginx Plus R16及以後版本或者開源Nginx 1.13.11及以後版本支援Proxy Protocol v2版本。
如果執行個體的多個CLB監聽掛載同一組後端伺服器,必須將所有執行個體的監聽都開啟Proxy Protocol功能。
步驟一:為監聽開啟Proxy Protocol
在頂部功能表列,選擇執行個體所屬的地區。
在執行個體管理頁面,找到目標執行個體,單擊執行個體ID。
在執行個體詳情頁面,單擊監聽頁簽,找到目標四層監聽,單擊監聽ID。
在監聽詳情頁面,查看到ProxyProtocol配置欄位為通過ProxyProtocol協議攜帶用戶端源地址到後端伺服器。如果未顯示該欄位,可單擊編輯監聽在配置頁面中開啟該功能。
重要該功能不支援線上平滑遷移,切換到Proxy Protocol需要業務停服升級,請謹慎配置。
步驟二:後端伺服器開啟Proxy Protocol
此處以CentOS 7.9作業系統、Nginx 1.20.1 版本配置為例介紹。具體請以您實際使用的環境為準。
登入後端伺服器,執行
nginx -t
命令查看設定檔所在路徑。預設通常為/etc/nginx/nginx.conf
,具體請以實際環境為準。修改設定檔中的Proxy Protocol內容並儲存,修改點可參考下方說明。
http { # 確保設定$proxy_protocol_addr 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; #... } }
執行
sudo nginx -s reload
命令,重新載入Nginx設定檔。
步驟三:驗證後端伺服器擷取用戶端真實IP
當Nginx作為後端伺服器時,您可以通過檢查Nginx日誌來判斷是否成功擷取到了用戶端的真實IP地址。
Nginx記錄檔預設路徑為:/var/log/nginx/access.log
每行日誌中,$proxy_protocol_addr
變數對應的IP地址即為用戶端真實IP地址。
Proxy Protocol v2報文結構參考
如您未使用上述樣本中的伺服器,您可參考Proxy Protocol v2報文結構及The PROXY protocol進行自訂解析,具體請參考您所使用的伺服器的官方資料。
攜帶用戶端IPv4地址的Proxy Protocol v2二進位頭格式如下所示:
攜帶用戶端IPv6地址的Proxy Protocol v2二進位頭格式如下所示:
常見問題
為什麼有100開頭的IP在頻繁訪問ECS執行個體
負載平衡系統除了會通過系統伺服器的內網IP將來自外部的訪問請求轉到後端ECS執行個體之外,還會對ECS執行個體進行健全狀態檢查和可用性監控,這些訪問的來源都是由負載平衡系統發起的。
負載平衡系統的位址區段為100.64.0.0/10(100.64.0.0/10是阿里雲保留地址,其他使用者無法分配到該網段內,不會存在安全風險),所以會有很多100開頭的IP地址訪問ECS執行個體。
為了確保您對外服務的可用性,請確保您的所有伺服器均對上述地址的訪問配置了安全性群組允許存取規則。
ACK情境下使用負載平衡時如何擷取用戶端真實IP
當您在ACK叢集中使用負載平衡時,擷取方式相同,具體操作有部分差異,具體操作請參考ACK容器叢集Pod如何擷取用戶端真實IP?
相關文檔
不同負載平衡類型擷取用戶端真實IP方式有所不同:
當您使用NLB時,可通過伺服器組用戶端地址保持功能或開啟Proxy Protocol功能擷取用戶端真實IP,可參考通過NLB擷取用戶端真實IP。
當您使用CLB七層監聽時,可通過X-Forwarded-For欄位擷取用戶端真實IP,可參考通過CLB七層監聽擷取用戶端真實IP。
當您使用ALB時,可通過X-Forwarded-For欄位擷取用戶端真實IP,可參考通過ALB擷取用戶端真實IP。