加载中…
个人资料
polygun2000
polygun2000
  • 博客等级:
  • 博客积分:0
  • 博客访问:363,278
  • 关注人气:48
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
正文 字体大小:

TPROXY使用介绍

(2012-03-22 15:44:27)
标签:

tproxy

haproxy

透明

代理

真实ip

分类: Web应用

1TPROXY是什么

 

    你可能听说过TPROXY,它通常配合负载均衡软件HAPrxoy或者缓存软件Squid使用。

    在所有"Proxy"类型的应用中都一个共同的问题,就是后端的目标服务器上看到的连接的Source IP都不再是用户原始的IP,而是前端的"Proxy"服务器的IP

    HAProxy举例来说,假设你有3台后端Web服务器提供服务,前端使用HAProxy作为负载均衡设备。所有用户的HTTP访问会先到达HAProxyHAProxy作为代理,将这些请求按照指定的负载均衡规则分发到后边的3Web服务器上。这个操作本身没有任何问题,因为HAProxy就应该是这么工作的。但是对于某些对于用户的访问IP有限制的敏感应用,问题来了: 后端服务器上的ACL无法限制哪些IP可以访问,因为在它看来,所有连接的SOURCE IP都是HAProxyIP

    这就是为什么TPROXY产生的原因,最早TPROXY是作为Linux内核的一个patch,从2.6.28以后TPRXOY已经进入官方内核。TPRXOY允许你"模仿"用户的访问IP,就像负载均衡设备不存在一样,HTTP请求到达后端的Web服务器时,在后端服务器上用netstat查看连接的时候,看到连接的SOURCE IP就是用户的真实IP而不是haproxy的IP。TPROXY名字中的T表示的就是transparent(透明)

 

    TPROXY主要功能如下:

 

1.重定向一部分经过路由选择的流量到本地路由进程(类似NAT中的REDIRECT)

2.使用非本地IP作为SOURCE IP初始化连接

3.无需iptables参与,在非本地IP上起监听

 

如果想要了解TPROXY的具体工作原理,请参考作者本人写的PPT,介绍的比较详细了:

http://people.netfilter.org/hidden/nfws/nfws-2008-tproxy_slides.pdf

 

2、如何编译TPROXY

 

2.6.28以后的内核中,TPROXY已经是官方内核的一部分了。可以查看当前内核是否支持TPROXY


# grep "TPROXY" config-`uname -r`
CONFIG_NETFILTER_TPROXY=m
CONFIG_NETFILTER_XT_TARGET_TPROXY=m


如果没有支持,则需要自己重新编译内核,但不需要再对内核打patch,只需要在编译内核时选择TPROXY即可。

 

Networking support (NET [=y])          

-> Networking options

-> Network packet filtering framework (Netfilter) (NETFILTER [=y])

-> Core Netfilter Configuration  

-> <M>Transparent proxying support (EXPERIMENTAL)

   <M>"TPROXY" target support (EXPERIMENTAL) (NEW)

   <M>"socket" match support (EXPERIMENTAL) (NEW)

 

然后在编译HAProxy时,选择TPROXY支持即可。

 

make TARGET=linux26 USE_LINUX_TPROXY=1

make install target=linux26


3、如何使用TPROXY(配合haproxy)

 

首选,需要在HAProxyGROUP配置中加入如下一行;

 

source 0.0.0.0 usrsrc clientip

 

这行配置告诉HAProxy使用用户的真实IP作为SOURCE IP访问这个GROUP

整个的配置看起来会像下边这样:

 

listen        VIP_Name 192.168.2.87:80

        mode        http

        option        forwardfor

        source 0.0.0.0 usesrc clientip

        cookie        SERVERID insert nocache indirect

        server server1 10.0.0.60:80 weight 1 cookie server1 check

        server server2 10.0.0.61:80 weight 1 cookie server2 check

        server        backup 127.0.0.1:80 backup

        option redispatch

 

接下来,使用netfilter mangle表中一个名为"socket"的match识别出发往本地socket的数据包(通过做一次socket检查)。

然后我们需要配置iptables规则,给那些发往本地socket的数据包打上mark。

然后新增一条路由规则,告诉内核将这些带有mark的数据包直接发送到本地回环地址进行路由处理。

 

#!/bin/sh

/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

 

4、部署TPROXY需要注意的点

 

    在部署TPROXY时,最常见的错误是遗忘将返回流量通过HAProxy

    因为我们"伪装了"通过HAProxy的数据包的SOURCE IP,后端Web服务器看到的就是用户的IP,那么Web服务器使用自己的IP返回响应数据包,使用用户真实IP作为DESTINATION IP。当返回的数据包到达用户端的时候,用户看到返回的包的源IP不是自己请求的HAProxyIP,则会认为这个包不是合法的回应而丢弃这个数据包。

 

    要解决这个问题,有两个办法:

    第一个办法是将HAProxy配置成网桥模式。

    第二个办法是将HAProxy和后端Web服务器放到同一子网中,后端服务器将自己的默认网关指向HAProxyHAProxy同时需要承担NAT功能。

    在后端服务器上: ip route add default via haproxy's_lan_ip

    在haproxy上: /sbin/iptables -t nat -A POSTROUTING -s backend's_ip -o eht0 -j MASQUERADE

 

5、haproxy上需要配合修改的一些内核参数

 

# 允许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/eth0/rp_filter

 

# 允许ICMP重定向

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

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

 

将上边的配置持久化,写入/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

 

参考文档:

http://kb.snapt-ui.com/wp-content/uploads/2012/03/Snapt-HAProxy-TPROXY.pdf

http://blog.loadbalancer.org/configure-haproxy-with-tproxy-kernel-for-full-transparent-proxy/

http://blog.csdn.net/dog250/article/details/7518054

http://blog.csdn.net/dog250/article/details/7988977

http://h10025.www1.hp.com/ewfrf/wc/document?cc=us&lc=en&dlc=en&tmp_geoLoc=true&docname=c03561757

http://www.linuxidc.com/Linux/2012-09/69766.htm

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有