{{i18nTranslate('_layout.t11')}} {{i18nGetLang()==='zh' ? 'EN' : '中文'}}

# TOA

> 此功能为商业版本专有。

> 本文只针对GoEdge v1.2.3以后版本有效。

在TCP负载均衡时，TCP源站读取到的客户端IP信息皆为负载均衡服务器的IP；为了解决这个问题，很多云服务厂商推出了TOA模块，让我们可以在TCP通讯时传递客户端真实IP。

## 原理

老的网络传输过程如下：

此时源站只只知道负载均衡服务器的IP，而无法知道客户端真实IP。

增加TOA模块之后：

其中：

- `edge-toa进程` - 负责将回源的TCP数据包中增加TCP选项，此选项中包含了客户端的真实IP和端口
- `edge-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/TeaOSLab/toa` 中下载可以编译的TOA模块源码：

    wget "https://github.com/TeaOSLab/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模块1
- 腾讯云加载TOA模块2

编译成功后，当前目录会出现 `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

完整提示类似于：

    edge-toa/edge-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

{{i18nTranslate('_layout.t27')}}
{{i18nTranslate('_layout.t12')}}