在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 + | | + + | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+