TCP 任播多路径路由:路由器始终优先选择其中一个下一跳

TCP 任播多路径路由:路由器始终优先选择其中一个下一跳

我正在尝试使用不带附加协议的 TCP Anycast 将一个客户端连接到具有相同 Anycast IP 的多个主机之一。
我的拓扑如下所示:

拓扑图像链接

中间的服务器是一台 Ubuntu 机器,为任播地址提供两条路由。
我的多路径路由配置(在路由器上)是:

`10.11.12.13  proto static
    nexthop via 192.168.2.1  dev enp0s9 weight 1
    nexthop via 192.168.3.1  dev enp0s10 weight 1`  

任播地址是10.11.12.13,并被分配给右侧两个路由器的本地环回。左侧是一个客户端,中间的路由器是其默认网关。

场景 1:中间的路由器以任播地址作为目的地启动 tcp 会话。

场景 2:左侧的客户端以任播地址作为目的地启动 TCP 会话。

观察:

从路由器 (ubuntu linux) 启动 tcp 会话时,一切都按预期运行。SYN 包以相等的概率通过每个跳数之一转发。建立会话后,此会话的所有包都会经过同一跳数,从而保持连接处于活动状态(成功的基于流的多路径路由)。

问题出现在场景 2 中,当我尝试从 192.168.1.1/24 的客户端建立 tcp 会话时。路由器始终将数据包转发到其中一台主机(IP 后缀为 3.1 的主机)。如果我关闭与该主机的连接 eth2,路由器会将数据包转发到第二台主机。但是,当再次打开 eth2 时,连接会切换回 3.1 的主机,导致客户端与后缀为 2.1 的主机断开连接。

我只能发布一个视频链接,因此这里有一个视频从客户的角度展示它的样子:https://youtu.be/kthYK9uEwvM
注意来自客户端的 tcp SYN 如何始终转发到带有 3.1 后缀的主机(右下角)。

终端:
路由器:左上方,客户端:左下方,主机 2.1:右上方,主机 3.1:右下方。

我的内核版本是 4.4 Linux Kernel。使用 netcat(服务器)和 telnet(客户端)建立 tcp 会话。

改变下一跳的权重也只会影响从路由器的路由(192.168.1.254 > 10.11.12.13)。

为什么当 SYN 包从客户端发送时,路由器转发的方式与从路由器本身发送时的方式不同?

感谢您的帮助!

答案1

这似乎是 ipv4 的问题。
使用 ipv6 和具有几乎相同设置的 Linux 内核 4.4 ubuntu 机器可以按预期工作。 拓扑图像链接
尽管 ICPM ping 消息总是通过第一个下一跳路由,但 tcp 消息沿着下一跳均匀分布。已建立的 tcp 会话似乎很稳定(因此内核可以正确识别流)。

相关内容