Global Accelerator (GA)支援保持用戶端源IP功能,後端伺服器可以通過該功能擷取發起訪問的用戶端源IP。本文為您介紹在不同情境中如何開啟保持用戶端源IP功能以及後端伺服器如何擷取用戶端源IP。
前提條件
您已經在Global Accelerator執行個體中配置了監聽。具體操作,請參見添加和管理智能路由類型監聽。
背景資訊
通過Global Acceleration服務加速用戶端訪問後端伺服器,預設情況下後端伺服器只能擷取用戶端通過Global Acceleration訪問後端伺服器的終端節點群組出公網IP,不能擷取用戶端的源IP。如果您需要後端伺服器能擷取用戶端的源IP,您可以開啟Global Acceleration的保持用戶端源IP功能。Global Acceleration保持用戶端源IP功能根據監聽協議的不同,支援的情況也不同:
HTTP和HTTPS:支援保持用戶端源IP功能。Global Acceleration將用戶端源IP儲存在HTTP要求標頭的
X-Forwarded-For
欄位中,後端伺服器可以通過X-Forwarded-For
欄位擷取用戶端源IP。UDP:不支援保持用戶端源IP功能。
TCP:支援保持用戶端源IP功能。但根據後端服務類型不同,需要後端伺服器做相應適配以擷取用戶端源IP。關於適配說明,請參見下表:
後端服務部署地
後端服務類型
是否支援擷取用戶端源IP
是否需要後端伺服器適配
說明
阿里雲
阿里雲公網IP
與所綁定執行個體是否支援擷取用戶端源IP有關:
綁定專用網路類型ECS執行個體:支援
綁定NLB執行個體:支援
綁定ALB執行個體:不支援
綁定私網CLB執行個體:支援
綁定公網NAT執行個體:支援
綁定ECS執行個體:不需要
綁定NLB執行個體:需要
綁定私網CLB執行個體:不需要
綁定公網NAT執行個體:
2022年10月之前建立的存量NAT Gateway執行個體:需要
2022年10月之後建立的NAT Gateway執行個體:不需要
需要:在您開啟保持用戶端源IP功能的情況下,Global Acceleration會使用Proxy Protocol保持用戶端源IP,此時需要後端伺服器支援解析Proxy Protocol,才能擷取到用戶端源IP資訊。
重要如果您的後端伺服器不支援解析Proxy Protocol,則會導致後端伺服器無法正確解析加速流量。
不需要:在您開啟保持用戶端源IP功能後,後端伺服器可直接擷取發起訪問的用戶端源IP,無需添加任何配置。
ECS
支援
但必須為專用網路類型,且ECS所在安全性群組需放通所有用戶端源IP。
不需要
ENI
支援
但需要ENI所在安全性群組放通所有用戶端源IP。
OSS
不支援
交換器
預設不支援
如需保持用戶端源IP,請向商務經理申請。
CLB
支援
但需要CLB的後端伺服器所在安全性群組放通所有用戶端源IP。
請注意在以下情形中,後端伺服器無法擷取用戶端源IP:
您的CLB執行個體的後端伺服器為傳統網路類型的ECS執行個體。
您的CLB執行個體的監聽協議為HTTP或HTTPS。
ALB
不支援
NLB
支援
需要
非阿里雲
自訂IP
支援
需要
自訂網域名
支援
Proxy Protocol是一種Internet協議,通過為TCP報文添加Proxy Protocol前序來擷取用戶端源IP。
Proxy Protocol的接收端必須在接收到完整有效Proxy Protocol頭部後才能開始處理串連資料,因此對於伺服器中的同一個監聽連接埠,不能同時接收攜帶Proxy Protocol和未攜帶Proxy Protocol的串連請求。如果接收到的第一個資料包不符合Proxy Protocol格式,那麼伺服器會直接終止串連。
通過HTTP或HTTPS監聽協議加速訪問後端服務
如果您通過HTTP或HTTPS監聽協議加速您後端服務的訪問,預設開啟保持用戶端源IP功能,後端伺服器可直接通過HTTP要求標頭的X-Forwarded-For
欄位擷取用戶端源IP。
開啟保持用戶端源IP。
HTTP和HTTPS監聽協議預設開啟保持用戶端源IP功能,並將用戶端源IP儲存在HTTP要求標頭的
X-Forwarded-For
欄位中,您可以通過X-Forwarded-For
擷取用戶端源IP。擷取用戶端源IP。
後端伺服器收到的HTTP要求標頭中的
X-Forwarded-For
欄位如下,其中第一個IP即為用戶端源IP。X-Forwarded-For: 用戶端源IP, Proxy 伺服器1-IP, Proxy 伺服器2-IP,...
通過TCP監聽協議加速訪問阿里雲後端服務
如果您通過TCP監聽協議加速您的後端服務訪問,且您的後端服務部署在阿里雲上,那麼您開啟保持用戶端源IP功能後,後端伺服器可直接擷取用戶端源IP資訊。
開啟保持用戶端源IP。
在執行個體列表頁面,找到目標Global Acceleration執行個體,在操作列單擊配置監聽。
在監聽頁簽下,找到目標監聽,在操作列單擊編輯監聽。
在配置監聽和協議設定精靈頁面,單擊下一步。
在配置終端節點設定精靈頁面,在保持用戶端源IP列表中選擇保持,然後單擊下一步。
當後端服務部署在阿里雲上時,擷取用戶端真實IP方式預設選擇為自動擷取。
自動擷取:IPv4用戶端訪問後端服務,推薦使用此方式。此方式可以自動擷取用戶端IP,後端服務無需做任何改動。當後端服務部署在非阿里雲時,不支援使用該方式。
ProxyProtocol:IPv6用戶端訪問後端服務,推薦使用此方式。此方式需要後端伺服器支援解析Proxy Protocol,才能擷取到用戶端源IP資訊。
更多資訊,請參見背景資訊。
在組態稽核頁面,確認無誤後,單擊提交。
擷取的用戶端源IP。
本部分以後端服務類型為阿里雲Linux ECS執行個體為例,介紹如何查看已擷取的用戶端源IP。
登入後端Linux ECS伺服器。
執行以下命令,抓取HTTP流量。
tcpdump tcp port [監聽連接埠] -n -X -s 0
從抓取的資料包中篩選資訊,查看用戶端源IP。
經測試,開啟保持用戶端源IP功能後,可以在後端伺服器查看用戶端源IP。
未開啟保持用戶端源IP功能,只能在後端伺服器上查看到用戶端通過Global Acceleration訪問後端伺服器的終端節點群組出公網IP。
通過TCP監聽協議加速訪問非阿里雲後端服務
如果您通過TCP監聽協議加速您的後端服務訪問,且您的後端服務部署在非阿里雲上,那麼您的後端服務需要支援解析Proxy Protocol,才能擷取到用戶端源IP。本部分以Nginx為例,為您說明後端服務如何支援解析Proxy Protocol以及如何擷取用戶端源IP。
開啟保持用戶端源IP。
在執行個體列表頁面,找到目標Global Acceleration執行個體,在操作列單擊配置監聽。
在監聽頁簽下,找到目標監聽,在操作列單擊編輯監聽。
在配置監聽和協議設定精靈頁面,單擊下一步。
在配置終端節點設定精靈頁面,在保持用戶端源IP頁簽下選擇保持,然後單擊下一步。
當後端服務部署在非阿里雲上時,擷取用戶端真實IP方式預設選擇為ProxyProtocol。
自動擷取:IPv4用戶端訪問後端服務,推薦使用此方式。此方式可以自動擷取用戶端IP,後端服務無需做任何改動。當後端服務部署在非阿里雲時,不支援使用該方式。
ProxyProtocol:IPv6用戶端訪問後端服務,推薦使用此方式。此方式需要後端伺服器支援解析Proxy Protocol,才能擷取到用戶端源IP資訊。
更多資訊,請參見背景資訊。
在組態稽核頁面,確認無誤後,單擊提交。
配置Nginx使其支援解析Proxy Protocol。
Nginx的
http{}
和stream{}
模組均可以接收Proxy Protocol,在http{}
模組或stream{}
模組中添加相應處理Proxy Protocol的連接埠即可。http { #... server { listen 8080 proxy_protocol; #在8080連接埠,開啟解析proxy protocol。 #... } } stream { #... server { listen 1235 proxy_protocol; #在1235連接埠,開啟解析proxy protocol。 #... } }
擷取用戶端源IP。
在開始解析Proxy Protocol後,Nginx會將用戶端源IP儲存在變數proxy_protocol_addr中。因此,您可以通過以下兩種方式擷取用戶端源IP:
對於HTTP流量,您可以將用戶端源IP儲存在HTTP要求標頭欄位中:
http { proxy_set_header X-Real-IP $proxy_protocol_addr; proxy_set_header X-Forwarded-For $proxy_protocol_addr; }
後端伺服器通過HTTP要求標頭中的
X-Forwarded-For
欄位擷取源IP,其中第一個IP即為用戶端源IP。X-Forwarded-For: 用戶端源IP, Proxy 伺服器1-IP, Proxy 伺服器2-IP,...
對於HTTP流量或TCP流量,您也可以將用戶端源IP儲存在日誌中,然後通過日誌資訊擷取用戶端源IP。
設定
http{}
模組和stream{}
模組的日誌格式,將用戶端源IP資訊儲存到日誌中。http { #... log_format combined '$proxy_protocol_addr - $remote_user [$time_local] ' ##在http{}模組的日誌格式中添加儲存用戶端源IP的變數proxy_protocol_addr。 '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"'; } #... stream { #... log_format basic '$proxy_protocol_addr - [$time_local] ' ##在stream{}模組的日誌格式中添加儲存用戶端源IP的變數proxy_protocol_addr。 '$protocol $status $bytes_sent $bytes_received ' '$session_time'; }
通過以下命令查看日誌資訊,擷取用戶端源IP。
tail -n -5 <日誌路徑>
以下內容為您展示一個完整的配置樣本:
worker_processes 4; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main '$proxy_protocol_addr $remote_addr - $remote_user [$time_local] "$request" '##在http{}模組日誌格式中添加儲存用戶端源IP的變數proxy_protocol_addr。 '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; sendfile on; keepalive_timeout 65; upstream backend { server 192.XX.XX.36:8080; server 192.XX.XX.37:8080; keepalive 2000; } server { listen 80 proxy_protocol; ##在80連接埠,開啟解析proxy protocol。 server_name example.com; proxy_set_header X-Real-IP $proxy_protocol_addr; ##在發給後端服務時,將用戶端源IP資訊插入到HTTP中。 proxy_set_header X-Forwarded-For $proxy_protocol_addr; access_log /var/log/nginx/access.log main; location / { proxy_pass http://backend; proxy_http_version 1.1; proxy_set_header Connection ""; } } } stream { log_format tcp_basic '$proxy_protocol_addr - [$time_local] ' ##在stream{}模組的日誌格式中添加儲存用戶端源IP的變數proxy_protocol_addr。 '$protocol $status $bytes_sent $bytes_received ' '$session_time'; upstream stream_backend { server 192.XX.XX.36:2003; server 192.XX.XX.37:2003; } server { listen 1234 proxy_protocol; ##在1234連接埠,開啟解析proxy protocol。 access_log /var/log/nginx/access_tcp.log tcp_basic; proxy_pass stream_backend; } }
查看日誌資訊,其中日誌資訊中的第一個IP地址即為用戶端源IP。