全部產品
Search
文件中心

Alibaba Cloud Linux:通過vtoa擷取地址轉換後的真實用戶端地址

更新時間:Jul 17, 2024

在DDoS高防等FullNAT情境下,用戶端地址會被轉換成FullNAT節點的地址。安裝了vtoa的後端伺服器可以在Alibaba Cloud Linux 3(核心5.10.134-15及以上版本)上基於TOA調用getsockoptgetpeername,擷取真實的用戶端地址。支援IPv4和IPv6。

使用限制

系統要求:Alibaba Cloud Linux 3,核心5.10.134-15及以上版本。

說明

您可以通過uname -r命令查詢鏡像的核心版本。

應用情境

  • DDoS高防:使用者請求在轉寄節點(圖中是 DDoS 防護節點)上經歷地址轉換(FullNAT)。DDoS開啟TOA機制,把真實用戶端的IP連接埠等資訊放在TCP Option中,傳遞給後端來源站點。後端來源站點伺服器通過vtoa,擷取真實用戶端的IP地址

image
  • CDN加速:業務請求由CDN加速節點轉寄至來源站點,來源站點可以通過 vtoa 擷取真實用戶端地址。

安裝與配置

警告

vtoa會改變系統調用getpeername的行為,可能為業務帶來非預期影響,請確認需要該功能後再安裝。

安裝與卸載

  • 安裝

    sudo yum install vtoa -y
  • 卸載

    sudo yum remove vtoa -y
說明

安裝後,vtoa即生效,預設開機自動啟動。卸載後,vtoa功能失效。

配置vtoa

vtoa安裝後即生效,預設開機自動啟動。您通常不需要手動設定vtoa。

  • 開啟vtoa

    sudo systemctl start vtoa
  • 關閉vtoa

    sudo systemctl stop vtoa
  • 設定開機自啟動vtoa

    sudo systemctl enable vtoa
  • 關閉開機自啟動vtoa

    sudo systemctl disable vtoa
  • 查看vtoa狀態

    systemctl status vtoa

擷取用戶端真真實位址

vtoa開啟後,您可通過系統調用getsockoptgetpeername來擷取用戶端真真實位址。

(推薦)調用getsockopt擷取

重要

要求核心5.10.134-17及以上版本(核心版本可通過uname -r命令查看)。

vtoa提供一個新的optname,用於擷取真實用戶端地址,其固定值為 1348。以下為C程式碼範例。

struct sockaddr caddr;
int optlen = sizeof(caddr);
int optname = 1348;

getsockopt(fd, IPPROTO_IP, optname, &caddr, &optlen);
// caddr.sa_family可能為AF_INET或AF_INET6,分別對應IPv4和IPv6地址

調用getpeername擷取

重要

該功能在 Alibaba Cloud Linux 3(核心5.10.134-15及以上版本)提供支援。未來可能廢棄。

vtoa開啟後,會返回真實的用戶端地址資訊。以下為C程式碼範例。

struct sockaddr caddr;
int caddr_len = sizeof(caddr);

getpeername(fd, &caddr, &caddr_len);
// caddr.sa_family可能為AF_INET或AF_INET6,分別對應IPv4和IPv6地址
// accept()也可用於擷取用戶端地址,用法相似

瞭解支援的toa option格式

vtoa解析的地址資訊由TCP option攜帶,需要滿足一定的格式要求。若TCP option不滿足格式要求,則會被vtoa忽略,對應用無影響,相當於未啟用vtoa。

  • TOA(opcode = 254)

    opsize = 8,ip/port為網路序

        0                   1                   2                   3
        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |     opcode    |    opsize     |              port             |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                              ip                               |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  • TOA_V6(opcode = 253)

    opsize = 20,ip/port為網路序

        0                   1                   2                   3
        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |     opcode    |    opsize     |              port             |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                                                               |
       +                                                               +
       |                                                               |
       +                              ip                               +
       |                                                               |
       +                                                               +
       |                                                               |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+