我有两台通过交换机连接的linux机器。
在机器上运行linux RHEL 7.3 kernel 3.10.0-327.el7.x86_64
其中一台机器的两个端口连接到交换机,另一个连接到一个端口。
两个端口共享相同的子网 。
ifconfig machine 1 ens3f1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 6.6.6.2 netmask 255.255.255.0 broadcast 6.6.6.255 ether 34:9a:17:aa:28:1b txqueuelen 1000 (Ethernet) ifconfig machine 2 ens1f1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 6.6.6.11 netmask 255.255.255.0 broadcast 6.6.6.255 ether 34:9a:17:65:55:5d txqueuelen 1000 (Ethernet) ens3f1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 6.6.6.12 netmask 255.255.255.0 broadcast 6.6.6.255 ether 34:9a:17:aa:26:1b txqueuelen 1000 (Ethernet)
我刷新了ARP表使用
ip -s neigh flush
然后我在机器1(有一个端口)上运行一个tcp服务器,并在机器2上绑定到特定设备(设备ens3f1与ip 6.6.6.12)上的tcp客户端。我在服务器的arp表中看到这个(machine1 )
ip neigh show 6.6.6.12 dev ens3f1 lladdr 34:9a:17:65:55:5d REACHABLE 10.224.12.254 dev eno1 lladdr 00:00:5e:00:01:01 REACHABLE 6.6.6.11 dev ens3f1 FAILED
你可以看到在ARP表中我看到IP 6.6.6.12和MAC 34:9a:17:65:55:5d之间的连接,但在ifconfig中,你看到这个数据是不正确的。 绑定到另一个端口(6.6.6.11)后,我看到这个ARP表
6.6.6.12 dev ens3f1 lladdr 34:9a:17:65:55:5d REACHABLE 10.224.12.254 dev eno1 lladdr 00:00:5e:00:01:01 REACHABLE 6.6.6.11 dev ens3f1 lladdr 34:9a:17:65:55:5d REACHABLE
在这里你可以看到两个IP都有相同的Mac! 亲爱的任何人都知道如何解决这个问题? 这是两台机器的tcpdump
tcpdump: listening on ens1f1, link-type EN10MB (Ethernet), capture size 65535 bytes 17:36:39.309925 34:9a:17:aa:28:1b (oui Unknown) > Broadcast, ethertype ARP (0x0806), length 60: Ethernet (len 6), IPv4 (len 4), Request who-has ***** (Broadcast) tell 6.6.6.2, length 46 17:36:39.309931 34:9a:17:65:55:5d (oui Unknown) > 34:9a:17:aa:28:1b (oui Unknown), ethertype ARP (0x0806), length 42: Ethernet (len 6), IPv4 (len 4), Reply ****** is-at 34:9a:17:65:65:5d (oui Unknown), length 28 tcpdump -i ens3f1 -e -vv tcpdump: listening on ens3f1, link-type EN10MB (Ethernet), capture size 65535 bytes 17:36:39.309941 34:9a:17:aa:28:1b (oui Unknown) > Broadcast, ethertype ARP (0x0806), length 60: Ethernet (len 6), IPv4 (len 4), Request who-has r-aa-nitro01.rdmz.labs.
谢谢!!
这是由于networking堆栈中的arp_filter选项的默认configuration。 可能的值logging在https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt中 :
arp_filter – 布尔值
1 – 允许在同一个子网上有多个networking接口,并根据内核是否将来自ARP'd IP的数据包路由到该接口来应答每个接口的ARP(因此,您必须使用基于源路由为此工作)。 换句话说,它允许控制哪些卡(通常是1)将响应一个ARP请求。
0 – (默认)内核可以使用来自其他接口的地址响应arp请求。 这可能看起来不对,但通常是有道理的,因为它增加了成功沟通的机会。 IP地址由Linux上的完整主机拥有,而不是由特定的接口所拥有。 只有负载平衡等更复杂的设置,这种行为是否会导致问题。
如果conf / {all,interface} / arp_filter中的至less一个被设置为TRUE,那么接口的arp_filter将被启用,否则它将被禁用
另外arp_ignore在这里是相关的:
arp_ignore – INTEGER定义不同的发送回复的模式,以响应收到的parsing本地目标IP地址的ARP请求:
0 – (默认值):回复在任何接口上configuration的本地目标IP地址
1 – 仅在目标IP地址是入站接口上configuration的本地地址时才应答
2 – 仅当目标IP地址是入站接口上configuration的本地地址时才回复,并且发件人的IP地址都是来自此接口上相同子网的部分
所以,在将arp_filter设置为1并将arp_ignore设置为2之后,您应该获得所需的行为。
最后我做了这个设置$ sysctl -w net.ipv4.conf。[DEVICE] .arp_announce = 1 $ sysctl -w net.ipv4.conf。[DEVICE] .arp_ignore = 2 $ sysctl -w net.ipv4.conf 。[DEVICE] .rp_filter = 0 $ sysctl -w net.ipv4.conf。[DEVICE] .arp_filter = 0我从http://jefflane.org/v2/technology/multiple-nics-on-the-same-子网避免-ARP-通量/