冗余的iptables路由器 – 辅助路由器日志loggingmartian包错误

我们有一个networking,大部分都是用一对冗余的Linux Iptables防火墙/路由器来build立的,但是我们错过了一个关键的难题。 任何发向辅助路由器的本地stream量都将在同一个子网中成功,但不能通过“主”路由器ip。 这是一个例子:


networking图

Router1和Router2在10.0.0.0/24(Subnet0)和10.0.1.0/24(Subnet1)上都有接口,通过ucarp共享一个VIP 10.0.1.1。

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

在Subnet0和Subnet1接口上,Webserver1到Router1的Ping成功

从networking服务器1到路由器2的Subnet1接口上,Ping是成功的。 (不涉及路由)

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

每次发生这种情况,Router2都会logging一个火星包。 7月31日21:39:33 Router2内核:[2772508.610259] martian source 10.0.0.3 10.0.1.11,dev dev0.1000


我们认为火星login线是由到达与networking不同接口的数据包引起的,而路由器已经有不同的接口,系统认为这是一个无效的源接口。 这个问题的解决办法是什么? 当Router1发送给Router2时,我们是否应该像SNAT那样做?

这很可能是一个迟到的build议。 甚至没有一个完整的答案。

我不知道你在你的路由器上运行什么,但是你可能能够使用反向pathfilter ,也就是说你可以部分closures它们。 我认为大多数Linux发行版都允许你将rp_filter设置为0,1,2。 默认情况下它会是1 ,这会导致这个数据包被丢弃。 0只会让所有'不可能'的stream量通过,但2将允许在两个接口上的数据包,如果任一接口将让他们通过,这可以在你的情况下工作。

我不知道这将带来的安全风险的扩展,但在我看来,如果其中一个接口允许,你应该没有问题。

我要刺穿这个答案,不能访问你的iptablesconfiguration和路由configuration。 我有一个非常类似的设置,但也有这样的问题。

我假设你正在从10.0.1.0/24到你的公共IP(或使用MASQUERADE)的stream量SNAT。 尝试在所有其他SNAT / MASQ声明之前放置一行,类似于:

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

这将绕过你后来的SNAT规则,来自/到你本地networking的stream量。

另外,请确保您有适当的转发规则设置。 出于testing目的,允许10.0.0.0/8地址之间的所有stream量(假设您还没有适当的允许规则)。 例如:

 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)