为什么ping响应被发送到错误的网关?

在之前的问题中 ,我试图确定为什么我的OpenVPN客户端无法ping通服务器LAN,尽pipe服务器LAN可以ping客户端。

在进一步调查之后,我确定至less在其中一个服务器的情况下,内核决定将包含ping应答的以太网帧转发到不知道MAC地址的方向如何路由数据包。

所以,例如:

10.11.11.7 de:ad:be:7f:45:72 10.11.11.1 00:10:db:ff:70:01 10.11.11.2 de:ad:be:3b:24:48 

平板从10.11.11.7到10.8.0.10工作。 从10.8.0.10到10.11.11.7的Ping请求按预期到达,但答复从未达到10.8.0.10,这显然是因为它们是按照10.11.11.1而不是10.11.11.2路由的,而10.11.11.2包含可以路由到10.8.0.0的VPN服务器/ 24。

例如:

当我尝试从10.11.11.7开始ping 10.8.0.10时,请求将在包含10.11.11.2的接口上出现,其中包含可以达到10.8.0.10的VPN网关。

 01:46:39.973670 de:ad:be:7f:45:72 > de:ad:be:3b:24:48, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto: ICMP (1), length: 84) 10.11.11.7 > 10.8.0.10: ICMP echo request, id 49247, seq 6, length 64 0x0000: 4500 0054 0000 4000 4001 1b86 0a0b 0b07 E..T..@.@....... 0x0010: 0a08 000a 0800 37a4 c05f 0006 7ff8 5f4f ......7.._...._O 0x0020: 0000 0000 53db 0e00 0000 0000 1011 1213 ....S........... 0x0030: 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223 .............!"# 0x0040: 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233 $%&'()*+,-./0123 0x0050: 3435 3637 4567 

预期的响应通过反向path到达…

 01:46:40.145368 de:ad:be:3b:24:48 > de:ad:be:7f:45:72, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 63, id 53200, offset 0, flags [none], proto: ICMP (1), length: 84) 10.8.0.10 > 10.11.11.7: ICMP echo reply, id 49247, seq 6, length 64 0x0000: 4500 0054 cfd0 0000 3f01 8cb5 0a08 000a E..T....?....... 0x0010: 0a0b 0b07 0000 3fa4 c05f 0006 7ff8 5f4f ......?.._...._O 0x0020: 0000 0000 53db 0e00 0000 0000 1011 1213 ....S........... 0x0030: 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223 .............!"# 0x0040: 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233 $%&'()*+,-./0123 0x0050: 3435 3637 4567 

另一方面,当10.8.0.10 ping 10.11.11.7时,在预期的接口上收到ping请求:

 01:46:11.734359 de:ad:be:3b:24:48 > de:ad:be:7f:45:72, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 63, id 0, offset 0, flags [DF], proto: ICMP (1), length: 84) 10.8.0.10 > 10.11.11.7: ICMP echo request, id 15635, seq 74, length 64 0x0000: 4500 0054 0000 4000 3f01 1c86 0a08 000a E..T..@.?....... 0x0010: 0a0b 0b07 0800 c1ff 3d13 004a 65f8 5f4f ........=..Je._O 0x0020: 0000 0000 7088 0400 0000 0000 1011 1213 ....p........... 0x0030: 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223 .............!"# 0x0040: 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233 $%&'()*+,-./0123 0x0050: 3435 3637 4567 

但它在10.11.11.1的方向,而不是10.11.11.2:

 01:46:11.734383 de:ad:be:7f:45:72 > 00:10:db:ff:70:01, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 41757, offset 0, flags [none], proto: ICMP (1), length: 84) 10.11.11.7 > 10.8.0.10: ICMP echo reply, id 15635, seq 74, length 64 0x0000: 4500 0054 a31d 0000 4001 b868 0a0b 0b07 [email protected].... 0x0010: 0a08 000a 0000 c9ff 3d13 004a 65f8 5f4f ........=..Je._O 0x0020: 0000 0000 7088 0400 0000 0000 1011 1213 ....p........... 0x0030: 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223 .............!"# 0x0040: 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233 $%&'()*+,-./0123 0x0050: 3435 3637 4567 

这是意想不到的,因为10.11.11.7上的路由表configuration如下:

 Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 10.11.11.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 10.8.0.0 10.11.11.2 255.255.255.0 UG 0 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0 0.0.0.0 10.11.11.2 0.0.0.0 UG 0 0 0 eth0 

所以,我的问题是:为什么内核在10.11.11.1的方向发送ping响应,即使网关定义为10.11.11.2?

更新:

通过污染10.11.11.7中的arpcaching,其MAC地址为10.11.11.1,实际上指向10.11.11.2例如:

sudo / sbin / arp -s 10.11.11.1 de:ad:be:3b:24:48

我能够从10.8.0.10到10.11.11.7 ping按预期工作。

显然,这仅仅是为了示范的目的。 为什么我的内核首先select错误的目标MAC地址?

更新2:

根据lsmod,networking驱动程序可能是:

 virtio_net 48449 0 

这可能表示虚拟机正在KVM下运行。

更新3:

这个问题回答了ptman的build议,在他回答我的另一个问题时考虑了基于策略和源的路由。

谢谢,ptman!

这个问题的答案是ptman的build议,在他的回答中考虑政策和源代码路由。

简而言之,问题是由在主路由表(这是使用/ sbin / route显示的规则)中的任何规则之前解释的特定于适配器的默认静态路由引起的。

这个默认路由是拦截和转向目的地为10.8.0.0/24的数据包,并将它们指向10.11.11.1,而不是10.11.11.2的预期跃点。 因此,应该将这些数据包转移到10.11.11.2的规则永远不会被执行。

部分原因是由于/ sbin / route没有显示适配器特定的静态路由。 注意这样的路由,熟悉: / sbin / ip规则/ sbin / ip路由表全部