具有重叠 IP 地址的网络环境中的 ARP/ICMP

具有重叠 IP 地址的网络环境中的 ARP/ICMP

目前,我已经设置了实验室网络来模拟客户的网络部署。(根据客户的说法,他们正在使用 VLAN 上的 VRF,以便他们的客户可以拥有连接到同一服务器主机的重叠网络)。

因此,抽象出所有的复杂性,我有一个这样的设置:

     client 1                                      server                      
+--------------------+                   +--------------------------------+
| vlan 100           |                   |                                |    
|                    |                   |----+-----+                     |    
| ip: 192.168.1.100  |------------------>|    |  e  | vlan100             |
| on eth1            |                   |    |  t  |                     |    
|                    |                   |    |  h  | ip: 192.168.1.200   |    
+--------------------+                   | e  | 0.1 |                     |    
                                         | t  |-----+                     |    
     client 2                            | h  |-----+                     |    
+--------------------+                   | 0  |  e  | vlan101             |
| vlan 101           |                   |    |  t  |                     |    
|                    |                   |    |  h  | ip: 192.168.1.200   |    
| ip: 192.168.1.100  |------------------>|    | 0.2 |                     |    
| on eth1            |                   |----+-----+                     |    
|                    |                   |                                |    
+--------------------+                   +--------------------------------+    

请不要问我为什么会这样。此设置是为了重现客户部署的服务器将遇到的相同场景。实质是使用多个 VLAN 来提供多个重叠的虚拟 IP 网络,并且服务器对所有这些虚拟 IP 网络都具有相同的 IP 地址。服务器可以期待来自具有冲突 IP 地址的不同虚拟网络的客户端的连接。

我们的服务器可以很好地接受连接。我们将套接字绑定到每个单独的 VLAN 接口。一切正常。但令我困惑的问题是。客户端 2 无法 ping 服务器 (192.168.1.200),因为所有 ICMP 回复都发送给了客户端 1。

我查看了 tcpdumped 数据包。服务器可以毫无问题地接收来自客户端 2 的 ICMP 数据包。但是当它尝试发回 ICMP 回复时,它被发送到客户端 1。在服务器将 ICMP 回复发回 192.168.1.100 之前,它实际上首先通过 eth0.1 发出了一个 ARP 请求“who-has 192.168.1.100 tell 192.168.1.200”。因此,客户端 1 发回一个 ARP 回复,告诉服务器它有 IP 192.168.1.100。

所以我想知道: 1.为什么服务器需要再次发送 ARP 请求来询问谁拥有 192.168.1.100? 因为从客户端 2 最初的 ARP 请求询问“谁拥有 192.168.1.200”开始,它就应该知道 192.168.1.100 属于客户端 2。服务器上的 arp 缓存也证实了服务器知道:

192.168.1.100            ether   f0:92:1c:19:a0:01   C                     eth0.1
192.168.1.100            ether   f0:92:1c:19:d1:c1   C                     eth0.2

tcpdump 捕获的数据包也证实了这一点。请参见此处的屏幕截图:

在此处输入图片描述

其次,我想知道是否有办法只通过相同的传入网络接口回复 ICMP 请求?这样,即使 eth0.1 和 eth0.2 上都有 192.168.1.100 的条目,ICMP 回复也会正确地发送回 vlan 101。

我并不是一名网络工程师,如果我犯了任何错误或陈述有误,请耐心等待并指出我的错误。提前感谢任何答案和帮助。

PS 我实际上已经启用了 arp_ignore。以下是我的服务器设置:

net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.eth0/1.arp_announce = 2
net.ipv4.conf.eth0/1.arp_ignore = 1
net.ipv4.conf.eth0/2.arp_announce = 2
net.ipv4.conf.eth0/2.arp_ignore = 1 

相关内容