![Iptables - 当涉及环回流量时,路由发生在 OUTPUT 链之前](https://linux22.com/image/722418/Iptables%20-%20%E5%BD%93%E6%B6%89%E5%8F%8A%E7%8E%AF%E5%9B%9E%E6%B5%81%E9%87%8F%E6%97%B6%EF%BC%8C%E8%B7%AF%E7%94%B1%E5%8F%91%E7%94%9F%E5%9C%A8%20OUTPUT%20%E9%93%BE%E4%B9%8B%E5%89%8D.png)
我正在使用 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)。
谢谢。如果问题不清楚,请告诉我。