在DDoS高防等FullNAT情境下,用戶端地址會被轉換成FullNAT節點的地址。安裝了vtoa的後端伺服器可以在Alibaba Cloud Linux 3(核心5.10.134-15及以上版本)上基於TOA調用getsockopt或getpeername,擷取真實的用戶端地址。支援IPv4和IPv6。
使用限制
系統要求:Alibaba Cloud Linux 3,核心5.10.134-15及以上版本。
您可以通過uname -r命令查詢鏡像的核心版本。
應用情境
DDoS高防:使用者請求在轉寄節點(圖中是 DDoS 防護節點)上經歷地址轉換(FullNAT)。DDoS開啟TOA機制,把真實用戶端的IP連接埠等資訊放在TCP Option中,傳遞給後端來源站點。後端來源站點伺服器通過
vtoa,擷取真實用戶端的IP地址。
CDN加速:業務請求由CDN加速節點轉寄至來源站點,來源站點可以通過
vtoa擷取真實用戶端地址。
安裝與配置
vtoa會改變系統調用getpeername的返回結果,存在下述風險,請確認需要該功能後再安裝:
若同時存在其他網路組件,通過 eBPF 等方式修改
getpeername結果(如Cilium),可能與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開啟後,您可通過系統調用getsockopt或getpeername來擷取用戶端真真實位址。
(推薦)調用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 + | | + + | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+