我们有 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
解决了!请看下面我的回答。
您选择的解决方案有效,但也有不涉及 arptables 的替代方案。(Christopher Cashell 最初是在正确的轨道上,但他有点偏离了方向。)
简而言之,您要设置这些参数:
这些在运行现代 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”。)
好的,这是解决方案。首先,回顾一下:
这是我的基本网络计划:
所有接口重叠。这在技术上是错误的,也是我所有麻烦的根源……但由于这个愚蠢的住宅网关,我必须这样做。
首先,广播 ARP 请求会发送到所有这些。由于所有 4 个 IP 都是有效的本地地址,因此所有 4 个接口都将尝试响应。
1) 安装arptables。在引导期间添加这个地方(/etc/rc.local这里):
这将防止广播进入错误的界面。因此,正确的接口现在将是唯一的响应者。
这本身是不够的。下一位是 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 选项。我记得,您正在寻找的是:
这将为您解决问题。只需将它们添加到 /etc/sysctl.conf 并运行“
sysctl -p
”(或将每一行作为“sysctl -w
”的参数运行。这将导致 Linux 仅响应实际分配 IP 地址的接口上的 ARP 请求。
与此相结合的公认答案:http ://www.linuxquestions.org/questions/linux-networking-3/multiple-interfaces-all-traffic-flows-through-just-one-538701/
其中静态路由仅用于通过某些接口与所需的 IP 进行通信,为我遇到的类似问题创建了一个强大而简单的解决方案。
您可以桥接网关并让防火墙处理 IP 吗?