我有一个(实验性的)设置,其中主机myhost.mydomain
有三个网络接口,所有网络接口都连接到与其默认网关相同的 VLAN mygateway.mydonain
。设置如下:
interface MAC IP address
--------- ----------------- ---------------
eth0 aa:aa:aa:aa:aa:aa myhost.mydomain
eth1 bb:bb:bb:bb:bb:bb 192.168.0.7
eth2 cc:cc:cc:cc:cc:cc 192.168.1.7
我观察到,大约每4个小时默认网关收到一个 ARP 请求,所有三个接口都会发出 ARP 响应。tcpdump
所有三个接口都会接收到 ARP 请求(根据 ),内容如下:
who-has myhost.mydomain tell mygateway.mydomain
ARP 响应如下:
myhost.mydomain is aa:aa:aa:aa:aa:aa # on eth0
myhost.mydomain is bb:bb:bb:bb:bb:bb # on eth1
myhost.mydomain is cc:cc:cc:cc:cc:cc # on eth2
在这样的设置下应该如此吗?我有点惊讶,因为myhost.mydomain
显然“是”只有aa:aa:aa:aa:aa:aa
,因为该地址绑定到eth0
。我还看到,在这些响应之后,默认网关会发送进一步的 TCP 流量eth2
(而不是eth0
),这会导致其他复杂情况。
我知道这个问题可以通过arptables
将主机的接口连接到不同的网络来解决,但在继续之前,我还想了解这种具体情况。主机运行 Debian 8.9。
答案1
这被证明是 ARP 流量的情况。适用以下描述:
Linux 的一个独特功能是它愿意响应绑定到任何接口的任何 IP 的 ARP 请求。这可能会导致 ARP 流量,即有时通过一个 MAC 地址访问给定 IP,有时通过另一个 MAC 地址访问给定 IP 的情况。(这里)
同一来源建议采取以下补救措施:
防止 ARP 流量的一种方法是使用
net/ipv4/conf/$DEV/arp_filter
。简而言之,使用arp_filter
会导致接收方(在下面的例子中是真实服务器)执行路由查找以确定发送回复的接口,而不是默认行为(如上所示),即从接收请求的所有以太网接口进行回复。(这里)
为了找到一个可以在重启后继续存在的解决方案,myhost.mydomain
我选择了以下方法:
echo "net.ipv4.conf.all.arp_filter = 1" > /etc/sysctl.d/arp_filter.conf
sysctl -p /etc/sysctl.d/arp_filter.conf
与此同时,我也注意到,这种情况是其他本论坛中最近出现的问题。