为什么 ping 不通?

为什么 ping 不通?

网络设置如图所示:

网络设置

  • 机器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/24eth2 上。

(这样,您甚至不需要在 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>

相关内容