Iptables - 当涉及环回流量时,路由发生在 OUTPUT 链之前

Iptables - 当涉及环回流量时,路由发生在 OUTPUT 链之前

我正在使用 keepalived (VRRP) 实现高可用性 (HA) 服务。此 HA 应该仅适用于在端口 443 上运行的应用程序,因此我们不会对整个服务器进行故障转移,而是只对应用程序进行故障转移。

为了使其正常工作,当请求的端口为 443 时,我必须强制子网中的所有服务器将数据发送到虚拟 IP(VIP)而不是真实服务器 IP。对于此示例,想象一下以下内容:

主服务器-私有IP:10.101.151.59
辅助服务器-私有IP:10.101.151.9
对两个服务器都有效的虚拟 IP:10.101.251.120

为了力量与 VIP 的通信,当流量流向端口 443 时,我一直对子网中的每个服务器使用以下规则:

iptables -t nat -A OUTPUT -p tcp -d 10.101.151.59 --dport 443 -j DNAT --to-destination 10.101.251.120:443;

此规则适用于VIP 不属于发起请求的服务器。但是,想象一下规则不起作用的这种情况:

1) 应用程序在主服务器上崩溃。2
) 发生故障转移,辅助服务器开始接收/处理请求,并将拥有 VIP。

如果现在在辅助服务器上运行的此应用程序尝试与自身通信,它将向主服务器的真实 IP 发出请求,因为此 IP 是通过名称解析自动收集的

理论上,我希望此流量与上面定义的 iptables 规则相匹配。
但是,一旦 VIP 由辅助服务器本身拥有,Iptables 就必须将真实 IP 转换为服务器的本地 IP 之一,这将涉及环回。问题是它根本不起作用。

实际上,流量确实流向主服务器,似乎此规则从未激活。由于主服务器已关闭,我只是收到“连接被拒绝”信息。

所以问题是:当目标 VIP 属于发起请求的同一服务器时,为什么我看不到此规则的效果? 是因为此通信中可能涉及环回吗? 如果涉及环回,这有关系吗?

我知道由 FW HOST 发起的所有流量都将跨越 OUTBOUND 链,所以不确定为什么没有发生这种情况,显然路由首先发生。我读到内核可能会阻止本地流量的重新路由,所以我尝试了以下操作:

sysctl -w net.ipv4.conf.all.route_localnet=1

但这还不够。我是否遗漏了什么?

我正在使用 Red Hat Enterprise Linux Server 版本 6.6(Santiago)。

谢谢。如果问题不清楚,请告诉我。

相关内容