好的,这是解决方案。首先,回顾一下:
这是我的基本网络计划:
eth0 10.10.10.2 netmask 255.255.255.248
eth1 10.10.10.3 netmask 255.255.255.248
eth2 10.10.10.4 netmask 255.255.255.248
eth3 10.10.10.5 netmask 255.255.255.248
所有接口重叠。从技术上讲这是错误的,也是我所有麻烦的根源...但是由于这个笨拙的住宅网关,我必须这样做。
首先,广播ARP请求进入所有这些请求。由于所有4个IP都是有效的本地地址,因此所有4个接口都将尝试响应。
1)安装arptables。在引导过程中将此位置添加到此处(此处为/etc/rc.local):
arptables -F INPUT
arptables -A INPUT -i eth0 --destination-ip ! 10.10.10.2 -j DROP
arptables -A INPUT -i eth1 --destination-ip ! 10.10.10.3 -j DROP
arptables -A INPUT -i eth2 --destination-ip ! 10.10.10.4 -j DROP
arptables -A INPUT -i eth3 --destination-ip ! 10.10.10.5 -j DROP
这样可以防止广播进入错误的接口。因此,正确的接口现在将是唯一的响应者。
仅仅这还不够。下一位是ARP表问题。发出请求的PC可能已经有一个ARP表条目,因此Linux将使用与其关联的接口。在该ARP表条目到期之前,它将尝试使用该条目的接口(而不是与ARP请求关联的接口)发送ARP响应。
如果sysctl选项rp_filter位于错误的接口上,则它们似乎正在拒绝传出的ARP响应数据包。所以...
2)禁用rp_filter。
在Debian / Ubuntu上,这意味着注释掉/etc/sysctl.d/10-network-security.conf中的两个rp_filter行。
启用此选项是有原因的……即是为了防止跨接口欺骗攻击。我阅读了它,验证了该数据包对于传入或传出的接口是合法的(通过交换MAC和IP并查看它是否仍在同一接口上路由)。因此,通常将其关闭是个坏主意。在我的情况下,所有接口都在同一网络上……因此检查根本不重要。
如果我确实添加了另一个接口并需要欺骗保护,也许可以制作一些arptables / iptables条目来做同样的事情。