共计 5240 个字符,预计需要花费 14 分钟才能阅读完成。
一: 背景
公司最近 Exchange 邮件系统来构建高可用邮件系统架构。前端负载均衡就是使用了微软的 NLB 来实现 cas 的负载均衡。但是方案实施工程中也发现了一些问题,使用 NLB 在网络中产生大量广播报,出现丢包严重问题。后改用 haproxy 替代 NLB 实现 cas 的负载均衡,但也这就导致了一个问题,最明显的就是用户通过 Haproxy 来访问邮件系统后 真正达到邮件系统的地址都是 Haproxy 的地址,在垃圾邮件过滤的时候就无法实现基于 IP 的过滤,并且也无法记录 IP 地址信息。为 了解决这个问题我 google 了很多方案,可以使用硬负载,硬负载可以实现全透明代理让后端邮件服务器获取到用户的真实 IP,还有一种解决方案就是 Haproxy 的全透明代理。接下来将会介绍下 Haproxy 的全透明代理的部署。
Haproxy+Keepalived 搭建 Weblogic 高可用负载均衡集群 http://www.linuxidc.com/Linux/2013-09/89732.htm
Keepalived+HAProxy 配置高可用负载均衡 http://www.linuxidc.com/Linux/2012-03/56748.htm
CentOS 6.3 下 Haproxy+Keepalived+Apache 配置笔记 http://www.linuxidc.com/Linux/2013-06/85598.htm
Haproxy + KeepAlived 实现 WEB 群集 on CentOS 6 http://www.linuxidc.com/Linux/2012-03/55672.htm
Haproxy+Keepalived 构建高可用负载均衡 http://www.linuxidc.com/Linux/2012-03/55880.htm
二: 实验拓扑
三: 方案部署
配置 Haproxy
#!/bin/bash
wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.25.tar.gz
tar zxvf haproxy-1.4.25.tar.gz
cd haproxy-1.4.25
yum install gcc gcc-c++ autoconf automake -y
make TARGET=linux2628 arch=x86_64 USE_LINUX_TPROXY=1 #重点 USE_LINUX_TPROXY= 1 用于编译支持 TPTOXY
make install
mkdir /etc/haproxy
cp examples/haproxy.cfg /etc/haproxy
cp examples/haproxy.init /etc/init.d/haproxy
chmod +x /etc/init.d/haproxy
cp haproxy /usr/sbin/
修改配置文件 /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local0
maxconn 409600
chroot /usr/local/share
# uid 501
# gid 501
daemon
nbproc 1
pidfile /usr/local/haproxy/logs/haproxy.pid
# debug
defaults
log global
maxconn 100000
contimeout 500000
clitimeout 3600000
srvtimeout 3600000
option redispatch
retries 6
frontend mail.domain.com
mode http
bind 0.0.0.0:80
log global
option tcplog
redirect location https://mail.domain.com/owa
frontend owa_443
mode tcp
bind 0.0.0.0:443
default_backend pool_443
log global
option tcplog
backend pool_443
balance source
option redispatch
option abortonclose
option persist
stick on src
stick-table type ip size 10240k expire 240m
source 0.0.0.0 usesrc clientip #重点,TPROXY 需要加上这行。
server cas01 10.130.170.130:443 check inter 5000 weight 1 rise 2 fall 3
server cas02 10.130.170.131:443 check inter 5000 weight 1 rise 2 fall 3
frontend smtp_25
mode tcp
bind 0.0.0.0:25
default_backend pool_smtp
log global
option tcplog
backend pool_smtp
balance source
option redispatch
option abortonclose
option persist
stick on src
stick-table type ip size 10240k expire 240m
source 0.0.0.0 usesrc clientip #重点,TPROXY 需要加上这行。
server cas01 10.130.170.130:25 check inter 5000 weight 1 rise 2 fall 3
server cas02 10.130.170.131:25 check inter 5000 weight 1 rise 2 fall 3
frontend pop_995
mode tcp
bind 0.0.0.0:995
default_backend pool_pop
log global
option tcplog
backend pool_pop
balance source
option redispatch
option abortonclose
option persist
stick on src
stick-table type ip size 10240k expire 240m
server cas01 10.130.170.130:995 check inter 5000 weight 1 rise 2 fall 3
server cas02 10.130.170.131:995 check inter 5000 weight 1 rise 2 fall 3
frontend pop_993
mode tcp
bind 0.0.0.0:993
default_backend pool_993
log global
option tcplog
backend pool_993
balance source
# option forwardfor
# option originalto
option redispatch
option abortonclose
option persist
stick on src
stick-table type ip size 10240k expire 240m
server cas01 10.130.170.130:993 check inter 5000 weight 1 rise 2 fall 3
server cas02 10.130.170.131:993 check inter 5000 weight 1 rise 2 fall 3
frontend pop_135
mode tcp
bind 0.0.0.0:135
default_backend pool_135
log global
option tcplog
backend pool_135
balance source
option redispatch
option abortonclose
option persist
stick on src
stick-table type ip size 10240k expire 240m
server cas01 10.130.170.130:135 check inter 5000 weight 1 rise 2 fall 3
server cas02 10.130.170.131:135 check inter 5000 weight 1 rise 2 fall 3
frontend pop_593
mode tcp
bind 0.0.0.0:593
default_backend pool_593
log global
option tcplog
backend pool_593
balance source
option redispatch
option abortonclose
option persist
stick on src
stick-table type ip size 10240k expire 240m
server cas01 10.130.170.130:593 check inter 5000 weight 1 rise 2 fall 3
server cas02 10.130.170.131:593 check inter 5000 weight 1 rise 2 fall 3
frontend pop_60001
mode tcp
bind 0.0.0.0:60001
default_backend pool_60001
log global
option tcplog
backend pool_60001
balance source
option redispatch
option abortonclose
option persist
stick on src
stick-table type ip size 10240k expire 240m
server cas02 10.130.170.130:60001 check inter 5000 weight 1 rise 2 fall 3
server cas02 10.130.170.131:60001 check inter 5000 weight 1 rise 2 fall 3
frontend pop_55000
mode tcp
bind 0.0.0.0:55000
default_backend pool_55000
log global
option tcplog
backend pool_55000
balance source
option redispatch
option abortonclose
option persist
stick on src
stick-table type ip size 10240k expire 240m
server cas02 10.130.170.130:55000 check inter 5000 weight 1 rise 2 fall 3
server cas02 10.130.170.131:55000 check inter 5000 weight 1 rise 2 fall 3
frontend vs_stats :8081
mode http
log global
option httplog
default_backend stats_backend
backend stats_backend
mode http
stats enable
stats uri /stats
stats auth admin:admin
3. 由于 ExchangeRPC 的端口是动态端口,haproxy 必须使用固定端口,我这里改成了 60001 和 55000,修改注册表即可,这里不做介绍。
4. 配置 TProxy 代码如下 vi iptables.sh
#!/bin/bash
/sbin/iptables -F
/sbin/iptables -t mangle -N DIVERT
/sbin/iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
/sbin/iptables -t mangle -A DIVERT -j MARK –set-mark 1
/sbin/iptables -t mangle -A DIVERT -j ACCEPT
/sbin/ip rule add fwmark 1 lookup 100
/sbin/ip route add local 0.0.0.0/0 dev lo table 100
上面的代码目的是为了让所有进入网卡的 mangle 表的包都打上标记,然后新增一条路由规则将这些打了标记的数据包发送至本地回环接口进行处理。
chmod +x iptables.sh
./iptables.sh
修改配置 /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 2
net.ipv4.conf.all.rp_filter = 2
net.ipv4.conf.eth0.rp_filter = 0
net.ipv4.conf.all.send_redirects = 1
net.ipv4.conf.default.send_redirects = 1
7. 到此为此基于 TProxy 的 Haproxy 全透明代理完成了。为真实实现高可用,haproxy 也是单点故障,keepalived 也不在这里介绍。
然后将两台 cas server 的网关改为 haproxy 的 ip。现在可以查看到垃圾邮件的 ip。
HAproxy 的详细介绍 :请点这里
HAproxy 的下载地址 :请点这里