CentOS搭建配置Haproxy透明代理
时间:2014-12-14 21:58 来源:linux.it.net.cn 作者:IT
20130514补充:
必须配置转发。。。
net.ipv4.ip_forward = 1
这个忘了写上了,感谢网友 @mcg 的提醒
~~~~~~~~
昨晚写了三分之二的文章就因为电脑突然死机而烟消云散,定是因为我废话太多惩罚我来的。。。所以这次就精简些罢,不懂的就谷歌去。。。
Haproxy透明代理三步走:
编译内核
源码安装iptables
安装配置haproxy
系统版本:
CentOS 5.5
目的:
搭建haproxy透明代理,做app服务负载均衡
步骤:
PS:当然也可以下载本人编译好的 kernel-2.6.32.27tproxy-1.i386.rpm,下载地址:
kernel-2.6.32.27tproxy-1.i386.rpm
kernel-2.6.32.27tproxy-1.x86_64.rpm
1、编译内核
为何要编译内核,只因为要用到tproxy。。。
内核版本2.6.28开始不用再打tproxy的补丁,所以在这里选择了kernel-2.6.32.27来编译
# yum install make rpm-build gcc gcc-c++ ncurses-devel elfutils elfutils-libs libstdc++-devel -y
# cd /usr/src
# wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.27.tar.bz2
# tar xf linux-2.6.32.27.tar.bz2
# ln -s linux-2.6.32.27 linux
# cd linux
# make clean && make mrproper
# cp /boot/config-`uname -r` ./.config
# make menuconfig
选中 Load an Alternate Configuration File, 按Enter进去,默认加载 .config文件,即上面从/boot分区拷贝过来的 .config文件
然后选中以下对应的选项以支持TPROXY
Networking
> Networking support ->
> Networking options ->
> Network packet filtering framework (Netfilter) ->
> Core Netfilter Configuration ->
Transparent proxying support (EXPERIMENTAL)
Netfilter Xtables support (required for ip_tables)
Netfilter Connection tracking
> Connection tracking flow accounting
> Connection mark tracking support
"TPROXY" target support (EXPERIMENTAL)
"socket" match support (EXPERIMENTAL)
通常选中后会是下面两种情况:
[*]: Built-in
[M]: Module
尽可能以模块[M]选中以上对应的选项
Tips:
连按两下 <ESC> 可以返回上一层菜单
返回主菜单后选中以下选项:
General setup –>
[*] enable deprecated sysfs features to support old userspace tools
修改这项是因为旧版的mkinitrd及其nash在内核没有CONFIG_SYSFS_DEPRECATED_V2参数时默认使用旧版sysfs路径格式,从而在新内核下无法正确访问/sys内的硬盘信息节点。
不修改会报如下错误:
mount: could not find filesystem ‘/dev/root’
setuproot: moving /dev failed: No such file or directory
setuproot: error mounting /proc: No such file or directory
setuproot: error mounting /sys: No such file or directory
switchroot: mount failed: No such file or directory
Kernel panic – not syncing: Attempted to kill init!
Tips:
注意全部操作完成保存后编辑 .config文件查看一下是否有以下内容:
CONFIG_SYSFS_DEPRECATED_V2=y
然后按enter编辑下面这个选项:
General Setup —>
() Local version – append to kernel release
输入一个字符串用来分辨新内核,比如:
-tproxy
然后通过连按<ESC>退出编辑菜单,最后选择 YES 保存。。。
保存后执行下面的命令以生成rpm包:
# make rpm
好了,现在可以去喝杯咖啡了--这个过程视机子性能不同而所需时间长短也不同。。。
生成的rpm包在 /usr/src/redhat/RPMS/i386(或者是x86_64)
我这里系统是64位的,所以。。。
# rpm -ivh --nodeps /usr/src/redhat/RPMS/x86_64/kernel-2.6.32.27tproxy-1.x86_64.rpm
# mkinitrd /boot/initrd-2.6.32.27-tproxy.img 2.6.32.27-tproxy
编辑grub.conf文件,添加以下内容:
title CentOS-Tproxy (2.6.32.27-tproxy)
root (hd0,0)
kernel /boot/vmlinuz-2.6.32.27-tproxy ro root=LABEL=/
initrd /boot/initrd-2.6.32.27-tproxy.img
保存后重启。。。
记住了,重启后须是从新内核进入系统。。。
Tips:
上面kernel那一行后面不要加其他东西,像我之前加了acpi=off noapic这两个参数启动时内核就崩溃了。。
从新内核启动进入系统,可以运行下面这条命令查看一下内核版本:
# uname -a
2、源码安装iptables
内核编译完了,现在需要从源码安装iptables,因为centos5上的iptables版本太低,要支持tproxy的话还得打补丁,所以这里选择了较新版本 iptables1.4.8
# wget http://www.netfilter.org/projects/iptables/files/iptables-1.4.8.tar.bz2
# yum remove iptables -y
# tar xf iptables-1.4.8.tar.bz2
# cd iptables-1.4.8
# ./configure --prefix=/usr/local/iptables
# make && make install
3、安装配置haproxy
# wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.21.tar.gz
# tar xf haproxy-1.4.21.tar.gz
# cd haproxy-1.4.21
# yum -y install pcre-devel
# make TARGET=linux26 CPU=x86_64 USE_STATIC_PCRE=1 USE_LINUX_TPROXY=1
# make install target=linux26
# mkdir -p /usr/local/haproxy/{conf,run,sbin}
# ln -s /usr/local/sbin/haproxy /usr/local/haproxy/sbin
配置haproxy:
# vi /usr/local/haproxy/conf/haproxy.cfg
添加以下内容:
global
log 127.0.0.1local1 notice
maxconn32000
daemon
pidfile /usr/local/haproxy/run/haproxy.pid
defaults applications TCP
log global
mode tcp
maxconn 32000
retries 3
option redispatch
balance leastconn
listen app_tcp 172.168.16.10:3999
mode tcp
source 0.0.0.0 usesrc clientip
option srvtcpka
option clitcpka
option tcpka
option tcplog
clitimeout 3d
srvtimeout 3d
contimeout 3d
server app1 172.168.16.54:3999 check
listen stats_auth 172.168.16.10:10800
mode http
option httplog
stats enable
stats refresh 20s
stats uri /status
stats auth admin:admin
stats hide-version
设置开机自启动:
# vi /etc/rc.local
添加以下内容:
/usr/local/haproxy/sbin/haproxy -D -f
/usr/local/haproxy/conf/haproxy.cfg
配置平台日志支持:
# vi /etc/syslog.conf
添加:
local3.*/var/log/haproxy.log
local0.*/var/log/haproxy.log
# vi /etc/sysconfig/syslog
修改:
SYSLOGD_OPTIONS="-r -m 0"
重启一下:
# /etc/init.d/syslog restart
配置路由转发:
# vi /etc/sysctl.conf
net.ipv4.conf.default.rp_filter=1
添加以下内容到/etc/rc.local
iptables -t mangle -N DIVERT
iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
iptables -t mangle -A DIVERT -j MARK --set-mark 111
iptables -t mangle -A DIVERT -j ACCEPT
ip rule add fwmark 111 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100
Tips:
需要注意的一点,后端服务器的网关必须指向ha。。。
切记切记。。。
(责任编辑:IT)
20130514补充: 必须配置转发。。。 net.ipv4.ip_forward = 1 这个忘了写上了,感谢网友 @mcg 的提醒 ~~~~~~~~ 昨晚写了三分之二的文章就因为电脑突然死机而烟消云散,定是因为我废话太多惩罚我来的。。。所以这次就精简些罢,不懂的就谷歌去。。。 Haproxy透明代理三步走: 编译内核 源码安装iptables 安装配置haproxy 系统版本: CentOS 5.5 目的: 搭建haproxy透明代理,做app服务负载均衡 步骤:
PS:当然也可以下载本人编译好的 kernel-2.6.32.27tproxy-1.i386.rpm,下载地址: 1、编译内核 为何要编译内核,只因为要用到tproxy。。。 内核版本2.6.28开始不用再打tproxy的补丁,所以在这里选择了kernel-2.6.32.27来编译 # yum install make rpm-build gcc gcc-c++ ncurses-devel elfutils elfutils-libs libstdc++-devel -y # cd /usr/src # wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.27.tar.bz2 # tar xf linux-2.6.32.27.tar.bz2 # ln -s linux-2.6.32.27 linux # cd linux # make clean && make mrproper # cp /boot/config-`uname -r` ./.config # make menuconfig 选中 Load an Alternate Configuration File, 按Enter进去,默认加载 .config文件,即上面从/boot分区拷贝过来的 .config文件 然后选中以下对应的选项以支持TPROXY Networking > Networking support -> > Networking options -> > Network packet filtering framework (Netfilter) -> > Core Netfilter Configuration -> Transparent proxying support (EXPERIMENTAL) Netfilter Xtables support (required for ip_tables) Netfilter Connection tracking > Connection tracking flow accounting > Connection mark tracking support "TPROXY" target support (EXPERIMENTAL) "socket" match support (EXPERIMENTAL) 通常选中后会是下面两种情况: [*]: Built-in [M]: Module 尽可能以模块[M]选中以上对应的选项 Tips: 连按两下 <ESC> 可以返回上一层菜单 返回主菜单后选中以下选项: General setup –> [*] enable deprecated sysfs features to support old userspace tools 修改这项是因为旧版的mkinitrd及其nash在内核没有CONFIG_SYSFS_DEPRECATED_V2参数时默认使用旧版sysfs路径格式,从而在新内核下无法正确访问/sys内的硬盘信息节点。 不修改会报如下错误: mount: could not find filesystem ‘/dev/root’ setuproot: moving /dev failed: No such file or directory setuproot: error mounting /proc: No such file or directory setuproot: error mounting /sys: No such file or directory switchroot: mount failed: No such file or directory Kernel panic – not syncing: Attempted to kill init! Tips: 注意全部操作完成保存后编辑 .config文件查看一下是否有以下内容: CONFIG_SYSFS_DEPRECATED_V2=y 然后按enter编辑下面这个选项: General Setup —> () Local version – append to kernel release 输入一个字符串用来分辨新内核,比如: -tproxy 然后通过连按<ESC>退出编辑菜单,最后选择 YES 保存。。。 保存后执行下面的命令以生成rpm包: # make rpm 好了,现在可以去喝杯咖啡了--这个过程视机子性能不同而所需时间长短也不同。。。 生成的rpm包在 /usr/src/redhat/RPMS/i386(或者是x86_64) 我这里系统是64位的,所以。。。 # rpm -ivh --nodeps /usr/src/redhat/RPMS/x86_64/kernel-2.6.32.27tproxy-1.x86_64.rpm # mkinitrd /boot/initrd-2.6.32.27-tproxy.img 2.6.32.27-tproxy 编辑grub.conf文件,添加以下内容: title CentOS-Tproxy (2.6.32.27-tproxy) root (hd0,0) kernel /boot/vmlinuz-2.6.32.27-tproxy ro root=LABEL=/ initrd /boot/initrd-2.6.32.27-tproxy.img 保存后重启。。。 记住了,重启后须是从新内核进入系统。。。 Tips: 上面kernel那一行后面不要加其他东西,像我之前加了acpi=off noapic这两个参数启动时内核就崩溃了。。
从新内核启动进入系统,可以运行下面这条命令查看一下内核版本: # uname -a 2、源码安装iptables 内核编译完了,现在需要从源码安装iptables,因为centos5上的iptables版本太低,要支持tproxy的话还得打补丁,所以这里选择了较新版本 iptables1.4.8 # wget http://www.netfilter.org/projects/iptables/files/iptables-1.4.8.tar.bz2 # yum remove iptables -y # tar xf iptables-1.4.8.tar.bz2 # cd iptables-1.4.8 # ./configure --prefix=/usr/local/iptables # make && make install 3、安装配置haproxy # wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.21.tar.gz # tar xf haproxy-1.4.21.tar.gz # cd haproxy-1.4.21 # yum -y install pcre-devel # make TARGET=linux26 CPU=x86_64 USE_STATIC_PCRE=1 USE_LINUX_TPROXY=1 # make install target=linux26 # mkdir -p /usr/local/haproxy/{conf,run,sbin} # ln -s /usr/local/sbin/haproxy /usr/local/haproxy/sbin 配置haproxy: # vi /usr/local/haproxy/conf/haproxy.cfg 添加以下内容: global log 127.0.0.1local1 notice maxconn32000 daemon pidfile /usr/local/haproxy/run/haproxy.pid defaults applications TCP log global mode tcp maxconn 32000 retries 3 option redispatch balance leastconn listen app_tcp 172.168.16.10:3999 mode tcp source 0.0.0.0 usesrc clientip option srvtcpka option clitcpka option tcpka option tcplog clitimeout 3d srvtimeout 3d contimeout 3d server app1 172.168.16.54:3999 check listen stats_auth 172.168.16.10:10800 mode http option httplog stats enable stats refresh 20s stats uri /status stats auth admin:admin stats hide-version 设置开机自启动: # vi /etc/rc.local 添加以下内容: /usr/local/haproxy/sbin/haproxy -D -f /usr/local/haproxy/conf/haproxy.cfg 配置平台日志支持: # vi /etc/syslog.conf 添加: local3.*/var/log/haproxy.log local0.*/var/log/haproxy.log
# vi /etc/sysconfig/syslog 修改: SYSLOGD_OPTIONS="-r -m 0" 重启一下: # /etc/init.d/syslog restart 配置路由转发: # vi /etc/sysctl.conf net.ipv4.conf.default.rp_filter=1 添加以下内容到/etc/rc.local iptables -t mangle -N DIVERT iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT iptables -t mangle -A DIVERT -j MARK --set-mark 111 iptables -t mangle -A DIVERT -j ACCEPT ip rule add fwmark 111 lookup 100 ip route add local 0.0.0.0/0 dev lo table 100
Tips: 需要注意的一点,后端服务器的网关必须指向ha。。。 切记切记。。。 (责任编辑:IT) |