Linux网桥设备上实现TCP透明代理的方法及系统与流程

文档序号:17248241发布日期:2019-03-30 08:56阅读:645来源:国知局
本发明涉及网络通信
技术领域
:,特别涉及一种tcp透明代理的方法及系统。
背景技术
::现有的双向tcp透明代理加速的原理是:如图1所示,在通过tcp协议通讯的主机a和主机b之间,在靠近主机a的位置放入tcpproxy服务器c,在靠近主机b的位置放入tcpproxy服务器d,使高延时、高丢包率的链路位于tcpproxy服务器c和tcpproxy服务器d之间,当主机a向主机b发起tcp连接时,并且在主机a和主机b无感知的情况下,将tcp流量截获至tcpproxy服务器c,并且由tcpproxy服务器c重新发起tcp连接,传输a、b之间的数据,并针对链路的拥塞情况优化拥塞控制策略。就实现层面来说,业界普遍采用iptables+tcp代理程序实现,在tcpproxy服务器c上通过iptables的dnat(目标地址转换)功能,将主机a向主机b发起的tcp连接重定向至tcpproxy服务器c上的tcp代理程序,tcp代理程序伪装成主机b,接受主机a的连接请求,并再,伪装成主机a向b发起新的tcp连接。新的tcp的连接经过tcpproxy服务器d上时,被采用上述相同的方式重定向至tcpproxy服务器d上的tcp代理程序,最终由d与主机b建立连接,整个过程,主机a和主机b均感知不到tcpproxy服务器c和tcpproxy服务器d的存在。采用这种办法,将主机a至主机b的tcp连接分为三段,tcpproxy服务器c和tcpproxy服务器d便可以针对夹在它们之间的拥塞链路进行更优和更精确的tcp拥塞控制从而实现tcp连接的加速。采用传统的的tcp透明连接代理的方法,需要具备的基本前提为,tcpproxy服务器c必须与主机a在网络层可达以正常的与主机a建立tcp连接,tcpproxy服务器d必须与主机b在网络层可达以正常的与主机b建立tcp连接,这样才能代理并转发主机a和主机b之间的tcp流量。当tcpproxy服务器c和tcpproxy服务器d为路由器或者nat(网络地址转换)网关等工作于网络层的设备时,可以采用传统的方法实现;但当tcpproxy服务器c和tcpproxy服务器d仅为链路层linux网桥设备且在网络层分别与主机a和主机b不可达时,例如tcpproxy服务器c和tcpproxy服务器d的ip地址与主机a和主机b的ip地址位于不同网段,传统的方法就无法实现tcp透明代理加速的功能。在实际的以太网网络环境中,linux网桥设备通常被配置到单独的vlan(虚拟局域网)中进行管理,其ip地址与依赖于该网桥进行tcp通讯的主机之间,通常都不在同一网段,网桥与这些主机之间可以理解为链路层可达,但网络层不可达;同时,经过网桥转发多个vlan的以太网数据帧时,每个vlan都对应不同的ip网段,当vlan数量众多时,也很难通过配置网桥ip地址来保证对每个vlan的主机网络层可达;就算通过配置能让linux网桥设备在每个vlan中拥有对应的ip地址,也无法解决当需要代理的tcp连接的目的地址,需要通过某个vlan的默认网关转发的情况,因为每个vlan都有不同的默认网关,但是linux网桥设备只能配置一个默认网关,该网关不一定对目的地址可达。公开号为cn102447708b的中国专利公开了一种应用层透明代理技术的通信实现方法,该方法直接通过网络协议栈二层转发的方式实现代理,该方法仅采用服务器的ip地址作为源地址与客户端建立tcp连接,在客户端与代理服务主机之间,路由不可达时,无法实现“回应包通过数据链路层转发,通向客户端”,因数据包会在做路由选择的时候被丢弃。也就是说该方法无法解决代理服务器为网桥设备,该网桥设备与a和b主机在网络层不可达时(不如ip不同段)的tcp代理问题。技术实现要素:本发明所要解决的技术问题是:克服代理服务器仅为链路层linux网桥设备且在网络层分别与主机a和主机b不可达时无法实现tcp透明代理功能的问题,提出一种linux网桥设备上实现tcp透明代理的方法及系统。本发明解决上述技术问题,采用的技术方案是:linux网桥设备上实现tcp透明代理的方法,包括主机a与主机b建立tcp连接以及该tcp连接建立完毕后主机a与主机b之间的tcp数据报文处理,所述主机a与主机b建立tcp连接包括如下步骤:s1、主机a向主机b发出tcp的syn报文请求建立tcp连接,记该syn报文为syn报文一;s2、linux网桥设备截获所述syn报文一,记录syn报文一的信息,把tcp连接重定向给linux网桥设备内的tcp代理进程模块,tcp代理进程模块伪装主机b发送对应的synack报文给主机a,主机a回复相应的ack报文,如此linux网桥设备完成与主机a的tcp连接的建立,记该tcp连接对应的socket为socket1;s3、tcp代理进程模块向主机b发送tcp的syn报文请求建立tcp连接,记该syn报文为syn报文二,记该tcp连接对应的socket为socket2,并设置经socket2发出的报文均打上标记,记为markx;s4、通过配置的策略路由使得带有markx的syn报文二绕过linux网桥设备内部的路由选择,进行源地址转换,将syn报文二中的源ip地址和源端口转换为syn报文一中的源ip地址和源端口;通过配置的静态arp使得syn报文二绕过linux网桥设备内部的arp查询过程,将syn报文二送至linux网桥设备内的网桥模块;s5、截获syn报文二,进行目的地址转换,将syn报文二的目的mac地址和源mac地址转换为syn报文一中的目的mac地址和源mac地址;将syn报文二填上以太网头部发送给syn报文一的链路层目的主机;s6、主机b收到syn报文二后回复对应的synack报文,该synack报文被重定向至tcp代理进程模块,tcp代理进程模块回复对应的ack报文,如此linux网桥设备伪装成主机a完成与主机b的tcp连接的建立。优选的,所述主机a与主机b之间的tcp数据报文处理包括主机a到主机b的tcp数据报文处理,所述主机a到主机b的tcp数据报文处理包括如下步骤:t1、主机a向主机b发送tcp数据报文,记为tcp数据报文一;t2、linux网桥设备截获所述tcp数据报文一,重定向tcp数据报文一至tcp代理进程模块,tcp代理进程模块通过socket1读取tcp数据报文一所携带的数据,将读取到的数据经socket2发出,记从socket2发出的tcp数据报文为tcp数据报文二;t3、通过配置的策略路由使得tcp数据报文二绕过linux网桥设备内部的路由选择,将tcp数据报文二中的源ip地址和源端口转换为tcp数据报文一中的源ip地址和源端口;通过配置的静态arp使得tcp数据报文二绕过linux网桥设备内部的arp查询过程,将tcp数据报文二送至linux网桥设备内的网桥模块;t4、截获tcp数据报文二,将tcp数据报文二的目的mac地址和源mac地址转换为tcp数据报文一中的目的mac地址和源mac地址;将tcp数据报文二填上以太网头部发送给tcp数据报文一的链路层目的主机。优选的,所述主机a与主机b之间的tcp数据报文处理包括主机b到主机a的tcp数据报文处理,所述主机b到主机a的tcp数据报文处理包括如下步骤:u1、主机b向主机a发送tcp数据报文,记为tcp数据报文三;u2、linux网桥设备截获所述tcp数据报文三,重定向tcp数据报文三至tcp代理进程模块,tcp代理进程模块通过socket2读取tcp数据报文三所携带的数据,将该tcp数据报文三中携带的数据经socket1发出并打上标记,记该标记为marky,记从socket1发出的tcp数据报文为tcp数据报文四;u3、通过配置的策略路由使得tcp数据报文四绕过linux网桥设备内部的路由选择,将tcp数据报文四中的源ip地址和源端口转换为tcp数据报文三中的源ip地址和源端口;通过配置的静态arp使得tcp数据报文四绕过linux网桥设备内部的arp查询过程,将tcp数据报文四送至linux网桥设备内的网桥模块;u4、截获tcp数据报文四,将tcp数据报文四的目的mac地址和源mac地址转换为tcp数据报文三中的目的mac地址和源mac地址;将tcp数据报文四填上以太网头部发送给tcp数据报文一的链路层目的主机。优选的,所述步骤s2中linux网桥设备截获所述syn报文一的步骤包括:采用linux网桥设备中的netfilter模块在prerouting点增加hook来截获所述syn报文一;当所述步骤t2存在时,步骤t2中linux网桥设备截获所述tcp数据报文一的步骤包括:采用linux网桥设备中的netfilter模块在prerouting点增加的hook来截获所述tcp数据报文一;当所述步骤u2存在时,步骤u2中linux网桥设备截获所述tcp数据报文三的步骤包括:采用linux网桥设备中的netfilter模块在prerouting点增加的hook点来截获所述tcp数据报文三。优选的,所述步骤s2中记录syn报文一的信息包括至少记录syn报文一的源ip地址、目的ip地址、源端口、目的端口、源mac地址和目的mac地址。优选的,所述步骤s2中把tcp连接重定向给linux网桥设备内的tcp代理进程模块的步骤包括:进行目标地址转换将syn报文一中的目的ip地址和目的端口转换为linux网桥设备的本地ip地址和tcp代理进程模块监听的端口;当所述步骤t2存在时,步骤t2中重定向tcp数据报文一至tcp代理进程模块的步骤包括:进行目标地址转换将tcp数据报文一中的目的ip地址和目的端口转换为linux网桥设备的本地ip地址和tcp代理进程模块监听的端口;当所述步骤u2存在时,步骤u2中重定向tcp数据报文三至tcp代理进程模块的步骤包括:进行目标地址转换将tcp数据报文三中的目的ip地址和目的端口转换为linux网桥设备的本地ip地址和tcp代理进程模块监听的端口。优选的,所述步骤s3中tcp代理进程模块伪装成主机a向主机b发送tcp的syn报文请求建立tcp连接的步骤包括:tcp代理进程模块获取syn报文一的目的ip地址和目的端口,根据该目的ip地址和目的端口创建socket2。优选的,所述配置的策略路由为将带有标记markx或mraky的报文均通过设定的与网桥模块同网段的网关转发;所述配置的静态arp为将带有markx或mraky的报文中的目的mac地址设置为所述网关的目的mac地址。优选的,所述步骤s5中截获syn报文二采用的方法为:采用linux网桥设备中的netfilter模块在mac地址查表之前增加hook来截获syn报文二,记该hook点为br_entry;当所述步骤t4存在时,采用linux网桥设备中的netfilter模块在mac地址查表之前增加hook来截获tcp数据报文二;当所述步骤u4存在时,采用linux网桥设备中的netfilter模块在mac地址查表之前增加hook来截获tcp数据报文四。为了解决上述技术问题,本发明还提供了linux网桥设备上实现tcp透明代理的系统,包括linux网桥设备,所述linux网桥设备包括网桥模块、tcp代理内核模块、路由选择模块、地址转换模块、socket通信模块和tcp代理进程模块;网桥模块用于数据链路层的通信;tcp代理内核模块用于截获报文,记录报文信息,根据需要修改报文的目的mac地址和源mac地址,tcp代理内核模块包括netfilter模块;路由选择模块用于执行正常的路由转发功能;地址转换模块用于实现源地址转换和目的地址转换功能;socket通信模块用于建立tcp代理进程模块与主机a的套接字及tcp代理进行模块与和主机b的套接字;tcp代理进程模块用于伪装成目的主机与源主机建立tcp连接,并伪装成源主机与目的主机建立新的tcp连接,主机a和主机b互为源主机和目的主机;地址解析模块用于arp查询。本发明的有益效果是:当主机a与主机b不在同一个网络段,通过截获主机a的原始报文后绕过路由选择以及arp查询发送给网桥模块,并且修改发出去的数据包的源端口和源ip地址为原始报文中的源端口和源ip地址,在网桥通过目的mac地址选择发送端口之前,将数据包的以太网头部的目的mac地址和源mac地址改为原始报文目的mac地址和源mac地址后发送给原始报文的链路层目的主机。如此即可实现代理服务器仅为链路层网桥设备且在网络层分别与主机a和主机b不可达时主机a与主机b的tcp透明代理功能。附图说明图1为本发明
背景技术
:中的拓扑结构图;图2为本发明实施例的拓扑结构图。具体实施方式为了使本发明的目的、技术方案及优点更加清楚明白,以下对本发明进行进一步详细说明。如图2所示,以主机a与linux网桥设备链路层可达且主机b与linux网桥设备链路层也可达的情况进行举例说明本发明的思想,linux网桥设备上实现tcp透明代理的系统包括linux网桥设备,该linux网桥设备包括网桥模块、tcp代理内核模块、路由选择模块、地址转换模块、socket通信模块和tcp代理进程模块。网桥模块用于数据链路层的通信;tcp代理内核模块用于截获报文,记录报文信息,根据需要修改报文的目的mac地址和源mac地址,tcp代理内核模块包括netfilter模块;路由选择模块用于执行正常的路由转发功能。地址转换模块用于实现源地址转换和目的地址转换功能;socket通信模块包括socket1和socket2,socket1为发起主机a与伪装成主机b的tcp代理程序通信使用的socket;socket2为tcp代理程序伪装成主机a后发起的新的tcp连接对应的socket。tcp代理进程模块工作在用户态的进程,其作用是伪装成目的主机与源主机建立tcp连接,并伪装成源主机与目的主机建立新的tcp连接,主机a和主机b根据通信方向的不同互为源主机和目的主机。地址解析模块用于arp查询。其中,netfilter模块是linux2.4.x引入的一个子系统,它作为一个通用的抽象的框架,提供一整套的hook(钩子函数)的管理机制,netfilter模块架构就是在整个网络流程的若干位置放置了一些检测点(hook点),而在每个检测点可以注册一个钩子函数(hook),让数据包经过hook点时可以进入钩子函数进行内部处理。下面的prerouting和br_entry均为netfiler模块的hook点。linux网桥设备上实现tcp透明代理的方法包括主机a与主机b建立tcp连接以及该tcp连接建立完毕后主机a与主机b之间的tcp数据报文处理,主机a与主机b建立tcp连接包括如下步骤:s1、主机a向主机b发出tcp的syn报文请求建立tcp连接,记该syn报文为syn报文一;s2、linux网桥设备截获syn报文一,记录syn报文一的信息,把tcp连接重定向给linux网桥设备内的tcp代理进程模块,tcp代理进程模块伪装主机b发送对应的synack报文给主机a,主机a回复相应的ack报文,如此linux网桥设备完成与主机a的tcp连接的建立,记该tcp连接对应的socket为socket1;其中,为了保证能准确的截取到syn报文一,上述linux网桥设备截获syn报文一的步骤包括:采用linux网桥设备中的netfilter模块在prerouting点增加hook来截获syn报文一;为了保证后续的源地址转换和目标地址转换的顺利进行,记录syn报文一的信息,该信息包括syn报文一的源ip地址、目的ip地址、源端口、目的端口、源mac地址和目的mac地址,,若存在虚拟局域网时,还需记录vlan(虚拟局域网)编号。把tcp连接重定向给linux网桥设备内的tcp代理进程模块的步骤可包括:通过地址转换模块进行目标地址转换将syn报文一中的目的ip地址和目的端口转换为linux网桥设备的本地ip地址和tcp代理进程模块监听的端口,如此把tcp连接重定向给linux网桥设备内的tcp代理进程模块。s3、tcp代理进程模块向主机b发送tcp的syn报文请求建立tcp连接,记该syn报文为syn报文二,记该tcp连接对应的socket为socket2,并设置经socket2发出的报文均打上标记,记为markx;其中,tcp代理进程模块获取syn报文一的目的ip地址和目的端口,根据该目的ip地址和目的端口创建socket2,此时syn报文二的源ip地址和源端口分别为tcp代理进程模块所在的linux网桥设备的ip地址和socket2所监听的端口,syn报文二的目的地址和目的端口与syn报文一中的一致,为了方便后续的策略路由和静态apr在获取到有相关标记的报文时能进行特殊的处理,则设置经socket2发出的报文均打上标记markx。s4、通过配置的策略路由使得带有markx的syn报文二绕过linux网桥设备内部的路由选择,进行源地址转换,将syn报文二中的源ip地址和源端口转换为syn报文一中的源ip地址和源端口;通过配置的静态arp使得syn报文二绕过linux网桥设备内部的arp查询过程,将syn报文二送至linux网桥设备内的网桥模块;其中,可通过配置的策略路由将带有标记markx或marky的报文均通过设定的与网桥模块同网段的网关转发,如此便欺骗路由选择模块让其认为目的主机三层数据可达,数据包或者报文在这里就不会被丢弃了;例如网桥模块的ip地址为1.1.1.2时,将网关的ip地址设置为1.1.1.1,将网关的mac地址设置为任何一个合法的单播mac地址例如a0:11:22:33:44:55,根据策略路由设置将带有标记markx的syn报文二通过1.1.1.1这个网关转发。地址转换模块中进行源地址转换,将syn报文二中的源ip地址和源端口转换为syn报文一中的源ip地址和源端口;通过配置的静态arp使得syn报文二绕过linux网桥设备内部的arp查询过程,将syn报文二送至linux网桥设备内的网桥模块,其中静态arp可为为将带有markx或mraky的报文中的目的mac地址设置为网关的目的mac地址即上述举例的a0:11:22:33:44:55;s5、截获syn报文二,进行目的地址转换,将syn报文二的目的mac地址和源mac地址转换为syn报文一中的目的mac地址和源mac地址;将syn报文二填上以太网头部发送给syn报文一的链路层目的主机;其中,tcp代理内核模块可通过br_entry点在在mac地址查表之前截获syn报文二,进行目的地址转换,将syn报文二的目的mac地址和源mac地址转换为syn报文一中的目的mac地址和源mac地址;鉴于主机b与linux网桥设备之间可能还有别的路由器,将syn报文二填上以太网头部发送给syn报文一的链路层目的主机;s6、主机b收到syn报文二后回复对应的synack报文,该synack报文被重定向至tcp代理进程模块,tcp代理进程模块回复对应的ack报文,如此linux网桥设备伪装成主机a完成与主机b的tcp连接的建立。至此,主机a到主机b之间的通讯连接建立完毕。主机a与主机b的tcp连接建立后便可进行正常的通信,主机a到主机b的tcp数据报文处理包括如下步骤:t1、主机a向主机b发送tcp数据报文,记为tcp数据报文一;t2、linux网桥设备截获所述tcp数据报文一,重定向tcp数据报文一至tcp代理进程模块,tcp代理进程模块通过socket1读取tcp数据报文一所携带的数据,将读取到的数据经socket2发出,记从socket2发出的tcp数据报文为tcp数据报文二;其中,tcp代理内核模块可通过prerouting点的hook截获tcp数据报文一,地址转换模块进行目标地址转换将tcp数据报文一中的目的ip地址和目的端口转换为linux网桥设备的本地ip地址和tcp代理进程模块监听的端口,重定向tcp数据报文一至tcp代理进程模块,tcp代理进程模块通过socket1读取tcp数据报文一所携带的数据,将读取到的数据经socket2发出,并对相应的tcp数据报文标记markx,记从socket2发出的tcp数据报文为tcp数据报文二。t3、通过配置的策略路由使得tcp数据报文二绕过linux网桥设备内部的路由选择,将tcp数据报文二中的源ip地址和源端口转换为tcp数据报文一中的源ip地址和源端口;通过配置的静态arp使得tcp数据报文二绕过linux网桥设备内部的arp查询过程,将tcp数据报文二送至linux网桥设备内的网桥模块;通过可通过配置的策略路由将带有标记markx或marky的报文均通过设定的与网桥模块同网段的网关转发,如此便欺骗路由选择模块让其认为目的主机三层数据可达,数据包或者报文在这里就不会被丢弃了;上述策略路由使得tcp数据报文二绕过linux网桥设备内部的路由选择,将tcp数据报文二中的源ip地址和源端口转换为tcp数据报文一中的源ip地址和源端口;通过上述静态arp可使得tcp数据报文二绕过linux网桥设备内部的arp查询过程,将tcp数据报文二送至linux网桥设备内的网桥模块;t4、截获tcp数据报文二,将tcp数据报文二的目的mac地址和源mac地址转换为tcp数据报文一中的目的mac地址和源mac地址;将tcp数据报文二填上以太网头部发送给tcp数据报文一的链路层目的主机。其中,tcp代理内核模块可通过br_entry点在在mac地址查表之前截获tcp数据报文二,将tcp数据报文二的目的mac地址和源mac地址转换为tcp数据报文一中的目的mac地址和源mac地址;将tcp数据报文二填上以太网头部发送给tcp数据报文一的链路层目的主机。主机b到主机a的tcp数据报文处理包括如下步骤:u1、主机b向主机a发送tcp数据报文,记为tcp数据报文三;u2、linux网桥设备截获所述tcp数据报文三,重定向tcp数据报文三至tcp代理进程模块,tcp代理进程模块通过socket2读取tcp数据报文三所携带的数据,将该tcp数据报文三中携带的数据经socket1发出并打上标记,记该标记为marky,记从socket1发出的tcp数据报文为tcp数据报文四;其中,tcp代理内核模块可通过prerouting点的hook截获tcp数据报文三,地址转换模块进行目标地址转换将tcp数据报文三中的目的ip地址和目的端口转换为linux网桥设备的本地ip地址和tcp代理进程模块监听的端口,重定向tcp数据报文三至tcp代理进程模块,tcp代理进程模块通过socket2读取tcp数据报文三所携带的数据,将该tcp数据报文三中携带的数据经socket1发出,并对相应的tcp数据报文标记marky,记从socket1发出的tcp数据报文为tcp数据报文四;u3、通过配置的策略路由使得tcp数据报文四绕过linux网桥设备内部的路由选择,将tcp数据报文四中的源ip地址和源端口转换为tcp数据报文三中的源ip地址和源端口;通过配置的静态arp使得tcp数据报文四绕过linux网桥设备内部的arp查询过程,将tcp数据报文四送至linux网桥设备内的网桥模块;其中,通过上述策略路由使得tcp数据报文四绕过linux网桥设备内部的路由选择,将tcp数据报文四中的源ip地址和源端口转换为tcp数据报文三中的源ip地址和源端口;通过上述静态arp使得tcp数据报文四绕过linux网桥设备内部的arp查询过程,将tcp数据报文四送至linux网桥设备内的网桥模块;u4、截获tcp数据报文四,将tcp数据报文四的目的mac地址和源mac地址转换为tcp数据报文三中的目的mac地址和源mac地址;将tcp数据报文四填上以太网头部发送给tcp数据报文一的链路层目的主机。其中,tcp代理内核模块可通过br_entry点在在mac地址查表之前截获tcp数据报文四,将tcp数据报文四的目的mac地址和源mac地址转换为tcp数据报文三中的目的mac地址和源mac地址;将tcp数据报文四填上以太网头部发送给tcp数据报文一的链路层目的主机。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1