我继承了一个包含许多子网的网络。我有一个 Ubuntu 盒子(“router1”),它具有外部连接,并充当路由器,它eth1
是外部连接eth2
并eth3
连接到内部子网(net2 和 net3)。路由工作正常:内部子网上的机器可以在需要时看到另一个子网上的机器,并且外部连接正常工作。
我有另一个 Ubuntu 盒子(“router2”),它有另一个外部连接和外部 IP 地址。它与第一个基本相同。我希望能够将其用作冗余路由器,以与第一个相同的方式工作。它具有与第一个路由器相同的eth1
和eth2
设置eth3
(具有不同的 IP 地址 - router1 是 nn1.1、xy2.1、xy3.1;router2 有 nn1.3、xy2.3、xy3.3)。Router2 可以工作,有点。
使用路由器 2 作为网关的 net2 子网上的机器无法看到(ping、ssh、http 等)使用路由器 1 作为网关的 net3 子网上的机器,反之亦然。如果 net2 上的机器和 net3 上的机器具有相同的网关(路由器 1 或路由器 2),则它们可以看到 net3 上的机器。所有机器都可以访问 Internet,无论它们以路由器 1 还是路由器 2 作为网关。
我想我的第一个问题是:是否有可能按照描述的方式让两个冗余路由器服务于同一子网?如果可以,有什么想法我应该在哪里解决这个问题?
答案1
一个常见的问题是有状态的(基于 conntrack 的)防火墙如果没有某种方式同步其知识,就无法处理非对称路由。
例如,路由器的“转发”链可能具有--state ESTABLISHED -j ACCEPT
(或等效功能),这样它既允许单向通信,又允许回复返回。但这依赖于回复通过与原始请求相同的路由器返回。
在您的例子中,子网之间的原始请求(ping 或 TCP SYN)通过路由器 1,但响应通过路由器 2。当路由器 2 处理响应时,它找不到匹配的状态条目(只有路由器 1 知道)并拒绝该数据包。
为了避免这种情况,请使用一个程序来同步两个防火墙之间的连接跟踪状态。对于 Linux,您需要连接跟踪对于 OpenBSD 或 FreeBSD,您可以使用同步。
(我不确定这样的系统是否 100% 可靠,因为回复数据包到达的速度可能比状态传输的速度更快...除非 conntrackd 实际上使防火墙将原始数据包排队,直到释放它变得“安全”?)
或者,仅对于 TCP,您可以允许带有--tcp-flags ACK ACK
标志的数据包双向传输,因为这些数据包将总是是回复。(这也适用于 SCTP,但显然不适用于 UDP。)对于“ping”,我只会无条件地允许两个方向上的 ICMP。