目前,我已经设置了实验室网络来模拟客户的网络部署。(根据客户的说法,他们正在使用 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