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