网络设置如图所示:
机器m1的eth0以太网端口通过交叉线连接到机器m2的eth0以太网端口。
机器m1和m2在同一个网络上:
1.1.1.0/24
M1 eth0 的地址为
1.1.1.1/24
,并且这些条目已输入到路由表中:# ip route add 2.2.2.0/24 via 1.1.1.4 //route to m3 # ip route add 3.3.3.0/24 via 1.1.1.3 //route to m4
机器 M2 有 3 张以太网卡,作为机器 m3 和机器 m4 的路由器,它们分别位于网络 2.2.2.0/24 和 3.3.3.0/24 上。
M2 在 sysctl.conf 中有 net.ipv4.ip_forward=1
M2 eth0 有地址
1.1.1.2/24
,eth1 有1.1.1.4/24
,eth2 有1.1.1.3/24
。这些是在 m2 上执行的命令,用于启用路由以使所有网络进行通信# ip route add 2.2.2.0/24 via 1.1.1.4 //route to m3 # ip route add 3.3.3.0/24 via 1.1.1.3 //route to m4
M3 eth0 的地址为
2.2.2.1/24
,并且这些条目被输入到路由表中:# ip route add 1.1.1.0/24 via 2.2.2.1 //route to m2 && m1 # ip route add 3.3.3.0/24 via 2.2.2.1 //route to m4
M4 eth0 有地址
3.3.3.1/24
,这些条目被输入到路由表中# ip route add 2.2.2.0/24 via 3.3.3.1 //route to m3 # ip route add 1.1.1.0/24 via 3.3.3.1 //route to m2 && m1
所以第一个问题是,
- 我可以从 M2 ping 通 M1、M3 和 M4。
- 我可以从 M3 和 M4 ping M2
- 从 M3 到 M4 或从 M4 到 M3 均无法 Ping 。
- 从 M1 到 M3 或 M4,Ping 也不起作用。
- 从 M3/M4 到 M1 的 Ping 也不起作用。
我做错了什么?
答案1
M1 没有到 1.1.1.4 (或 .3)地址的路由,因为它直接连接到 .2 。
如果你查看 M1 上的路由表,它看起来会像这样
Destination Gateway Genmask Flags Metric Ref Use Iface
1.1.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
因此它认为它应该能够通过交换机或集线器直接连接到 1.1.1.3|4 地址。
将 M1 和 M2 之间的链接放在不同的子网上,并使用 M2 的地址作为 M1 的默认网关,这样它就可以工作了。
M3/4 与其他连接也存在同样的情况,它们需要知道要采用什么路由,或者它们的默认路由器需要知道。
答案2
我认为您的第一个问题是您期望路由是多跳的——但事实并非如此。例如,您在 M1 上使用了这些命令,似乎您希望它们在 M2 上选择特定的出站接口:
# ip route add 2.2.2.0/24 via 1.1.1.4 //route to m3
# ip route add 3.3.3.0/24 via 1.1.1.3 //route to m4
这不会发生。两个路由条目都只会将数据包转发到 M2 的 MAC 地址(因为它是主机,负责回答两个下一跳地址的 ARP 查询),但 M2 完全自行决定下一步将这些数据包转发到哪里。
因此,添加到 M1 的路由应该只使用面向 M1 的 M2 地址,即via 1.1.1.2
。
你的第二个问题是M2有三个接口属于同一网络(1.1.1.0/24)。
相反,因为 M2 是一个路由器,同时属于所有三个网络,所以它应该有地址来自这些网络:即2.2.2.x/24
在 eth1 和3.3.3.x/24
eth2 上。
(这样,您甚至不需要在 M2 上添加任何路由 – 本地子网路由就足够了。)
第三个问题是,M3 和 M4 上的路由没有指定发送数据包的网关。它们只有主机的自己的地址,但不以任何方式表明“到 M1”的数据包实际上必须经过 M2。
由于这些路由未指定有效的网关/下一跳,因此它们被视为本地子网路由;换句话说,您告诉 M3/M4 目标 (M1) 在本地以太网上可用,即使它不可用。因此,当您从 M3/M4 ping M1 时,它们会尝试使用 ARP 解析 M1 的 IP 地址(这当然会失败)。
(请记住,以太网始终以交换介质工作,而不是点对点,因此 M2 将接收仅有的那些专门发送到 M2 的 MAC 地址(或广播)的数据包。换句话说,必须指定 M2 作为路由到 M1 的网关。
如果您已经根据第二部分修复了 M2 的 IP 地址,那么 M3/M4 上的路由应该是这样的:
(On M3)
# ip addr add 2.2.2.1/24 dev eth0
# ip route add 1.1.1.0/24 via 2.2.2.x // <via M2's eth1 address>
# ip route add 3.3.3.0/24 via 2.2.2.x // <via M2's eth1 address>
(On M4)
# ip addr add 3.3.3.1/24 dev eth0
# ip route add 1.1.1.0/24 via 3.3.3.x // <via M2's eth2 address>
# ip route add 2.2.2.0/24 via 3.3.3.x // <via M2's eth2 address>