通过vtoa获取地址转换后的真实客户端地址

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

在DDoS高防等FullNAT场景下,客户端地址会被转换成FullNAT节点的地址。安装了vtoa的后端服务器可以在Alibaba Cloud Linux 3(内核5.10.134-15及以上版本)上基于TOA调用getsockoptgetpeername,获取真实的客户端地址。支持IPv4和IPv6。

使用限制

系统要求:Alibaba Cloud Linux 3,内核5.10.134-15及以上版本。

说明

您可以通过uname -r命令查询镜像的内核版本。

应用场景

  • DDoS高防:用户请求在转发节点(图中是 DDoS 防护节点)上经历地址转换(FullNAT)。DDoS开启TOA机制,把真实客户端的IP端口等信息放在TCP Option中,传递给后端源站。后端源站服务器通过vtoa,获取真实客户端的IP地址

image
  • 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开启后,您可通过系统调用getsockoptgetpeername来获取客户端真实地址。

(推荐)调用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                               +
       |                                                               |
       +                                                               +
       |                                                               |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+