我有多台计算机,它们分布在多个子网中,有 3 个接口。
例如:(全部/24)
RED (linux)
eth0 192.22.184.113
eth1 192.23.184.113
eth2 192.24.184.113
BLUE (windows)
nic1 192.22.184.28
nic2 192.23.184.28
nic3 192.24.184.28
CYAN (windows)
nic1 192.22.184.30
nic2 192.20.184.30
当我在 Windows 机器上指定一个简单的网关时,我遇到了路由问题:ping 到有网关的接口可以工作,但 ping 到其他接口则不行。因此,我做了以下事情:
这样,每个 BLUE 的网卡就可以 ping 每个 CYAN 的网卡。
但是 Linux 有问题。当我定义网关时,只有与网关相连的接口才能响应 ping。
当我尝试进行与 Windows 相同的配置时:
我能做些什么 ?
- - - - - - - - - - - 编辑 - - - - - - - - -
这是没有任何路由/网关的完整配置。
红色的
蓝色的
青色
路由器 (win serv)
添加一些网关/路由后,核心问题仍然相同:只有具有路由/网关的网卡才能响应 ping,但 Linux 只允许一个网卡路由到网络。如果我为 eth0 指定“路由到 .20”,eth1 将永远不会响应来自 .20 机器的 ping。
答案1
所有机器(RED、BLUE 和 CYAN)都通过三个不同的子网相互连接并连接到路由器。这不是常见的配置。通常,您会这样设计网络,即任何一对机器之间都只有一个子网连接它们。
由于计算机通过多个子网连接,因此可能会发生非对称路由,例如,您从计算机 BLUE 向子网 192.22.184.* 上的计算机 CYAN 发送请求,但它返回子网 192.23.184.*。操作系统通常会丢弃/拒绝此类数据包,因此您无法获得 ping 响应。
似乎您设法通过在所有三个子网上定义默认网关来解决 Windows 上的这个问题,但在 Linux 上这是不可能的。在 Linux 中,您只能有一个默认网关(好吧,实际上您可以有多个,但在这种情况下它们需要有不同的指标,这可能无法解决您的问题)。
您必须在 Linux 上启用非对称路由,即让 Linux 接受来自与发送请求不同的接口的回复数据包。如何执行此操作取决于您的 Linux 发行版(您没有指定您使用的是哪一个)。在这里我找到了针对 RedHat 和 CentOS 的解释:https://openplatform.xyz/enable-asymmetric-routing.html在其他发行版上,可能做法不同,但它总是涉及修改net.ipv4.conf.*.rp_filter
相应配置文件中的内核参数。