本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
在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 + | | + + | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+