热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

tproxy_Haproxy的全透明代理

Haproxy的全透明代理一:背景Haproxy是一款优秀的负载均衡软件,相比于Nginx来说,Haproxy可以承受的负载能力更强,这些

Haproxy的全透明代理

一:背景

Haproxy是一款优秀的负载均衡软件,相比于Nginx来说,Haproxy可以承受的负载能力更强,这些都要归功于Haproxy的一些实现机制,单缓冲,splice系统调用,单进程、事件驱动模型,Zero-copy forwarding,树形存储等等,所有的这些细微之处的优化实现了在中等规模负载之上依然有着相当低的CPU负载,甚至于在非常高的负载场景中,5%的用户空间占用率和95%的系统空间占用率也是非常普遍的现象,这意味着HAProxy进程消耗比系统空间消耗低20倍以上。因此,对OS进行性能调优是非常重要的。即使用户空间的占用率提高一倍,其CPU占用率也仅为10%,这也解释了为何7层处理对性能影响有限这一现象。由此,在高端系统上HAProxy的7层性能可轻易超过硬件负载均衡设备。

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

二:实验拓扑

主要是让Haproxy的设备变成一个网桥设备,借助tpproxy来实现Haproxy的全透明代理。

三:方案部署

设置HAproxy的网卡为桥接模式(桥接模式原理请参考其他博文)brctl addbr br0  #添加一个桥接设备

brctl addif br0 eth0 #向桥接设备添加端口

brctl addif br0 eth1

ifconfig eth0 0.0.0.0 #清楚网卡上的地址

ifconfig eth1 0.0.0.0

ifconfig br0 172.16.35.206 netmask 255.255.255.0 #设置桥接设备的地址

ip route add default via 172.16.35.1 #添加默认路由

到此桥接模式就设置好了,接在桥接设备上的机器都可以获取公司的内网IP地址。逻辑上是和公司内网是一个网络。原理和虚拟机中的桥接模式一样。

brctl addif 就相当于给这个桥接设备添加可用的端口。

我们还可以将地址信息写入配置文件中./etc/sysconfig/network-scripts/ifcfg-br0中

接着开始配置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/

到此HAproxy配置完成。限制于环境这里我使用tcp协议的ssh来完成实验。

下面是HAproxy 的一个代理ssh的配置文件listen  test 0.0.0.0:1000

balance roundrobin

mode tcp

option tcplog

source 0.0.0.0 usesrc clientip #重点,TPROXY需要加上这行。

server  test 172.16.35.81:22 weight 1 check inter 2000 rise 2 fall 5

到此为止一个支持TProxy的HAproxy配置完成。

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

配置内核参数支持IP转发和对源地址进行检查:echo 1 > /proc/sys/net/ipv4/conf/all/forwarding

echo 2 > /proc/sys/net/ipv4/conf/default/rp_filter

echo 2 > /proc/sys/net/ipv4/conf/all/rp_filter

echo 0 > /proc/sys/net/ipv4/conf/br0/rp_filter

给CoreMail服务器设置默认路由

设置默认路由的原因就在于要将所有的流量都返回到haproxy,让haproxy修改其源地址为haproxy的地址。首先在网卡的配置文件中已经通过gateway了设置了默认路由,默认路由的地址就是Haproxy的地址,又因为

系统本身所在的网段默认是从eth0接口出去没有设置默认路由到Haproxy地址,所以需要额外添加一条同网段的

路由信息。添加后的路由表的信息如下

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

172.16.35.0     172.16.35.206   255.255.255.0   UG    0      0        0 eth0  #添加的路由

172.16.35.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0

169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0

0.0.0.0         172.16.35.206   0.0.0.0         UG    0      0        0 eth0 #在网卡配置文件中添加的

到此为此基于TProxy的Haproxy全透明代理完成了。

HAproxy的全透明代理还有第二种方法实现,那就是把两台CoreMail服务器单独划一个子网由HAproxy做网关,CoreMail的默认网关指向Haproxy,并且HAproxy要实现NAT,将返回的数据包源地址修改成自己的地址。限于篇幅这里就不介绍HAPROXY的实现TPROXY的第二种方法了。

国内关于HAproxy的全透明模式的博文很少很少,大多数都是在问这个问题。本文我也有很多地方是一知半解,只是实现了全透明的功能,后期将会介绍下网桥模式的一些理论。



推荐阅读
  • centos6.8 下nginx1.10 安装 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 三、查看Linux版本查看系统版本信息的命令:lsb_release-a[root@localhost~]#lsb_release-aLSBVersion::co ... [详细]
  • 构建LNMP架构平台
    LNMP架构的组成:Linux、Nginx、MySQL、PHP关于NginxNginx与apache的作用一样,都是为了搭建网站服务器,由俄罗斯人lgorsysoev开发,其特点是 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 原文地址http://balau82.wordpress.com/2010/02/28/hello-world-for-bare-metal-arm-using-qemu/最开始时 ... [详细]
  • 现在比较流行使用静态网站生成器来搭建网站,博客产品着陆页微信转发页面等。但每次都需要对服务器进行配置,也是一个重复但繁琐的工作。使用DockerWeb,只需5分钟就能搭建一个基于D ... [详细]
  • Linux一键安装web环境全攻略
    摘自阿里云服务器官网,此处一键安装包下载:点此下载安装须知1、此安装包可在阿里云所有Linux系统上部署安装,此安装包包含的软件及版本为& ... [详细]
  • 有意向可以发简历到邮箱内推.简历直达组内Leader.能做同事的话,内推奖励全给你. ... [详细]
author-avatar
排骨冬菇面
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有