Haproxy实现Exchange全透明代理服务

一:背景

公司最近exchange邮件系统来构建高可用邮件系统架构。前端负载均衡就是使用了微软的NLB来实现cas的负载均衡。但是方案实施工程中也发现了一些问题,使用NLB在网络中产生大量广播报,出现丢包严重问题。后改用haproxy替代NLB实现cas的负载均衡,但也这就导致了一个问题,最明显的就是用户通过Haproxy来访问邮件系统后
真正达到邮件系统的地址都是Haproxy的地址,在垃圾邮件过滤的时候就无法实现基于IP的过滤,并且也无法记录IP地址信息。为
了解决这个问题我google了很多方案,可以使用硬负载,硬负载可以实现全透明代理让后端邮件服务器获取到用户的真实IP,还有一种解决方案就是
Haproxy的全透明代理。接下来将会介绍下Haproxy的全透明代理的部署。

二:实验拓扑

三:方案部署

配置Haproxy

  1. #!/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/
  2. 修改配置文件/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表的包都打上标记,然后新增一条路由规则将这些打了标记的数据包发送至本地回环接口进行处理。

  5. chmod +x iptables.sh 
    ./iptables.sh
  6. 修改配置 /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。
时间: 2024-10-10 07:54:09

Haproxy实现Exchange全透明代理服务的相关文章

全透明Activity

第一步:在/res/values/styles里面添加如下代码: <style name="translucent"> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowNoTitle">true</item> <item name=&q

[转]Android有趣的全透明效果--Activity及Dialog的全透明(附android系统自带图标大全

原文:http://blog.csdn.net/sodino/article/details/5822147 1.Activity全透明 同学zzm给了这个有趣的代码,现在公布出来. 先在res/values下建colors.xml文件,写入: <? xml   version = "1.0"   encoding = "UTF-8" ?>    < resources >        < color   name = "t

UINavigationBar设置全透明

ios设置导航条全透明的方法.废话不多说,直接看代码 [self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault]; self.navigationController.navigationBar.shadowImage = [UIImage new]; self.navigationController.navigationBar.tran

Android有趣的全透明效果--Activity及Dialog的全透明(附android系统自带图标大全)[转]

原文地址:http://blog.csdn.net/sodino/article/details/5822147 1.Activity全透明 同学zzm给了这个有趣的代码,现在公布出来. 先在res/values下建colors.xml文件,写入: <? xml version = "1.0" encoding = "UTF-8" ?> < resources > < color name = "transparent&quo

三星I9220刷机包 新蜂ROM V4.1 高级设置 全透明天气插件

ROM介绍: [V4.1版本特性] 1.系统浏览器升级全新内核,极速.省流 2.修复部分bug [V4.0版本特性] 1.增加授权管理Kinguser 2.删除权限管理 3.删除google+ 4.更新最新版本高级设置 5.更新系统反馈 6.修复网速显示位置不正确的bug [V3.9版本特性] 1.更新透明天气资源,半透改为全透,更加美观 2.增加来电归属地显示,短信归属地显示,通话记录归属地显示 3.增加悬浮触点功能,在高级设置里可以打开 4.给相机增加快门声音"开关" 5.给自带浏

iOS_NavigationBar全透明

先上效果图: 1.首先需要一张纯透明的png图片设置为navigationBar的背景 [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"未标题-1.png"] forBarMetrics:UIBarMetricsDefault]; 2.执行完上面那行代码后发现navigationBar设置为透明了,但是在Bar的下方会有一条"线".就是下图的样子. 想

vs2013 皮肤全透明处理&#183;全透明皮肤背景

如图,单一色的vs总会让人烦躁,如果换一个背景的话,肯定会让程序猿更好的coding... 正式切入主题,以vs2013为例. 说明:经过一系列处理,会产生另一个vs2013实验实例,即我们想要的目标,原版的vs2013也会存在,没什么变化. 准备:1.Visual Studio 2013 SDK 2.Visual Studio 2012 Color Theme Editor (上两个东西均可在"工具---扩展和更新"里面下载) 3.一张图片 步骤 1).安装好SDK后,进入VS.先新

pushbutton成为可点击的图标(实现全透明,不论点击与否都只显示Icon)(也就是一个万能控件)

需求 需要2个按钮,一个是音乐开关,一个是关闭窗口,此文章关闭pushButton的透明问题(hovered+pressed都不会有背景色和边框的变化) 原理 使窗口完全透明 代码 _pPushButtonClose->setStyleSheet("background-color: rgba(0, 0, 0, 0)"); // 实现一直都透明 拓展1:点击时有背景,平常透明 [cpp] view plain copy _pPushButtonClose->setFlat(

Android全透明状态栏效果(我的手机安卓版本是4.2.2)

//ALT+Enter, 自行引入相应的包, 1 public class MainActivity extends Activity { 2 3 @SuppressLint("InlinedApi") 4 @Override 5 protected void onCreate(Bundle savedInstanceState) { 6 super.onCreate(savedInstanceState); 7 getWindow().requestFeature(Window.FE