Haproxy 网关设置 - 客户端和服务器在同一个子网上

Posted

技术标签:

【中文标题】Haproxy 网关设置 - 客户端和服务器在同一个子网上【英文标题】:Haproxy gateway settings - client and server are on the same subnetwork 【发布时间】:2016-01-13 12:42:26 【问题描述】:

我正在尝试在服务器和客户端之间设置一个 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)"

【问题讨论】:

嗯...superuser.com/questions/942006/… 【参考方案1】:

Here是我的情况的定义。

透明代理模式来了:HAProxy可以配置为在建立与服务器的TCP连接时欺骗客户端IP地址。这样,服务器认为连接直接来自客户端(当然,服务器必须回复 HAProxy 而不是客户端,否则无法工作:客户端将在收到服务器 IP 的确认在 HAProxy 的 IP 上建立连接)。

答案是设置ip_nonlocal_bind系统控制。

【讨论】:

以上是关于Haproxy 网关设置 - 客户端和服务器在同一个子网上的主要内容,如果未能解决你的问题,请参考以下文章

HAProxy基于cookie实现客户端会话保持

HAProxy负载均衡原理及企业级实例部署haproxy集群

HAProxy负载均衡原理及企业级实例部署haproxy集群

HAProxy负载均衡原理及企业级实例部署haproxy集群

haproxy-----网关

企业实战(22)基于Haproxy负载均衡+Keepalived高可用集群实战详解