注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

itoedr的it学苑

记录从IT文盲学到专家的历程

 
 
 

日志

 
 

Tproxy基本原理分析理解  

2017-01-09 09:45:14|  分类: squid系统应用 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

tproxy优势:其的优势在于不对数据包(包头信息)进行任何改变(NAT),就可以重定向数据包。


         tproxy是iptables的一附加控件,在一个控件中同时实现了elnetProxy,SocksProxy,HTTPProxy几种透明代理功能。在mangle表的PREROUTING链中使用,不修改数据包包头,直接把数据传递给一个本地socket(即不对数据包进行任何nat操作,这是最关键的地方)。

  在tproxy工作过程中,首先,这是tproxy向netfilter注册的一个target,该target能够在不对数据包修改的情况下,将数据包代理到本地套接字上;
  他的关键点在于通过获得数据包的目的端口和目的地址(而非本地监听套接字的bind地址),再通过nf_tproxy_get_sock_v4函数,获得监听套接字,最后把skb->sock = sk;
      #更多内容参考如下代码分析。

  tproxy优势:其的优势在于不对数据包(包头信息)进行任何改变(NAT),就可以重定向数据包。

***********************
使用例子:
/*
   iptables -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 50080
      参数说明:
    laddr 为代理服务器的本地监听套接字的本地ip,此例中省略,即取本地ip;
    lport 为代理服务器的本地监听套接字的本地port,50080(也可以是别的端口,是另一个服务进程监听的端口,是本控件的数据出口);
    mark_value 为mark值,依据此标记值使用ip rule命令工具为标记数据流进行路由选择;
*/


控件进一步理解:
***********************
“代理”这个术语的意思是什么?

What does the term 'proxy' mean?
--------------------------------

   A proxy is a server-like program, receiving requests from clients,
   forwarding those requests to the real server on behalf of users,
   and returning the response as it arrives.
  代理就象一个服务器程序,从客户端取得其请求,并代表用户将这些请求向前转发去用户请求的真实服务器,
然后还要代表服务器向用户端返回真实服务器就此请求给于客户端的回应数据(结果就像自己就是那个真实的服务器);

   Proxies read and parse the application protocol, and reject invalid traffic. As most attacks violate the application protocol, disallowing
   protocol violations usually protects against attacks.
  代理服务器读取并分析应用协议,并剔除那些不合格的报文。

What is transparent proxying?
什么是透明代理呢?
-----------------------------

   To simplify management tasks of clients sitting behind proxy firewalls, the technique 'transparent proxying' was invented.
   Transparent proxying means that the presence of the proxy is invisible to the user. Transparent proxying however requires kernel support.
  透明代理服务用于简单化地去管理隐蔽代理防火墙后客户端用户任务,这就是透明代理技术产生的原由。
透明代理意味代理环节对于客户端不可见。当然TPROX透明代理功能需要系统核心的支持。

We have a 'REDIRECT' target, isn't that enough?
我们有了iptables的“redirect”target工具,已经足够了吗?
----------------------------------------------

   Real transparent proxying requires the following three features from the IP stack of the computer\
 it is running on:
  实际的透明代理需具有以下三方面的功能特点:

    1. Redirect sessions destined to the outer network to a local process using a packet filter rule.
    需要运用ip数据包过滤器(规则)将去住外部网络的ip会话报文重定向到本地进程(由本地诸如haproxy这样的相关进程再处理)。
    2. Make it possible for a process to listen to connections on a
       foreign address.
    尽可以地让一个进程去监听联系着外部IP地址的联接。
    3. Make it possible for a process to initiate a connection with a
       foreign address as a source.
    尽量让一个进程去发起如同拥有一个象客户端外部原ip地址的关联。
    注:就是实现ip欺骗,使用代理过程对两次数据包的传输过程,如同没有代理环节的存在(数据包入出对比)。

   Item #1 is usually provided by packet filtering packages like Netfilter/IPTables, IPFilter.
         (yes, this is the REDIRECT target)
    项目#1通常是由类似的Netfilter/IPTables、IPFilter的包过滤包提供。
         (的确,tproxy就是iptables的一个REDIRECT target)

************************************
Tproxy原理分析之2
************************************
    TPROXY,它通常配合负载均衡软件HAPrxoy或者缓存软件Squid或是ATS使用。

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

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

    这就是为什么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上起监听





1.透明代理
    所谓的透明代理是针对客户端和服务器端两方面来讲的,对于客户端来讲,发起连接时连接的服务端是真实的服务器而不是代理服务器,对于服务器端来讲,收到的请求来自真实客户端而不是代理服务器。当然这其中有偷梁换柱的过程,一切仅仅是看起来很透明而已。
2.TPROXY
    TPROXY是Linux系统上实现透明代理的首选,它利用了Linux网络的利器-Netfilter实现了一些target,比如TPROXY,另外还有一个socket match用于捕获服务器返回的数据包,确保它们能够再回到代理服务器应用程序。
    值得注意的是,配置TPROXY一定要确保文件打开描述符的数量足够大,因为代理服务要创建大量的socket,每一个socket对应一个文件描述符。
2.1.IP_TRANSPARENT选项
    IP_TRANSPARENT可以实现很神奇的事情,即,它可以bind一个不属于本机的IP地址,作为客户端,它可以使用一个不属于本机地址的IP地址作为源IP发起连接,作为服务端,它可以侦听在一个不属于本机的IP地址上,而这正是透明代理所必须的。面对真实的客户端,透明代理明知道目标地址不是自己,却还是要接受连接,对于真实的服务器,透明代理明显不是真实的客户端,却还要使用真实客户端的地址发起连接。
2.2.截获数据
    捕获数据就是把本来不该发给这台设备的数据捕获到这台设备的应用层。方法太多了,用ebtables,iptables,策略路由,不管是二层模式还是路由模式,捕获数据都不是问题,具体到细节,还得需要应用层参与,因为数据到达第四层的时候,会去查socket,也就是说必须得有一个socket和数据包关联起来,而一个socket又和一个应用程序关联,最终,一个数据包被捕获后,发给一个应用程序!
2.2.1.NAT方式
    应用层启用一个服务,侦听一个端口,使用iptables的DNAT或者REDIRECT这些target可以将数据包定向到本机应用程序。此时如果你使用netstat查看,看到的目标地址将是本机socket侦听的地址。
2.2.2.纯TPROXY方式
    即使不用NAT,也可以通过TPROXY target和策略路由的方式将数据包捕获,首先需要定义一条iptables规则:
-A PREROUTING -p tcp -m tcp --dport 80 -j TPROXY --on-port 0 --on-ip 0.0.0.0 --tproxy-mark 100
定义一条rule以及路由:
ip rule add fwmark 100 tab proxy
ip route add local 0.0.0.0/0 dev lo tab proxy
     如此一来,不管你发给哪个IP地址的到达80端口的TCP连接,均将被捕获,比如代理服务器的地址是192.168.100.100,而你发包的目标地址是1.2.3.4,只要数据包到达这台机器,均会被捕获到应用层。

纯TPROXY方式并没有任何的本机IP地址参与.
  评论这张
 
阅读(64)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017