我正在尝试在服务器和客户端之间设置一个 haproxy 网关,以实现完全透明的代理,如下图所示。我的主要目标是提供负载平衡。
有一个简单的应用程序在服务器端侦听端口 25。客户端尝试连接网关机器上的 25 端口,网关上的 haproxy 选择一个可用的服务器,然后将连接重定向到服务器。
这种方法的网络分析产生了如图所示的 tcp 流:客户端在最后重置连接,因为它没有向服务器发送 syn 数据包。
这种 haproxy 用法是真的吗?我的问题与配置有关吗?或者客户端应该直接连接到服务器(这对我来说没有多大意义,但我不确定。如果这是真的,那么 haproxy 将如何干预连接并进行负载平衡)?
编辑:
我开始认为这个问题与网关上的路由和 NAT 有关。所有这三台机器都在同一个子网中,但我已经为客户端和服务器添加了到网关的路由。网关上的规则还有:
iptables -t mangle -N DIVERT
iptables -t mangle -A DIVERT -j MARK --set-mark 0x01/0x01
iptables -t mangle -A DIVERT -j ACCEPT
iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
iptables -t mangle -A PREROUTING -p tcp --dport 25 -j TPROXY \
--tproxy-mark 0x1/0x1 --on-port 10025
ip route flush table 100
ip rule add fwmark 1 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100
现在的问题是我应该在网关中做什么来更改"syn-ack (src: S, dst: C)"
为"syn-ack (src: GW, dst: C)"
?