我有一个必须配置为循环的网络。它由 3 个节点组成,每个节点都有两个接口。下图对此进行了说明。
+--->(eth0) Node 1 (eth1)--->(eth0) Node 2 (eth1)--->(eth0) Node 3 (eth1)--->+
| 10.0.3.1 10.0.1.1 10.0.1.2 10.0.2.2 10.0.2.3 10.0.3.3 |
+--<----------------------------<--------------------------------------------+
我想从节点 1 ping 到节点 3,这样请求就会经过节点 2,而答复则会从节点 3 直接发往节点 1。
node1$ ping 10.0.2.3
我已将节点配置为:
node1# route add -net 10.0.2.0/24 gw 10.0.1.2
node2# route add -net 10.0.3.0/24 gw 10.0.2.3
node3# route add -net 10.0.1.0/24 gw 10.0.3.1
运行 ping 时,来自节点 1 的请求到达节点 3。但是节点 3 没有回复,甚至没有生成回复(至少我可以用 wireshark 捕获到)。
你能给我一些提示吗?
助教
答案1
当一个节点选择来源数据包的来源 IP 地址,除非另有限制,它通常会选择到数据包目的地路由上下一跳“最接近”的 IP 地址。
从节点 1 的角度来看,到节点 3 的下一跳是10.0.1.2
。最接近 的节点 1 IP 地址10.0.1.2
是10.0.1.1
,而不是10.0.3.1
。(与目标位于同一子网上的 IP 地址被认为比不在同一子网上的 IP 地址“更接近”目标。)
检查 ping 的源 IP 地址。最有可能的是 ,而不是10.0.1.1
。10.0.3.1
如果节点 3 没有到 的路由10.0.1.1
,它就无法回复。
答案2
节点正确地重复失败以防止失控桥接广播。我建议您运行生成树协议。这将允许您在所有节点之间设置完全正常运行的路由。除非您愿意限制第 2 层或第 3 层某些链路之间的连接,否则我想不出其他方法来做到这一点。
答案3
(/sbin/route
已弃用,请改用ip route
)。
如果您希望数据包仅在一个方向上传输,则意味着每个节点都需要使用下一个节点作为其网关,无论目的地是什么。
node1# ip route add 10.0.0.0/22 via 10.0.1.2
node2# ip route add 10.0.0.0/22 via 10.0.2.3
node3# ip route add 10.0.0.0/22 via 10.0.3.1
但是,在大多数发行版中,反向路径过滤通常默认启用。反向路径过滤是针对传入数据包的过滤器,它尝试检查对此数据包的响应是否会发送到接收数据包的同一接口。这在路由对称的常见网络上是一件好事,但在您的情况下,您需要非对称路由,因此您可能只需在接收数据包的接口上禁用反向路径过滤,或者至少减少它,以便它只检查源 IP 是否可路由:
node1# sysctl -w net.ipv4.conf.eth0.rp_filter=2
node2# sysctl -w net.ipv4.conf.eth0.rp_filter=2
node3# sysctl -w net.ipv4.conf.eth0.rp_filter=2
关于反向路径过滤和其他选项的文档可以在内核文档中找到,网址为Documentation/networking/ip-sysctl.txt
。在哪里可以找到这些内容取决于您的发行版(或者只需浏览网页即可ip-sysctl.txt
)。
快乐循环!