通過GA加速應用服務時,若需要擷取用戶端真實IP地址,您可以啟用GA的保持用戶端源IP功能。使用七層監聽時,可通過HTTP要求標頭的X-Forwarded-For欄位擷取用戶端真實IP地址;使用四層監聽時,根據後端服務類型的不同,支援自動擷取或需要適配Proxy Protocol來擷取用戶端真實IP地址。
僅智能路由類型監聽支援保持用戶端源IP;自訂路由類型監聽預設不支援,如需保持用戶端源IP,請向商務經理申請。
HTTP或HTTPS監聽
擷取方式
通過保持客戶端源IP功能擷取。該功能預設開啟。
GA將用戶端真實IP儲存在HTTP要求標頭的X-Forwarded-For欄位中,後端伺服器進行相應配置後即可擷取。第一個IP即為用戶端真實IP。
X-Forwarded-For: <用戶端真實IP, Proxy 伺服器1-IP, Proxy 伺服器2-IP, ...>
操作步驟
本文後端伺服器以Alibaba Cloud Linux 3作業系統、Nginx 1.20.1版本配置為例介紹。具體請以您實際使用的環境為準。
-
在伺服器執行
nginx -V | grep http_realip_module命令,檢查Nginx伺服器是否安裝了http_realip_module模組。Nginx使用http_realip_module模組解析X-Forwarded-For記錄。如果返回資訊中包括
--with-http_realip_module,表示已安裝http_realip_module模組,可進行下一步。說明-
Nginx 1.0.4 版本(2011年)開始支援http_realip_module 模組。如果您使用的Nginx版本過老,建議您備份配置資料並升級Nginx版本。
-
如果未安裝http_realip_module模組,需要重新編譯安裝Nginx並安裝http_realip_module 模組。操作較為繁瑣,建議您使用類似yum的包管理器安裝Nginx。
-
-
修改Nginx服務組態檔並儲存,修改點可參考下方說明。執行
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"'; # ... } -
執行
sudo nginx -s reload命令,重新載入Nginx設定檔。 -
擷取用戶端真實IP。
您可以通過檢查Nginx日誌來判斷是否成功擷取到了用戶端的真實IP地址。
執行
tail -n <指定返回日誌條數> <日誌路徑>命令,在返回的日誌資訊中查看$http_x_forwarded_for變數對應的欄位,第一個IP地址即為用戶端源IP。本文中,使用Nginx記錄檔預設路徑:
/var/log/nginx/access.log。[root@izxxx ~]# tail -n 1 /var/log/nginx/access.log 172.20xxx - - [17/Oct/2024:17:46:49 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0" "47.243.xxx"說明如果您為Global Acceleration開啟了健全狀態檢查,建議每次返回多條日誌進行查看,或暫時將健全狀態檢查間隔時間範圍調大,避免包含用戶端源IP的日誌資訊被健全狀態檢查日誌資訊覆蓋。
TCP監聽
擷取方式
通過保持客戶端源IP功能擷取。該功能開啟後,需要選擇擷取用戶端真實IP方式。
後端服務類型不同,支援的擷取方式有所差異。
-
自動擷取:直接透傳用戶端源IP,後端伺服器擷取到的用戶端IP即為真實IP地址。
-
Proxy Protocol:後端伺服器需要適配Proxy Protocol,方可擷取用戶端真實IP地址。
重要-
注意Proxy Protocol需要Proxy 伺服器和後端伺服器都支援該協議才能正常使用。如果後端伺服器不具備解析Proxy Protocol協議能力,直接開啟特性開關,很可能會導致後端服務解析異常,從而影響服務可用性。
-
GA監聽支援通過Proxy Protocol攜帶原始串連資訊(源IP、目的IP、源連接埠、目的連接埠等)並添加到TCP資料頭中,且不會丟棄或覆蓋任何原有資料。
-
GA僅支援Proxy Protocol v1版本。Proxy Protocol v1版本僅支援TCP協議,更多資訊,請參見The PROXY protocol。
-
後端服務部署在阿里雲
|
後端服務類型 |
是否支援擷取用戶端源IP |
對應擷取方式 |
|
|
ECS |
支援 但必須為專用網路類型,且ECS所在安全性群組需放通所有用戶端源IP。 |
|
|
|
ALB |
不支援 |
不涉及 |
|
|
NLB |
支援 |
|
|
|
CLB |
支援 但需要CLB的後端伺服器所在安全性群組放通所有用戶端源IP。 請注意在以下情形中,後端伺服器無法擷取用戶端源IP:
|
|
|
|
OSS |
不支援 |
不涉及 |
|
|
ENI |
支援 但需要ENI所在安全性群組放通所有用戶端源IP。 |
|
|
|
自訂私網IP |
支援 |
Proxy Protocol |
|
|
阿里雲公網 IP 警告
當終端節點為阿里雲公網IP時,如果該公網IP解除綁定原有執行個體並重新綁定至其他執行個體,可能會導致保持用戶端源IP的能力失效,並造成流量中斷。為恢複該終端節點保持用戶端源IP的能力,您可以刪除並重建相應的終端節點,或者聯絡商務經理協助處理。 |
綁定專用網路類型ECS執行個體 |
支援 |
|
|
綁定NLB執行個體 |
支援 |
|
|
|
綁定ALB執行個體 |
不支援 |
不涉及 |
|
|
綁定私網CLB執行個體 |
支援 |
|
|
|
綁定ENI |
支援 |
|
|
|
綁定公網NAT執行個體 |
支援 |
Proxy Protocol |
|
後端服務部署在非阿里雲
|
後端服務類型 |
是否支援擷取用戶端源IP |
對應擷取方式 |
|
自訂公網IP |
支援 |
Proxy Protocol |
|
自訂網域名 |
支援 |
用戶端通過IPv6類型加速IP接入GA,或者GA與後端使用IPv6協議通訊,均需要使用Proxy Protocol來擷取用戶端真實IP地址。
操作步驟
本文後端伺服器以Alibaba Cloud Linux 3作業系統、Nginx 1.20.1版本配置為例介紹。具體請以您實際使用的環境為準。
自動擷取
-
開啟保持用戶端源IP。
-
在執行個體列表頁面,找到目標Global Acceleration執行個體,在操作列單擊配置監聽。
-
在監聽頁簽下,找到目標TCP監聽,在操作列單擊編輯監聽。
-
在配置監聽和協議設定精靈頁面,單擊下一步。
-
在配置終端節點設定精靈頁面,在保持客戶端源IP列表中選擇保持,然後單擊下一步。
當後端服務部署在阿里雲上時,擷取客戶端真實IP方式預設選擇為自動擷取。
將保持用戶端源IP設定為保持。若IPv6用戶端訪問後端服務,擷取用戶端真實IP方式推薦選擇ProxyProtocol。
-
在組態稽核頁面,確認無誤後,單擊提交。
-
查看Nginx服務組態檔。
執行
nginx -t命令查看設定檔所在路徑,預設通常為/etc/nginx/nginx.conf,具體請以實際環境為準。說明如果後端服務僅需要處理HTTP和HTTPS流量,則只需要確保Nginx伺服器支援
http{}模組;如果後端服務還需要處理TCP流量,則需確保Nginx伺服器已支援stream{}模組。自Nginx 1.9.0版本起,新增了
stream{}模組,但該模組並不預設安裝,需自行編譯安裝以實現對stream{}模組的支援。#處理HTTP流量 http { # 預設配置 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; # 以80監聽連接埠為例 server { listen 80; #... } } #處理TCP流量(可按需增加) stream { log_format main_stream '$remote_addr - [$time_local] ' '"$protocol" $status $bytes_sent $bytes_received ' '"$session_time"'; access_log /var/log/nginx/stream_access.log main_stream; # 以4000監聽連接埠為例 server { listen 4000; #... } } -
擷取用戶端源IP。
-
方式1:您可以通過檢查Nginx日誌來判斷是否成功擷取到了用戶端的真實IP地址。
執行
tail -n <指定返回日誌條數> <日誌路徑>命令,在返回的日誌資訊中查看第一個IP地址($remote_addr變數對應的欄位),即為用戶端源IP。-
對於HTTP流量:
本文情境中,記錄檔路徑為:
/var/log/nginx/access.log。[root@xxx ~]# tail -n 1 /var/log/nginx/access.log 47.243.xxx.xxx - [21/Oct/2024:14:01:06 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 xxx" -
對於TCP流量:
本文情境中,記錄檔路徑為:
/var/log/nginx/stream_access.log。[root@iZrxxx xxx]# tail -n 5 /var/log/nginx/stream_access.log 121.40.xxx.xxx [24/Jan/2025:10:29:34 +0800] "TCP" 200 0 16 "3.217" 121.40.xxx.xxx [24/Jan/2025:10:29:44 +0800] "TCP" 200 0 15 "2.935" 121.40.xxx.xxx [24/Jan/2025:10:29:57 +0800] "TCP" 200 0 7 "4.908" 121.40.xxx.xxx [24/Jan/2025:10:30:16 +0800] "TCP" 200 0 26 "10.474" 121.40.xxx.xxx [24/Jan/2025:10:30:25 +0800] "TCP" 200 0 10 "3.368"
-
-
方式2:您可以通過抓取資料包來判斷是否成功擷取到了用戶端的真實IP地址。
執行
tcpdump tcp port [監聽連接埠] -n -X -s 0命令,從抓取的資料包中查看用戶端真實IP地址。[root@iZrxxx ~]# tcpdump tcp port 4000 -n -X -s 0 dropped privs to tcpdump tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 10:31:59.216390 IP 121.40.xxx.xxx.52352 > 172.20.106.148.terabase: Flags [S], seq 3468880686, win 65535, options [nop,nop,nop,nop,nop,nop,nop,nop,mss 1460,sackOK,TS val 1793314199 ecr 0,nop,wscale 9], length 0 0x0000: 4500 0044 801a 4000 4006 36a9 7928 f41f E..D..@.@.6.y(.. 0x0010: ac14 6a94 cc80 0fa0 cec2 eb2e 0000 0000 ..j............. 0x0020: c002 ffff d173 0000 0101 0101 0101 0101 .....s.......... 0x0030: 0204 05b4 0402 080a 6ae3 cd97 0000 0000 ........j....... 0x0040: 0103 0309 .... 10:31:59.216419 IP 172.20.106.148.terabase > 121.40.xxx.xxx.52352: Flags [S.], seq 28697778872, ack 3468880687, win 65160, options [mss 1460,sackOK,TS val 1603313796 ecr 1793314199,nop,wscale 7], length 0 0x0000: 4500 003c 0000 4000 4006 b6cb ac14 6a94 E..<..@.@.....j. 0x0010: 7928 f41f 0fa0 cc80 ab0d 59b8 cec2 eb2f y(........Y..../ 0x0020: a012 fe88 841f 0000 0204 05b4 0402 080a ................ 0x0030: 5f90 a084 6ae3 cd97 0103 0307 _...j.......
-
通過Proxy Protocol擷取
-
開啟保持用戶端源IP。
-
在執行個體列表頁面,找到目標Global Acceleration執行個體,在操作列單擊配置監聽。
-
在監聽頁簽下,找到目標TCP監聽,在操作列單擊編輯監聽。
-
在配置監聽和協議設定精靈頁面,單擊下一步。
-
在配置終端節點設定精靈頁面,在保持客戶端源IP頁簽下選擇保持,然後單擊下一步。
當後端服務部署在非阿里雲上時,擷取客戶端真實IP方式預設選擇為ProxyProtocol。
在終端節點配置頁面,將保持用戶端源IP設定為保持。
-
在組態稽核頁面,確認無誤後,單擊提交。
-
修改Nginx服務組態檔並儲存,修改點可參考下方說明。
執行
nginx -t命令查看設定檔所在路徑,預設通常為/etc/nginx/nginx.conf,具體請以實際環境為準。說明如果後端服務僅需要處理HTTP和HTTPS流量,則只需要確保Nginx伺服器支援
http{}模組;如果後端服務還需要處理TCP流量,則需確保Nginx伺服器已支援stream{}模組。自Nginx 1.9.0版本起,新增了
stream{}模組,但該模組並不預設安裝,需自行編譯安裝以實現對stream{}模組的支援。#處理HTTP流量 http { #確保在http{}模組的日誌格式中添加儲存用戶端源IP的變數$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"'; access_log /var/log/nginx/access.log main; # 以80監聽連接埠為例,開啟解析proxy_protocol server { listen 80 proxy_protocol; #... } } #處理TCP流量(可按需增加) stream { #確保在stream{}模組的日誌格式中添加儲存用戶端源IP的變數$proxy_protocol_addr log_format main_stream '$proxy_protocol_addr - $remote_addr - $protocol [$time_local] ' '$status $bytes_sent $bytes_received $session_time'; access_log /var/log/nginx/stream_access.log main_stream; # 以12345監聽連接埠為例,開啟解析proxy_protocol server { listen 12345 proxy_protocol; #... } } -
執行
sudo nginx -s reload命令,重新載入Nginx設定檔。 -
擷取用戶端源IP。
您可以通過檢查Nginx日誌來判斷是否成功擷取到了用戶端的真實IP地址。
執行
tail -n <指定返回日誌條數> <日誌路徑>命令,在返回的日誌資訊中查看$proxy_protocol_addr變數對應的IP地址,即為用戶端源IP。-
對於HTTP流量:
本文情境中,記錄檔路徑為:
/var/log/nginx/access.log。[root@xxx ~]# tail -n 1 /var/log/nginx/access.log 47.243.xxx - 47.251.xxx - - [21/Oct/2024:16:57:41 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0" -
對於TCP流量:
本文情境中,記錄檔路徑為:
/var/log/nginx/stream_access.log。[root@i-xxx ~]# tail -n 1 /var/log/nginx/stream_access.log 47.243 47.251 - TCP [23/Oct/2024:17:19:44 +0800] 200 0 1 0.000
-
UDP監聽
擷取方式
通過保持客戶端源IP功能擷取。該功能開啟後,預設僅支援自動擷取方式,GA直接透傳用戶端源IP,後端伺服器擷取到的用戶端IP即為真實IP地址。
UDP監聽開啟保持客戶端源IP,有以下限制:
-
僅隨用隨付的GA執行個體支援。
如果您的隨用隨付GA執行個體不支援為UDP監聽開啟保持用戶端源IP,可能是由於執行個體版本不支援。如需使用,請向商務經理申請升級執行個體。
-
僅支援後端服務類型為 ECS 、 ENI 、 NLB 。其中,NLB類型的保持客戶端源IP功能預設不開放,如需使用,請向商務經理申請。
-
僅支援IPv4後端伺服器擷取IPv4用戶端源IP,IPv6後端伺服器擷取IPv6用戶端源IP。
操作步驟
本文後端伺服器以Alibaba Cloud Linux 3作業系統、Nginx 1.20.1版本配置為例介紹。具體請以您實際使用的環境為準。
-
開啟保持用戶端源IP。
-
在執行個體列表頁面,找到目標Global Acceleration執行個體,在操作列單擊配置監聽。
-
在監聽頁簽下,找到目標UDP監聽,在操作列單擊編輯監聽。
-
在配置監聽和協議設定精靈頁面,單擊下一步。
-
在配置終端節點設定精靈頁面,在保持客戶端源IP頁簽下選擇保持,然後單擊下一步。
此時,擷取客戶端真實IP方式預設選擇為自動擷取。
-
在組態稽核頁面,確認無誤後,單擊提交。
-
查看Nginx服務組態檔。
執行
nginx -t命令查看設定檔所在路徑,預設通常為/etc/nginx/nginx.conf,具體請以實際環境為準。說明後端服務處理UDP流量,需確保Nginx伺服器已支援
stream{}模組。自Nginx 1.9.0版本起,新增了
stream{}模組,但該模組並不預設安裝,需自行編譯安裝以實現對stream{}模組的支援。#... #處理UDP流量(請確保包括該模組) stream { log_format main_stream '$remote_addr - [$time_local] ' '"$protocol" $status $bytes_sent $bytes_received ' '"$session_time"'; access_log /var/log/nginx/stream_access.log main_stream; # 以UDP 4000監聽連接埠為例 server { listen 4000 udp; #... } } -
擷取用戶端源IP。
-
方式1:您可以通過檢查Nginx日誌來判斷是否成功擷取到了用戶端的真實IP地址。
執行
tail -n <指定返回日誌條數> <日誌路徑>命令,在返回的日誌資訊中查看第一個IP地址($remote_addr變數對應的欄位),即為用戶端源IP。本文情境中,記錄檔路徑為:
/var/log/nginx/stream_access.log。[root@iZ2zxxx ~]# tail -n 5 /var/log/nginx/stream_access.log 47.251.xxx.xxx - [24/Jan/2025:13:37:43 +0800] "UDP" 200 0 12 "600.099" 47.251.xxx.xxx - [24/Jan/2025:13:39:11 +0800] "UDP" 200 0 12 "600.088" 47.251.xxx.xxx - [24/Jan/2025:13:39:28 +0800] "UDP" 200 0 14 "600.012" 47.251.xxx.xxx - [24/Jan/2025:13:39:37 +0800] "UDP" 200 0 14 "600.009" 47.251.xxx.xxx - [24/Jan/2025:13:41:04 +0800] "UDP" 200 0 14 "600.086" -
方式2:您可以通過抓取資料包來判斷是否成功擷取到了用戶端的真實IP地址。
執行
tcpdump udp port [監聽連接埠] -n -X -s 0命令,從抓取的資料包中查看用戶端真實IP地址。[root@iz2xxx ~]# tcpdump udp port 4000 -n -X -s 0 dropped privs to tcpdump tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 14:04:06.047337 IP 47.251.xxx.xxx 55491 > 10.5.120.213.terabase: UDP, length 14 0x0000: 4500 002a 6e1e 4000 4011 a221 2ffb 77ae E..*n.@.@..!/w. 0x0010: 0a05 78d5 d8c3 0fa0 0016 12fb 4865 6c6c ..x.........Hell 0x0020: 6f2c 2055 4450 3032 210a o, UDP02!.
-
常見問題
保持用戶端源IP功能開啟後不生效,可能是哪些原因?
HTTP或HTTPS監聽下,如果後端伺服器不支援記錄和處理
X-Forwarded-For欄位,則開啟保持用戶端源IP功能後不生效。TCP監聽下:
後端服務部署地為阿里雲時,如果後端執行個體或阿里雲公網IP綁定執行個體不是專用網路類型執行個體,則開啟保持用戶端源IP功能後不生效。
後端服務部署地為非阿里雲時, 需要後端伺服器支援解析Proxy Protocol,才能擷取到用戶端源IP資訊,否則不生效。
因為在您開啟保持用戶端源IP功能的情況下,Global Acceleration會使用Proxy Protocol保持用戶端源IP,如果您的後端伺服器不支援解析Proxy Protocol,則會導致後端伺服器無法正確解析加速流量。
用戶端使用IPv6地址訪問後端的IPv4服務時,需要後端伺服器支援解析Proxy Protocol,才能擷取到用戶端源IP資訊,否則不生效。
UDP監聽下,如果用戶端使用IPv6地址訪問後端的IPv4服務時,則開啟保持用戶端源IP功能後不生效。
如何關閉保持用戶端源IP功能?
對於HTTP或HTTPS監聽,預設開啟保持用戶端源IP功能,無法關閉。
對於TCP及UDP監聽,您可以直接在控制台進行關閉。操作步驟如下:
在執行個體列表頁面,找到目標Global Acceleration執行個體,在操作列單擊配置監聽。
在監聽頁簽下,找到目標監聽,在操作列單擊編輯。
在配置監聽和協議設定精靈頁面,單擊下一步。
在配置終端節點設定精靈頁面,配置保持客戶端源IP為不保持,然後單擊下一步。
在組態稽核設定精靈頁面,確認無誤後,單擊提交。
Global AccelerationIPv6轉換IPv4時如何擷取用戶端源IP?
針對HTTP或HTTPS監聽:IPv6用戶端與IPv4用戶端均僅支援通過HTTP要求標頭的
X-Forwarded-For欄位擷取用戶端源IP。針對TCP監聽:IPv6用戶端僅支援ProxyProtocol方式。ProxyProtocol方式需要後端伺服器支援解析Proxy Protocol,才能擷取到用戶端源IP資訊,否則訪問會失敗。
針對UDP監聽:不支援擷取IPv6用戶端源IP。
相關文檔
控制台操作文檔
-
您還可以通過GA的訪問日誌功能擷取用戶端源IP,通過為目標終端節點群組建立訪問日誌,採集到的訪問日誌將會投遞到終端節點群組所在地區SLS的日誌庫中。在對應日誌庫頁面的原始日誌頁簽下,通過client_ip欄位查看用戶端源IP的訪問請求資訊。
-
瞭解關於終端節點群組後端服務更多配置資訊及注意事項,請參見終端節點群組與終端節點和添加和管理智能路由類型監聽的終端節點群組。
API文檔
您可以在調用以下API時,通過參數EnableClientIPPreservation(自動擷取方式)和EnableProxyProtocol(ProxyProtocol 方式)配置擷取用戶端真實IP的方式。