我们有 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 出 eth0、eth1 的 IP 出 eth1 等的 ARP 回复?
编辑
Christopher Cashell 的响应在这种情况下不起作用。我对阅读它抱有很大的希望,但是......不。
编辑 2
解决了!看我下面的回答。
Rya*_*nch 15
您选择的解决方案有效,但也有不涉及 arptables 的替代方案。(克里斯托弗·卡谢尔原本是在正确的轨道上,但他有点偏离了。)
简而言之,您要设置这些参数:
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
Run Code Online (Sandbox Code Playgroud)
这些在运行现代 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'。)
dar*_*ron 10
好的,这是解决方案。首先,回顾一下:
这是我的基本网络计划:
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
Run Code Online (Sandbox Code Playgroud)
所有接口重叠。这在技术上是错误的,也是我所有麻烦的根源……但我必须这样做,因为这个愚蠢的住宅网关。
首先,广播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
Run Code Online (Sandbox Code Playgroud)
这将防止广播进入错误的接口。因此,正确的接口现在将是唯一的响应者。
这本身是不够的。下一位是 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条目来做同样的事情。
这与 Linux 处理 IP 和 NIC 的方式有关。基本上,它将 IP 地址视为属于盒子,而不仅仅是特定的 NIC。结果是您可以从您不期望的接口上的 IP 地址获得 ARP 响应。
解决方案是 sysctl 选项。我记得,你要找的是:
net.ipv4.conf.default.arp_filter=1
net.ipv4.conf.all.arp_filter=1
Run Code Online (Sandbox Code Playgroud)
这将为您解决问题。只需将这些添加到 /etc/sysctl.conf 并运行 ' sysctl -p'(或运行每一行作为 ' sysctl -w'的参数。
这将导致 Linux 仅响应 IP 地址实际分配到的接口上的 ARP 请求。