【转】通过 TOA 获取客户端真实 IP(仅针对 TCP 协议)

蛋蛋 2025年06月20日 9 0

转自:https://cloud.tencent.com/document/product/608/14429
或:https://support.huaweicloud.com/intl/zh-cn/ga_faq/ga_05_9001.html
根据腾讯云文档关于“通过 TOA 获取客户端真实 IP(仅针对 TCP 协议)”的说明,以下是整理的笔记,包括安装方法及具体命令。这些步骤涉及在后端服务器上安装和配置 TOA 模块,以便在使用四层负载均衡时获取客户端的真实 IP。


TOA(TCP Option Address)获取客户端真实 IP

基本原理

加速通道转发数据包时,数据包同时会做 SNAT 和 DNAT,即数据包的源地址和目标地址均修改。源站看到的数据包的源地址是加速通道转发 IP 地址,而并非是客户端的真实 IP。为了将客户端 IP 传给服务器,加速通道将客户端的 IP 和 Port 在转发时放入了自定义的 tcp option 字段中。如下:

#define TCPOPT_ADDR 200
#define TCPOLEN_ADDR 8   /* |opcode|size|ip+port| = 1 + 1 + 6 */

/*
    * insert client ip in tcp option.
    * must be 4 bytes alignment.
    */

    struct ip_vs_tcpo_addr{
        __u8 opcode;
            __u8 opsize;
            __u16 port;
            __u32 addr;
    };

Linux 内核在监听套接字收到三次握手的 ACK 包之后,会从 SYN_REVC 状态进入到 TCP_ESTABLISHED 状态。这时内核会调用 tcp_v4_syn_recv_sock 函数。 Hook 函数 tcp_v4_syn_recv_sock_toa首先调用原有的tcp_v4_syn_recv_sock函数,然后调用 get_toa_data 函数从 TCP OPTION 中提取出 TOA OPTION,并存储在 sk_user_data 字段中。再用 inet_getname_toa hook inet_getname,在获取源 IP 地址和端口时,首先调用原来的inet_getname,然后判断 sk_user_data 是否为空,如果有数据从其中提取真实的 IP 和 port,替换 inet_getname 的返回。
服务端程序在用户态调用 getpeername,返回的 IP 和 port 即为客户端的原始 IP。

安装和配置步骤

安装 TOA 模块

首先确认你的服务器环境支持加载 TOA 模块。以下是编译和安装 TOA 模块的步骤:

  1. 准备环境

    确保安装了编译所需的工具和内核开发包:

   sudo yum groupinstall "Development Tools"
   sudo yum install kernel-devel-$(uname -r)
  1. 下载 TOA 源码

    前往 TOA 模块的源码仓库或官方网址下载源码。在此假定你已经下载到你的工作目录:
    注:腾讯toa安装链接:https://cloud.tencent.com/document/product/608/18945

   wget https://thunder-pro-mainland-1258348367.cos.ap-guangzhou.myqcloud.com/TOA/toa.tar.gz
   tar -xzvf toa.tar.gz
  1. 编译模块

    使用 make 命令编译模块:

   make
  1. 安装模块

    将编译好的模块加载到内核中:

   sudo insmod toa.ko

验证模块是否成功加载:

   lsmod | grep toa

验证

例如:nignx中的访问日志,获取到的是真实的用户IP即可。

tail -f /uar/local/nginx/var/logs/access.log

为保障 TOA 内核模块运行的稳定性,TOA 内核模块还提供了监控功能。在插入 toa.ko 内核模块后,可以通过以下两种方式监控 TOA 模块的工作状态。
执行以下命令查看 TOA 相关的计数状态。
cat /proc/net/toa_stats

其中主要的监控指标对应的含义如下所示:

注意事项

  • 兼容性和支持:确保你所使用的内核版本和负载均衡器支持 TOA 功能。
  • 性能影响:解析额外的 TCP 选项会有少量性能影响,请在高负载环境下进行相应测试。
  • 安全合规:遵循相关的安全和数据合规要求,确保收集的 IP 信息符合法律规定。

TOA(TCP Option Address)如何修改CODE

获取源码包,在编译之前修改对应code

# grep -ri 200 *
toa.h:#define TCPOPT_TOA  200
Last Updated: 2025/06/20 14:19:29
centos7.6安装FTP服务 [nginx]OpenResty跟nginx有什么区别