我在以下路由方面遇到了一些问题:
我有一台带有 2 个接口的服务器。它有 1-1 个别名,包含相同的子网。2 个接口连接到 2 个交换机,它们彼此分开。基础设施:
Eth0 192.168.16.2/20
Eth0:eth0 192.168.1.222/20
Eth1 192.168.32.3/20
Eth1:eth1 192.168.1.223/20
我有一台电脑,其 IP 地址为:192.168.1.3/24
问题是下一个:
- 如果 PC 位于子网 1 上,我可以 ping 它。
- 如果 PC 位于子网 2 上,则我无法 ping 通它。
traceroute
显示路线穿过192.168.1.222
ping -I 192.168.1.223 192.168.1.3
在子网 2 上不起作用。
arp 条目显示属于正确接口(子网 2 上的 eth1)的 MAC 地址
我如何强制服务器在两个接口上查找特定 IP 的同一范围子网?
它仅在第一个子网中搜索。
路由表包含以下 2 个条目:
192.168.0.0/20 dev eth0 proto kernel scope link src 192.168.1.222
192.168.0.0/20 dev eth1 proto kernel scope link src 192.168.1.223
更新1:
因此 Linux 内核无法确定哪个接口具有 192.168.1.3 ip。我们通过将分离的子网交换机相互连接解决了该问题,但现在流量在 ETH0 上流出。
最后一种方法是在测试期间重新配置 PC 的 IP 地址以适应子网 IP 范围。
谢谢您的回答。
答案1
我们的配置完全相同,但 IP 地址不同。一台主机在多个接口上配置了一个 IP 地址,例如:
10.0.0.0/24 dev eth1 proto kernel scope link src 10.0.0.10
10.0.0.0/24 dev eth2 proto kernel scope link src 10.0.0.10
10.0.0.0/24 dev eth3 proto kernel scope link src 10.0.0.10
我只需添加 IP 路由,例如:
> ip route add 10.0.0.123 dev eth3
所以我有如下条目:
> ip route show
...
10.0.0.123 dev eth3 scope link
10.0.0.101 dev eth2 scope link
10.0.0.136 dev eth1 scope link
...
经过这些之后,它应该可以工作了。@nickw 建议基于策略的规则可能也是正确的,但我发现这种方法更容易一些。
注意:恕我直言,这是个非常糟糕的做法,我们最终为此遇到了很多麻烦。另外,据我所知,如果不更改 IP 路由或规则条目,您将无法访问其他接口上的主机,因此如果您将机器移动到不同的(物理)网络,则必须重新配置表。
答案2
问题是下一个:
如果 PC 位于子网 1,我可以 ping 通它。如果 PC 位于子网 2,则无法 ping 通它。
我如何强制服务器在两个接口上查找特定 IP 的同一范围子网?
这是不可能的。至少在内核层面上不可能。
当您未指定其他任何内容(例如要使用哪个接口或源 IP 地址)时,您不能在路由表上有两条路由并期望内核会尝试这两条路由。
基本经验法则是:如果无法通过接口访问主机,请勿在该接口上为该主机添加路由。主机不应该“聪明”或神奇地猜出要使用哪个接口。如果有路由,内核总是选择该路由,即使它不起作用。
您可以根据源 IP 地址、应用程序指定的输出接口或标记、tos 或许多其他参数甚至多个网络命名空间拥有多个路由表,但最后,如果您只执行简单的“ping 192.168.1.3”,内核将只在您的一个路由表中选择一条路由并使用它。
即使 Linux 具有轮询使用哪条路由的技术可能性,它也会针对每个数据包执行此操作。如果使用这种方式,到达主机的数据包丢失率将达到 50%。
如果您需要这个有点不完善的设置来工作,请执行以下操作之一:
- 在您的服务器或交换机上桥接两个网络,即使只是从您的服务器的角度来看。
- 确保两个网络都可以看到你的 192.168.1.3 主机
- 在第 2 层,连接两个接口,并将发送到 eth0 的所有内容复制到 eth1。这确实很糟糕。
- 停止从您的两个子网中移动 192.168.1.3。
- 在您的服务器和 192.168.1.3 上运行路由协议,以便根据 192.168.1.3 的位置自动调整路由表。