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