2016-01-13 92 views
0

我正在尝试在服务器和客户端之间建立一个haproxy网关,以获得如下图所示的完全透明代理服务器。我的主要目标是提供负载平衡。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)"

TCP flow diagram

+0

嗯... http://superuser.com/questions/942006/why-does-iptables-not-doing-dnat-for-the-same-subnet –

回答

0

Here是我的情况的定义。

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

答案是设置ip_nonlocal_bind系统控制。