本文中含有需要您注意的重要提示信息,忽略該信息可能對您的業務造成影響,請務必仔細閱讀。
在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
的行為,可能為業務帶來非預期影響,請確認需要該功能后再安裝。
安裝與卸載
安裝
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 + | | + + | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+