全部產品
Search
文件中心

Global Accelerator:保持用戶端源IP

更新時間:Jun 30, 2024

Global Accelerator (GA)支援保持用戶端源IP功能,後端伺服器可以通過該功能擷取發起訪問的用戶端源IP。本文為您介紹在不同情境中如何開啟保持用戶端源IP功能以及後端伺服器如何擷取用戶端源IP。

前提條件

您已經在Global Accelerator執行個體中配置了監聽。具體操作,請參見添加和管理智能路由類型監聽

背景資訊

通過Global Acceleration服務加速用戶端訪問後端伺服器,預設情況下後端伺服器只能擷取用戶端通過Global Acceleration訪問後端伺服器的終端節點群組出公網IP,不能擷取用戶端的源IP。如果您需要後端伺服器能擷取用戶端的源IP,您可以開啟Global Acceleration的保持用戶端源IP功能。Global Acceleration保持用戶端源IP功能根據監聽協議的不同,支援的情況也不同:

  • HTTPHTTPS:支援保持用戶端源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。

  1. 開啟保持用戶端源IP。

    HTTP和HTTPS監聽協議預設開啟保持用戶端源IP功能,並將用戶端源IP儲存在HTTP要求標頭的X-Forwarded-For欄位中,您可以通過X-Forwarded-For擷取用戶端源IP。

  2. 擷取用戶端源IP。

    後端伺服器收到的HTTP要求標頭中的X-Forwarded-For欄位如下,其中第一個IP即為用戶端源IP。

    X-Forwarded-For: 用戶端源IP, Proxy 伺服器1-IP, Proxy 伺服器2-IP,...

通過TCP監聽協議加速訪問阿里雲後端服務

如果您通過TCP監聽協議加速您的後端服務訪問,且您的後端服務部署在阿里雲上,那麼您開啟保持用戶端源IP功能後,後端伺服器可直接擷取用戶端源IP資訊。

  1. 開啟保持用戶端源IP。

    1. 登入Global Acceleration管理主控台

    2. 執行個體列表頁面,找到目標Global Acceleration執行個體,在操作列單擊配置監聽

    3. 監聽頁簽下,找到目標監聽,在操作列單擊編輯監聽

    4. 配置監聽和協議設定精靈頁面,單擊下一步

    5. 配置終端節點設定精靈頁面,在保持用戶端源IP列表中選擇保持,然後單擊下一步

      當後端服務部署在阿里雲上時,擷取用戶端真實IP方式預設選擇為自動擷取

      image.png

      • 自動擷取:IPv4用戶端訪問後端服務,推薦使用此方式。此方式可以自動擷取用戶端IP,後端服務無需做任何改動。當後端服務部署在非阿里雲時,不支援使用該方式。

      • ProxyProtocol:IPv6用戶端訪問後端服務,推薦使用此方式。此方式需要後端伺服器支援解析Proxy Protocol,才能擷取到用戶端源IP資訊。

      更多資訊,請參見背景資訊

    6. 組態稽核頁面,確認無誤後,單擊提交

  2. 擷取的用戶端源IP。

    本部分以後端服務類型為阿里雲Linux ECS執行個體為例,介紹如何查看已擷取的用戶端源IP。

    1. 登入後端Linux ECS伺服器。

    2. 執行以下命令,抓取HTTP流量。

      tcpdump tcp port [監聽連接埠] -n -X -s 0
    3. 從抓取的資料包中篩選資訊,查看用戶端源IP。

      經測試,開啟保持用戶端源IP功能後,可以在後端伺服器查看用戶端源IP。開啟保持用戶端源IP功能後,後端伺服器擷取到用戶端源IP

      未開啟保持用戶端源IP功能,只能在後端伺服器上查看到用戶端通過Global Acceleration訪問後端伺服器的終端節點群組出公網IP。未開啟保持用戶端源IP

通過TCP監聽協議加速訪問非阿里雲後端服務

如果您通過TCP監聽協議加速您的後端服務訪問,且您的後端服務部署在非阿里雲上,那麼您的後端服務需要支援解析Proxy Protocol,才能擷取到用戶端源IP。本部分以Nginx為例,為您說明後端服務如何支援解析Proxy Protocol以及如何擷取用戶端源IP。

  1. 開啟保持用戶端源IP。

    1. 登入Global Acceleration管理主控台

    2. 執行個體列表頁面,找到目標Global Acceleration執行個體,在操作列單擊配置監聽

    3. 監聽頁簽下,找到目標監聽,在操作列單擊編輯監聽

    4. 配置監聽和協議設定精靈頁面,單擊下一步

    5. 配置終端節點設定精靈頁面,在保持用戶端源IP頁簽下選擇保持,然後單擊下一步

      當後端服務部署在非阿里雲上時,擷取用戶端真實IP方式預設選擇為ProxyProtocol

      開啟保持用戶端源IP

      • 自動擷取:IPv4用戶端訪問後端服務,推薦使用此方式。此方式可以自動擷取用戶端IP,後端服務無需做任何改動。當後端服務部署在非阿里雲時,不支援使用該方式。

      • ProxyProtocol:IPv6用戶端訪問後端服務,推薦使用此方式。此方式需要後端伺服器支援解析Proxy Protocol,才能擷取到用戶端源IP資訊。

      更多資訊,請參見背景資訊

    6. 組態稽核頁面,確認無誤後,單擊提交

  2. 配置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。
            #...
        }
    }
  3. 擷取用戶端源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。

      1. 設定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';
        }
                        
      2. 通過以下命令查看日誌資訊,擷取用戶端源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。

    保持源IP-查看日誌

相關文檔