指定 -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 2 | VLAN 5 |
---|---|---|
边缘路由器 | 2.2.2.1 | 不适用 |
Cumulus Linux 交换机 | 2.2.2.5 | 5.5.5.5 |
虚拟机监控程序 | 2.2.2.10 | 5.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 规则或容器),还有各种未经此处测试的方法可以解决双路由问题。
参见
- Cumulus Linux 上的路由
- 网络故障排除
- kernel.org 上的 ip-sysctl,其中涵盖了
arp_announce