冗余 Iptables 路由器 - 辅助路由器记录火星数据包错误

冗余 Iptables 路由器 - 辅助路由器记录火星数据包错误

我们的网络主要由一对冗余的 Linux Iptables 防火墙/路由器组成,但我们缺少一个关键部分。发往辅助路由器的任何本地流量在同一个子网中成功,但发往“主”路由器 IP 时失败。以下是一个例子:


网络图

Router1 和 Router2 均在 10.0.0.0/24(子网 0)和 10.0.1.0/24(子网 1)上具有接口,并通过 ucarp 共享 VIP 10.0.1.1。

Webserver1 的 IP 为 10.0.1.11,其默认网关为 10.0.1.1

从 Webserver1 到 Router1 的 Subnet0 和 Subnet1 接口上的 ping 操作均成功

正如预期的那样,从 Webserver1 到 Subnet1 接口上的 Router2 的 ping 操作成功。(不涉及路由)

但是,从 Webserver1 到 Router2 的 Subnet0 接口的 ping 操作失败。Router1 在 Subnet1 接口上收到回应请求,并按预期将其转发到 Subnet0 接口,但是当回应请求通过正确的 (Subnet0) 接口到达 Router2 时,Router2 不会发送回复。

每次发生这种情况时,Router2 都会记录一个火星数据包。7 月 31 日 21:39:33 Router2 内核:[2772508.610259] 火星源 10.0.0.3 来自 10.0.1.11,位于 dev bond0.1000 上


我们认为火星日志行是由于数据包到达了路由器上已有不同接口的网络的不同接口而引起的,系统认为该接口是无效的源接口。该问题的解决方案是什么?当 Router1 发送到 Router2 时,我们是否应该执行类似 SNAT 的操作?

答案1

这很可能是一个来得太晚的建议。甚至不是一个完整的答案。

我不知道你的路由器上运行着什么,但你也许可以使用反向路径过滤器,也就是说,你可以部分关闭它们。我认为大多数 Linux 发行版都允许你设置rp_过滤器级别 0、1、2。默认情况下1,这会导致该数据包被丢弃。0只会让所有“不可能”的流量通过,但是2如果任一接口允许数据包通过,则将允许两个接口上的数据包,这在您的情况下可以起作用。

我不知道这将带来多大程度的安全风险,但在我看来,如果其中一个接口允许,那么你应该不会有问题。

答案2

我将尝试回答这个问题,因为无法访问您的 iptables 配置和路由配置。不过,我的设置非常相似,也遇到过此类问题。

我假设您正在将来自 10.0.1.0/24 的流量 SNAT 到您的公共 IP(或使用 MASQUERADE)。尝试在所有其他 SNAT/MASQ 声明之前添加一行,类似于:

iptables -A POSTROUTING -s 10.0.0.0/8 -d 10.0.0.0/8 -j ACCEPT  

这将绕过您以后针对来自/到您的本地网络的流量的 SNAT 规则。

此外,请确保您已正确设置转发规则。出于测试目的,允许 10.0.0.0/8 地址之间的所有流量(假设您尚未设置适当的宽松规则)。例如:

iptables -A FORWARD -s 10.0.0.0/8 -d 10.0.0.0/8 -j ACCEPT

如果我完全错了,请发布两个路由器的以下输出:

iptables -nL
iptables -nL -t nat
ip rule show
ip route show
ip route show table XXXX  (For each table listed as a lookup in rules) 

相关内容