Tproxy //tproxy实现透明代理
声明
本文为Gleasy原创文章,转载请指明引自Gleasy团队博客
一。需求场景
![](http://rdc.gleasy.com/wp-content/uploads/2013/09/Haproxy+keepalived+tproxy.png)
具体需求如下:
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打包时使用了下面的参数:
1 | make TARGET=linux26 CPU=x86_64 USE_STATIC_PCRE=1 USE_LINUX_TPROXY=1 |
2 | make install target=linux26 |
安装:
2. 配置keepalived(proxy server)
配置主:
02 | interface eth1 #这里的eth1是内网(192.168.1.X网段)的网卡!!! |
05 | virtual_router_id 101#路由ID,可通过#tcpdump vrrp查看。 |
06 | garp_master_delay 1 #主从切换时间,单位为秒。 |
08 | advert_int 1 #检查间隔,默认1秒 |
11 | auth_pass KJj23576hYgu23IP |
14 | 192.168.1.1/32 dev eth1 |
15 | 183.129.228.91/27 brd 183.129.228.95 dev eth0 |
18 | via 183.129.228.65 dev eth0 |
配置备:
02 | interface eth1 #这里的eth1是内网(192.168.1.X网段)的网卡!!! |
05 | virtual_router_id 101#路由ID,可通过#tcpdump vrrp查看。 |
06 | garp_master_delay 1 #主从切换时间,单位为秒。 |
08 | advert_int 1 #检查间隔,默认1秒 |
11 | auth_pass KJj23576hYgu23IP |
14 | 192.168.1.1/32 dev eth1 |
15 | 183.129.228.91/27 brd 183.129.228.95 dev eth0 |
18 | via 183.129.228.65 dev eth0 |
3. 配置tproxy(proxy server)
02 | /sbin/iptables -I FORWARD -i eth+ -j ACCEPT |
03 | /sbin/iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE |
04 | /sbin/iptables -t mangle -N DIVERT |
05 | /sbin/iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT |
06 | /sbin/iptables -t mangle -A DIVERT -j MARK --set-mark 1 |
07 | /sbin/iptables -t mangle -A DIVERT -j ACCEPT |
09 | /sbin/ip rule add fwmark 1 lookup 100 |
10 | /sbin/ip route add local 0.0.0.0/0 dev lo table 100 |
12 | echo 1 > /proc/sys/net/ipv4/conf/all/forwarding |
13 | echo 1 > /proc/sys/net/ipv4/conf/all/send_redirects |
14 | echo 1 > /proc/sys/net/ipv4/conf/eth0/send_redirects |
4. 配置haproxy(proxy server)
02 | log 127.0.0.1 local3 err |
03 | chroot /usr/local/haproxy |
07 | pidfile /usr/local/haproxy/logs/haproxy.pid |
11 | option dontlognull # 不记录空连接 |
17 | balance roundrobin # 设置服务器分配算法 |
19 | errorfile 400 /usr/local/haproxy/html/400.http |
20 | errorfile 403 /usr/local/haproxy/html/403.http |
21 | errorfile 408 /usr/local/haproxy/html/408.http |
22 | errorfile 500 /usr/local/haproxy/html/500.http |
23 | errorfile 502 /usr/local/haproxy/html/502.http |
24 | errorfile 503 /usr/local/haproxy/html/503.http |
25 | errorfile 504 /usr/local/haproxy/html/504.http |
33 | option forwardfor # This sets X-Forwarded-For |
37 | timeout http-keep-alive 1s |
38 | timeout http-request 10s |
39 | default_backend proxy-80 |
49 | option forwardfor # This sets X-Forwarded-For |
51 | option http-server-close |
52 | cookie JSESSIONID prefix |
55 | source 0.0.0.0 usesrc clientip #透明代理!!!!! |
56 | option httpchk GET /check.html |
57 | server S 192.168.1.27:80 weight 3 cookie JSESS1 check inter 1500 rise 3 fall 3 |
58 | server S 192.168.1.28:80 weight 3 cookie JSESS2 check inter 1500 rise 3 fall 3 |
5. 配置Web server网关(web server)
1 | 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地址;