使用Haproxy,Keepalived,Tproxy实现高可用透明反向代理

声明
本文为Gleasy原创文章,转载请指明引自Gleasy团队博客

一。需求场景

具体需求如下:
4台Server,2台为Proxy Server,2台为Web Server,均为双网卡;
1个公网IP(183.129.228.91);
要求如下:
1. 2台Proxy Server反向代理2台WEB Server,作负载均衡
2. 2台Proxy Server为主备模式,公网IP在两台Server之间自动切换
3. Proxy Server作透明代理(web server日志中要记录真实的访问IP)

二。配置步骤
1. 安装软件(proxy server)
Gleasy有自己的Yum库,全部软件已经打成RPM包供安装;
其中haproxy打包时使用了下面的参数:

make TARGET=linux26 CPU=x86_64 USE_STATIC_PCRE=1 USE_LINUX_TPROXY=1
make install target=linux26

安装:

yum install keepalived
yum install haproxy

 

2. 配置keepalived(proxy server)
配置主:

vrrp_instance VI_3{
 interface eth1 #这里的eth1是内网(192.168.1.X网段)的网卡!!!
 state MASTER 
 priority 100 #从为99
 virtual_router_id 101#路由ID,可通过#tcpdump vrrp查看。
 garp_master_delay 1 #主从切换时间,单位为秒。

 advert_int 1 #检查间隔,默认1秒
 authentication {
 auth_type PASS
 auth_pass KJj23576hYgu23IP
 }
 virtual_ipaddress {
 192.168.1.1/32 dev eth1
 183.129.228.91/27 brd 183.129.228.95 dev eth0
 }
 virtual_routes {
 via 183.129.228.65 dev eth0
 }
}

 

配置备:

vrrp_instance VI_3{
 interface eth1 #这里的eth1是内网(192.168.1.X网段)的网卡!!!
 state BACKUP #
 priority 99 # 主为100
 virtual_router_id 101#路由ID,可通过#tcpdump vrrp查看。
 garp_master_delay 1 #主从切换时间,单位为秒。

 advert_int 1 #检查间隔,默认1秒
 authentication {
 auth_type PASS
 auth_pass KJj23576hYgu23IP
 }
 virtual_ipaddress {
 192.168.1.1/32 dev eth1
 183.129.228.91/27 brd 183.129.228.95 dev eth0
 }
 virtual_routes {
 via 183.129.228.65 dev eth0
 } 
}

 

3. 配置tproxy(proxy server)

#!/bin/sh
/sbin/iptables -I FORWARD -i eth -j ACCEPT 
/sbin/iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
/sbin/iptables -t mangle -N DIVERT
/sbin/iptables -t mangle -A PREROUTING -p tcp -m socket -j casino online  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

echo 1 > /proc/sys/net/ipv4/conf/all/forwarding 
echo 1 > /proc/sys/net/ipv4/conf/all/send_redirects 
echo 1 > /proc/sys/net/ipv4/conf/eth0/send_redirects

 

4. 配置haproxy(proxy server)

global
 log 127.0.0.1 local3 err
 chroot /usr/local/haproxy
 maxconn 13000
 daemon
 nbproc 4 #设置并发进程
 pidfile /usr/local/haproxy/logs/haproxy.pid

defaults
 log global
 option dontlognull # 不记录空连接
 option redispatch
 timeout connect 50000
 timeout client 120000
 timeout server 120000
 maxconn 10000
 balance roundrobin # 设置服务器分配算法
 retries 5 # 重连次数 
 errorfile 400 /usr/local/haproxy/html/400.http
 errorfile 403 /usr/local/haproxy/html/403.http
 errorfile 408 /usr/local/haproxy/html/408.http
 errorfile 500 /usr/local/haproxy/html/500.http
 errorfile 502 /usr/local/haproxy/html/502.http
 errorfile 503 /usr/local/haproxy/html/503.http
 errorfile 504 /usr/local/haproxy/html/504.http


frontend proxy-80
 bind *:80
 mode http
 option httplog
 option dontlognull
 option forwardfor # This sets X-Forwarded-For
 option http_proxy
 maxconn 13000
 timeout client 50s
 timeout http-keep-alive 1s
 timeout http-request 10s
 default_backend proxy-80
 

#backend配置 
backend proxy-80
 mode http
 timeout server 120s
 timeout connect 50s
 option nolinger
 option http_proxy
 option forwardfor # This sets X-Forwarded-For
 option httplog
 option http-server-close
 cookie JSESSIONID prefix
 stats enable
 balance roundrobin
 source 0.0.0.0 usesrc clientip #透明代理!!!!!
 option httpchk GET /check.html
 server S 192.168.1.27:80 weight 3 cookie JSESS1 check inter 1500 rise 3 fall 3 
 server S 192.168.1.28:80 weight 3 cookie JSESS2 check inter 1500 rise 3 fall 3 

 

5. 配置Web server网关(web server)

ip route default via 192.168.1.1 dev eth0

特别说明一下,这里的192.168.1.1是一个VIP(虚拟IP,它的配置在上面keepalived配置中可以找到)。它会在两台proxy server间自动切换。

6. 注意事项:
HAPROXY所在的服务器网关必须配置为外网(ip route default必须为外网网关);
web服务器网关必须配置为HAPROXY所在服务器的IP地址;

此条目发表在 运维 分类目录。将固定链接加入收藏夹。

发表评论