更新时间:2025-03-27 10:56:20
1. 当前版本TOA只支持linux内核版本为4.x、5.x、6.x
2. 当前版本TOA不支持ipv6 TOA,因此您的源站程序需要监听ipv4协议。如Go语言net包默认监听ipv6协议
func Listen(network, address string) (Listener, error) Listen函数在本地网络地址上进行公告。 network必须是"tcp"、"tcp4"、"tcp6"、"unix"或"unixpacket"。 对于TCP网络,如果address参数中的主机为空或是一个未指定的IP地址,Listen将在本地系统的所有可用单播和任播IP地址上监听。要仅使用IPv4,请使用网络"tcp4"。 address可以使用主机名,但不推荐这样做,因为这将仅为主机的最多一个IP地址创建监听器。 如果address参数中的端口为空或为"0",例如"127.0.0.1:"或"[::1]:0",则会自动选择一个端口号。可以使用Listener的Addr方法来发现所选择的端口。 有关网络和地址参数的描述,请参见func Dial
3.如果您的源站程序使用如上方法进行监听端口请求改为
net.Listen("tcp4", "0.0.0.0:8080")
2.安装编译环境(gcc、kernel-headers和kernel-devel)。
CentOS系统
#yum install gcc kernel-headers kernel-devel -y
Ubuntu/Debian系统
#apt-get install gcc linux-headers-$(uname -r) -y
3.编译TOA模块。
将源码包解压,执行cd命令进入文件夹中并编译源码文件。编译过程未提示error,说明编译成功,检查当前目录下是否已经生成toa.ko文件。
//源码包路径 cd toa_kernel/ //编译 make
4.加载TOA模块。
#mv toa.ko /lib/modules/`uname -r`/kernel/net/netfilter/ipvs/toa.ko && depmod #insmod /lib/modules/`uname -r`/kernel/net/netfilter/ipvs/toa.ko
5.确认TOA模块是否已加载成功。
# lsmod | grep toa
6.设置TOA模块,开启系统启动时自动加载功能。
CentOS系统
Ubuntu/Debian系统
创建文件/etc/modules-load.d/toa.conf
,并在文件中添加以下内容。
toa
创建文件/etc/sysconfig/modules/toa.modules
,并在文件中添加以下内容。
#!/bin/bashif [ -e /lib/modules/`uname -r`/kernel/net/netfilter/ipvs/toa.ko ] ; then insmod /lib/modules/`uname -r`/kernel/net/netfilter/ipvs/toa.ko > /dev/null 2>&1 fi
执行以下命令,授予toa.modules
文件可执行权限。
sudo chmod +x /etc/sysconfig/modules/toa.modules
7.执行sudo reboot
命令,重启系统。
安装完成后,服务器能够正常获取真实访问源IP。
如果仍无法获取真实访问源IP,建议您执行lsmod|grep toa
命令检测TOA模块的加载情况。如果TOA模块未加载,您可以执行modprobe toa
命令手动加载。加载成功后,您可以查看服务端访问日志,重新测试主机能否获取真实的访问源IP。
临时关闭TOA :rmmod 路径/模块名
。
rmmod toa.ko
卸载TOA模块。
rmmod toa
确认TOA模块是否卸载成功。若提示“TOA unloaded”,则说明卸载成功。
dmesg -T
监控TOA状态。
cat /proc/net/toa_stats
其中主要的监控指标对应的含义如下所示:
指标名称 | 说明 |
syn_recv_sock_toa | 接收带有 TOA 信息的连接个数。 |
syn_recv_sock_no_toa | 接收并不带有 TOA 信息的连接个数。 |
getname_toa_ok | 调用 getsockopt 获取源 IP 成功即会增加此计数,另外调用 accept 函数接收客户端请求时也会增加此计数。 |
getname_toa_mismatch | 调用 getsockopt 获取源 IP 时,当类型不匹配时,此计数增加。例如某条客户端连接内存放的是 IPv4 源 IP,并非为 IPv6 地址时,此计数便会增加。 |
getname_toa_empty | 对某一个不含有 TOA 的客户端文件描述符调用 getsockopt 函数时,此计数便会增加。 |
ip6_address_alloc | 当 TOA 内核模块获取 TCP 数据包中保存的源 IP、源 Port 时,会申请空间保存信息。 |
ip6_address_free | 当连接释放时,toa 内核模块会释放先前用于保存源 IP、源 port 的内存,在所有连接都关闭的情况下,所有 CPU 的此计数相加应等于 ip6_address_alloc 的计数。 |