阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Haproxy实现Exchange全透明代理服务

332次阅读
没有评论

共计 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 实现 Exchange 全透明代理服务

三: 方案部署

配置 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 实现 Exchange 全透明代理服务

HAproxy 的详细介绍 :请点这里
HAproxy 的下载地址 :请点这里

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-20发表,共计5240字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中