我正在尝试设置一个需要在同一 IP 子网但具有不同 VLAN 的接口的服务器:
eth1.102 Link encap:Ethernet HWaddr 00:50:56:b1:00:0f
inet addr:10.1.1.6 Bcast:10.1.1.255 Mask:255.255.255.0
eth1.103 Link encap:Ethernet HWaddr 00:50:56:b1:00:0f
inet addr:10.1.1.12 Bcast:10.1.1.255 Mask:255.255.255.0
我看到的问题是,当 ARP 请求从其中一个子网上的设备传入时,服务器仅响应一个接口上的 ARP,并且似乎忽略另一个接口上的任何 ARP:
第一个界面:
# ping -I eth1.102 10.1.1.1
PING 10.1.1.1 (10.1.1.1) from 10.1.1.6 eth1.102: 56(84) bytes of data.
^C
--- 10.1.1.1 ping statistics ---
8 packets transmitted, 0 received, 100% packet loss, time 7008ms
第二个界面:
# ping -I eth1.103 10.1.1.1
PING 10.1.1.1 (10.1.1.1) from 10.1.1.12 eth1.103: 56(84) bytes of data.
64 bytes from 10.1.1.1: icmp_seq=1 ttl=64 time=0.400 ms
64 bytes from 10.1.1.1: icmp_seq=2 ttl=64 time=0.332 ms
^C
(记录显示,10.1.1.1 存在于两个 VLAN 的两个子网上)
# arp -an
? (10.1.1.1) at 02:00:1a:f2:00:02 [ether] on eth1.103
? (10.1.1.1) at 02:00:72:a3:00:08 [ether] on eth1.102
即使我从客户端设备 ping 到服务器接口的特定 IP,它仍然会被一个设备忽略,而另一个设备会做出响应。
Ubuntu 默认有几个 arp/欺骗过滤器,所以我关闭了我能找到的过滤器,例如
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0
我见过不少有类似问题的问题,但通常都是 ARP 流量引起的,因为属于同一网段(未由 VLAN 分隔),并且 ARP 请求由两个网段响应,但这里的情况并非如此。如果我对两个接口执行 tcpdump,则未得到响应的传入 ARP 不会在任何其他接口上看到(可以认为它是在另一个接口上响应的)——它似乎只是默默地忽略了该请求。
有人遇到过这种情况吗?
编辑:
好吧,感觉有点白痴,但可能会对别人有所帮助......
通过禁用 rp_filter,我处于正确的区域,但大概是因为它在 Ubuntu 中默认启用,因此它已将其应用于所有接口,因此虽然我为上面列出的两个条目设置了 rp_filter=0,但每个接口的设置仍然为 1,因此......
# sysctl -w net.ipv4.conf.eth1/102.rp_filter=0
# sysctl -w net.ipv4.conf.eth1/103.rp_filter=0
...成功了。
答案1
您需要为每个单独的接口禁用反向路径过滤器 (rp_filter)
# sysctl -w net.ipv4.conf.eth1/102.rp_filter=0
# sysctl -w net.ipv4.conf.eth1/103.rp_filter=0