棘手的Linux路由问题

棘手的Linux路由问题

在工作中,我们有一个端到端的系统,我们将通过该系统路由数据包以弹出另一侧,然后返回到它们的起源处。您可以将其视为正常的通信堆栈。

为了测试吞吐量,我们发现自己使用 iperf3,通过使用两台外部计算机将流量发送到该堆栈。我们发现自己总共使用了三台计算机,因为我们无法解决这个路由问题,但我觉得一定有一些我们没有看到的解决方案,因为我确信这个问题以前已经出现过。如果可能的话,我想只使用一台机器。

假设我们的环境是这样的:在此输入图像描述

其中 A 是 iperf3 客户端,B 由多个程序组成,将数据包作为以太网数据包相互传递(为简单起见,保留为一个黑匣子),C 是 iperf3 服务器。

回顾一下,我希望数据包从 A 传输到 B、C,然后返回 B,再返回 A。

在此输入图像描述

要使用 Iperf 执行此操作,我需要 A 处的客户端将数据包发送到 C。

iperf3 -c "C"

我还使用 C 在 C 上设置了一个服务器

iperf3 -s

但是,如果此时没有任何路由规则,这些数据包将绕过 B 并直接在 A 和 C 之间传输。为了阻止这种情况发生,我制定了一条路由规则,类似于“将所有发往 C 的流量路由到 B”。

route add "C" netmask 255.255.255.255 gw "B"

另外,我们必须在另一端做同样的事情,以便服务器不会直接发送回 A。

route add "A" netmask 255.255.255.255 gw "B"

如果你还没有抓住它,这会导致一个悖论,导致所有发往 A 和 C 的流量都流向 B。这意味着当 B 完成处理并想将数据发送给 C 时,它会发送给自己因为这是路由表所规定的*。这也会发生在相反的方向。

有谁知道解决这个问题的方法吗?我不确定是否可以通过简单的路由来完成,但我一开始对路由了解不多,所以也许有一个技巧?

*我实际上不确定它是否会继续发送给自己(我不认为它会,即使它这样做,第二次也不知道如何处理它),但这是我想说的不适用于此配置。

答案1

这听起来几乎像是可以使用 iptables 实现的事情。像这样的东西可以放在“B”上:

iptables -t nat -A PREROUTING -s "A" -p tcp --dport 5201 -j DNAT --to-destination C:5201

iptables -t nat -A PREROUTING -s "C" -p tcp --dport 5201 -j DNAT --to-destination A:5201

答案2

听起来您需要一个(透明)代理,请尝试研究一下。

但是如果你真的想使用路由因为只有这两个客户端会受到影响,所以您必须首先在 B 上配置某种路由功能(或者至少某种IP转发)。然后您需要在主机上添加类似这样的路由。

在A上

route add C netmask 255.255.255.255 gw B

在C

route add A netmask 255.255.255.255 gw B

例如,您会告诉 A 到达 C 的下一跳不是您的默认网关,而是您的 B 盒子。所有四个八进制中的 255 都是必需的,仅表示此 IP。因此,这并不意味着所有具有目的地 C 的流量都转至 B,而是意味着所有流量均转至 C - 而不是默认网关 - 使用 B 作为网关。所以除非你没有在B盒上配置任何东西,否则不存在悖论。当然,B 箱只会扔下包裹,并且可能会看着你“你到底为什么要给我发送这个;)”。

另一种选择是,如果您有托管交换机,则镜像其中一台主机的端口,以便在该 LAN 端口上发送或接收的每个数据包也会传送到该镜像端口上的 B 盒。

还有很多其他选择可以中断这两个客户与第三个客户之间的沟通。但是根据您提供的描述,您实际上没有任何要求。所以尝试任何事情。

相关内容