TOA
此功能为商业版本专有。
在TCP负载均衡时,TCP源站读取到的客户端IP信息皆为负载均衡服务器的IP;为了解决这个问题,很多云服务厂商推出了TOA模块,让我们可以在TCP通讯时传递客户端真实IP。
原理
老的网络传输过程如下:
此时源站只只知道负载均衡服务器的IP,而无法知道客户端真实IP。增加TOA模块之后:
其中:cloud-toa进程
- 负责将回源的TCP数据包中增加TCP选项,此选项中包含了客户端的真实IP和端口cloud-toa模块
- 负责解析回源的TCP数据包中的TCP选项,并替换数据包中的源地址部分,这样源站的相关进程读取到的地址就是客户端的IP地址
使用TOA后,由于每个回源的数据包都需要二次处理后才能发出,所以会导致一定性能的下降。
启用TOA功能
注意:请在你确保完全了解TOA原理后再使用本功能,不然会带来难以预料的后果!
以下步骤均使用 root
用户或者使用 su
运行。
步骤1:检查源站服务器是否已安装TOA模块
注意:这里说的是 源站服务器,即源站所在的服务器,不是边缘节点服务器。
在源站服务器上执行命令:
lsmod|grep toa
如果为空,则表示尚未安装TOA模块。
步骤2:为源站服务器安装TOA模块
下载内核头文件:
# CentOS、RockyLinux等
yum install kernel-devel
从 https://github.com/tjbrains/toa
中下载可以编译的TOA模块源码:
wget "https://github.com/tjbrains/toa/archive/refs/heads/main.zip"
下载成功后解压并进入目录:
unzip main.zip
cd toa-main/
编译:
make
这个过程中如果找不到文件的错误提示,请把 /usr/src/kernels/3.xx.x-...x86_64
目录软链到编译时提示查找的目录,然后重新执行 make
。
如果仍然编译不成功,建议查看以下几个参考链接(查看编译方法或者下载已经编译好的TOA模块,但是要注意选项类型是200(IPv4)和253(IPv6),这两个数值在本文步骤3中需要填入):
编译成功后,当前目录会出现 toa.ko
文件,然后可以通过以下命令加载模块:
insmod toa.ko
这时候再使用 lsmod
检查就会发现模块已加载:
root@ubuntu: lsmod|grep toa
toa 282624 0
如果你的服务器需要重启,你可能需要重复编译和加载模块的过程,所以建议安装TOA模块后,不要轻易重启服务器。
步骤3:在集群设置中启用TOA
前提条件
在节点服务器启用TOA功能的前提有:
- 节点服务器为Linux系统,且CPU架构为x86_64位
- 节点服务器已经安装了nftables
设置
在确保节点服务器都满足前提条件的情况下,在集群”设置” – “TOA”中可以启用TOA功能:
其中:
- 选项类型数值,如果你使用的是本文中提供的TOA编译源码的话,IPv4和IPv6均默认是254;如果使用的是其他云服务商提供的TOA模块,请查询对应的文档
IPv4选项类型数值
- 用来作为附加的IPv4 TCP OPTION值IPv6选项类型数值
- 用来作为附加的IPv6 TCP OPTION值
- 更多选项(除非特殊情况,否则请不要轻易变更)
自动配置
- TOA功能需要节点服务器安装并开启了nftables,并将网络数据包转发到NFQueue中。如果选中了自动配置,则每次在启动时都会自动尝试配置nftables规则NFQueue队列开始ID
- 在nftables中启用的转发队列起始ID
设置完成后,观察节点运行日志是否正常:
2023/07/24 15:06:46 [TOA]starting ...
2023/07/24 15:06:46 [TOA]args: run -option-type-v4=254 -option-type-v6=254 -min-queue-id=1 -max-queue-id=12 -auto-setup
步骤4:快速测试
在完成源站服务器安装TOA和集群设置中启用TOA后,可以创建一个TCP负载均衡网站,源站是一个网站地址,比如192.168.1.100:80
,然后在浏览器上或使用CURL访问TCP端口:
http://节点IP:TCP端口
观察网站的访问访问日志中的访客IP是否为客户端IP。
限制
- TOA功能仅限于TCP/TLS负载均衡应用
常见问题
启动节点时提示libnetfilter_queue.so.1: cannot open shared object file
完整提示类似于:
cloud-toa/cloud-toa: error while loading shared libraries: libnetfilter_queue.so.1: cannot open shared object file: No such file or directory
这是因为系统没有安装libnetfilter_queue
,可以使用以下命令安装(注意区分不同的操作系统):
# Ubuntu
sudo apt install -y libnetfilter-queue-dev
# RHEL、CentOS、Fedora、RockyLinux等
sudo yum -y -q install libnetfilter_queue