Ubuntu Linux - 多个 NIC,同一个 LAN...ARP 响应总是从单个 NIC 发出

Ubuntu Linux - 多个 NIC,同一个 LAN...ARP 响应总是从单个 NIC 发出

我们使用 AT&T U-Verse 互联网服务,但它有一个极其愚蠢的 DSL 网关。

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

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

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

网关基本上是在执行 ARP ping 以查看 IP 是否在预期的 MAC 上做出响应。由于 4 个 NIC 都位于同一个 LAN 上,因此 Linux 使用单个接口响应所有 IP 的 ARP 请求。这不是网关所期望的,并且它弄乱了其他 3 个 NIC。网关拒绝为 ARP ping 结果不是预期 MAC 的 IP 路由传入流量。

我们如何才能让 eth0 的 IP 的 ARP 答复传出 eth0,让 eth1 的 IP 传出 eth1,等等?

编辑

Christopher Cashell 的回应在这种情况下不起作用。我满怀希望地读了它,但是……没有。

编辑2

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

答案1

您选择的解决方案有效,但还有其他不涉及 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”。

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

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

答案2

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

这是我的基本网络计划:

 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)安装ARP 表. 在启动时添加此内容(/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_过滤器如果 ARP 响应数据包位于错误的接口上,则似乎会拒绝传出的 ARP 响应数据包。因此...

2)禁用rp_过滤器

在 Debian/Ubuntu 上,这意味着注释掉两个rp_过滤器行数/etc/sysctl.d/10-network-security.conf

启用此选项是有原因的……即帮助防止跨接口欺骗攻击。我读到它验证数据包对于其进入或发出的接口是否合法(通过交换 MAC 和 IP 并查看它是否仍通过同一接口路由)。因此,通常关闭它不是一个好主意。就我而言,所有接口都在同一个网络上……因此该检查实际上根本不重要。

如果我确实添加了另一个接口并且需要欺骗保护,也许可以制作一些ARP 表/iptables条目来做同样的事情。

答案3

这与 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 请求。

答案4

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

相关内容