Ubuntu Linux-多个NIC,相同的LAN…ARP响应始终在单个NIC中发出


16

我们拥有AT&T U-Verse互联网服务,该服务具有极其笨拙的DSL网关。

我们有5个IP(网络掩码248),但是网关无法执行除单个IP->单个MAC地址映射之外的任何操作。

我们有一台防火墙计算机,并且将不同的IP /端口组合重定向到DMZ内部的不同位置。

到目前为止,我们的解决方案是在防火墙上有一个VMWare虚拟机,其中带有4个附加的NIC,以获取其他4个IP地址...但是,我们遇到了问题。

网关基本上正在执行ARP ping操作,以查看IP是否在预期的MAC上响应。在同一局域网中有4个NIC的情况下,Linux使用单个接口响应所有IP的ARP请求。这不是网关所期望的,它正在弄乱其他3个NIC。网关拒绝为ARP ping结果不是预期的MAC的IP路由传入流量。

我们如何获得eth0的IP出eth0,eth1的IP出eth1等的ARP回复?

编辑

Christopher Cashell的回应在这种情况下不起作用。我寄希望于阅读它,但是...不。

编辑2

解决了!请参阅下面的答案。


PS-没有'drop uverse'评论... U-Verse是18mbps,而其他所有东西都是3mbps或通过电缆非常不可靠的10mbps
darron

@dblack:您忘了添加答案了:)
MihaiLimbăşan2009年

api.recaptcha.net网站关闭了一段时间。答案现在到了。
darron

Answers:


13

您选择的解决方案有效,但是有些替代方案不涉及arptables。(Christopher Cashell原本是走在正确的轨道上,但他被一个小家伙赶走了。)

简而言之,您想要设置以下参数:

net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2

当运行现代的2.6系列Linux内核时,这些应该可用。检查并确保系统上存在“ / proc / sys / net / ipv4 / conf / / arp_announce”和/ proc / sys / net / ipv4 / conf / / arp_ignore”。

仅当您的各个IP地址共享一个LAN网段但使用不同的IP子网时,“ arp_filter”参数才起作用。如果它们也共享IP子网,则如上所述,您需要使用“ arp_ignore”和“ arp_announce”。

(我相信您可能还需要将“ arp_filter”设置回“ 0”。)


arp_filter发生了什么?它是ARP问题的早期解决方案(2003年?),但是它似乎不能像所描述的那样起作用,至少在Centos 5上是如此。arp_ignore和arp_announce似乎不错。
pcapademic

照此解决方案,它似乎仅在ARP级别上起作用。如果没有其他路由设置,防火墙可能仍会为其自身的传出IP流量选择错误的传出卡(和MAC),但将(仍然)始终在正确的卡上接收传入的IP流量,从而导致路径和rp_filter不对称的考虑。
AB

8

好的,这是解决方案。首先,回顾一下:

这是我的基本网络计划:

 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条目来做同样的事情。


5

这与Linux处理IP和NIC的方式有关。基本上,它将IP地址视为它属于该盒子,而不仅仅是特定的NIC。结果是您可以从不需要的接口上的IP地址获得ARP响应。

解决方案是sysctl选项。我记得,您正在寻找的是:

net.ipv4.conf.default.arp_filter=1
net.ipv4.conf.all.arp_filter=1

那将为您解决问题。只需将它们添加到/etc/sysctl.conf并运行' sysctl -p'(或将每一行作为' sysctl -w' 的参数运行。

这将导致Linux仅在实际分配IP地址的接口上响应ARP请求。


嗯...很遗憾,它似乎无法正常工作。我将其粘贴到sysctl.conf中,然后运行sysctl,甚至重新启动,也没有更改。我可以在/ proc中找到选项,然后看一下它们是否已设置,但是如果我从另一个框中键入,则所有响应都来自同一MAC。接口全部在同一网络上(相同的广播等)...
darron

1
如果接口在同一网络上,但地址在不同的子网中,则这是正确的解决方案。确认工作。
Alastair Irvine


0

您可以桥接网关并让防火墙处理IP吗?


据我了解,不...但是如果我错了,请有人纠正我。
darron
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.