指定 -I 选项时 ICMP Ping 不起作用

问题

当我运行 ping -I 并指定接口时,我没有收到 echo-reply。但是,当我运行不带 -I 选项的 ping 时,一切都按预期工作。 发生了什么?

问题的具体示例

此示例不起作用

cumulus@switch:default:~:# ping -I swp2 50.50.50.1
PING 50.50.50.1 (50.50.50.1) from 5.5.5.10 swp1.5: 56(84) bytes of data.

而此示例有效

cumulus@switch:default:~:# ping 50.50.50.1
PING 50.50.50.1 (50.50.50.1) 56(84) bytes of data.
64 bytes from 50.50.50.1: icmp_req=1 ttl=63 time=4.00 ms
64 bytes from 50.50.50.1: icmp_req=2 ttl=63 time=0.000 ms
64 bytes from 50.50.50.1: icmp_req=3 ttl=63 time=0.000 ms
64 bytes from 50.50.50.1: icmp_req=4 ttl=63 time=0.000 ms
^C
--- 50.50.50.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 0.000/1.000/4.001/1.732 ms
cumulus@switch:default:~:#

上面的图像具有以下 IP 地址

设备VLAN 2VLAN 5
边缘路由器2.2.2.1不适用
Cumulus Linux 交换机2.2.2.55.5.5.5
虚拟机监控程序2.2.2.105.5.5.10

配置

虚拟机监控程序

auto swp1
iface swp1
    address 2.2.2.10/24
    up ip route add 0.0.0.0/0 via 2.2.2.1

auto swp2
iface swp2
    address 5.5.5.10/24

Cumulus Linux 交换机

auto swp1
iface swp1

auto swp2
iface swp2

auto swp17
iface swp17

auto bridge_2
iface bridge_2
    address 2.2.2.5/24
    bridge-ports swp1 swp17
    up ip route add 0.0.0.0/0 via 2.2.2.1

auto bridge_5
iface bridge_5
    address 5.5.5.5/24
    bridge-ports swp2

边缘路由器

auto swp30
iface swp30
    address 50.50.50.2/24

auto swp17
iface swp17
    address 2.2.2.1/24
    up ip route add 5.5.5.0/24 via 2.2.2.5

互联网路由器

auto swp1
iface swp1
    address 50.50.50.1/24
    up route add -net 5.5.5.0/24 gw 50.50.50.2
    up route add -net 2.2.2.0/24 gw 50.50.50.2

说明

这里发生了什么? 此行为实际上是预期的。 你不需要在 Cumulus Linux 交换机(在此特定示例中)上拥有 SVI(交换机 VLAN 接口),虚拟机监控程序上的主机即可访问“互联网”(此处由另一个 Cumulus Linux 交换机模拟)。主机有一个到 2.2.2.5 的默认路由 (0.0.0.0/0),因此当您指定 -I(接口)选项时,Cumulus Linux 强制流量在 Cumulus Linux 交换机和虚拟机监控程序之间的 swp2 链路上为目标 (50.50.50.1) 执行 ARP。该接口上没有(该子网的)路由,这强制在该链路上执行 ARP。  

当您从互联网路由器向下 ping 每个 SVI 时,它们都是可达的。 如果虚拟机监控程序上有主机,它们也是可达的,因为它们在 Cumulus Linux 交换机上配置了网关。-I 选项强制执行 ARP,并且没有路由。如果虚拟机监控程序利用命名空间来拆分路由表(允许双默认路由),则可以使用 -I 选项从虚拟机监控程序执行 ping 操作。根据虚拟机监控程序或主机在这种情况下执行的操作(例如 IP 规则或容器),还有各种未经此处测试的方法可以解决双路由问题。

参见