CN115914425A - 一种网桥透明代理方法、装置、存储介质及设备 - Google Patents
一种网桥透明代理方法、装置、存储介质及设备 Download PDFInfo
- Publication number
- CN115914425A CN115914425A CN202211650671.3A CN202211650671A CN115914425A CN 115914425 A CN115914425 A CN 115914425A CN 202211650671 A CN202211650671 A CN 202211650671A CN 115914425 A CN115914425 A CN 115914425A
- Authority
- CN
- China
- Prior art keywords
- syn
- message
- transparent proxy
- target
- mac address
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D30/00—Reducing energy consumption in communication networks
- Y02D30/50—Reducing energy consumption in communication networks in wire-line communication networks, e.g. low power modes or reduced link rate
Landscapes
- Data Exchanges In Wide-Area Networks (AREA)
Abstract
本申请实施例提供一种网桥透明代理方法、装置、存储介质及设备,该方法中,对透明代理设备的Linux网桥进行配置,将需要用于转发的两个业务口加入该Linux网桥中,在截获到客户端发送的SYN报文时,保存该SYN报文中包括MAC地址信息及SYN入接口索引在内的以太网帧头信息,之后利用指定钩子点将保存的以太帧头信息反转源MAC地址和目的MAC地址后添加到构造的SYN‑ACK报文,并将该目标SYN报文从SYN入接口发送出去,以建立与客户端的连接,而在与服务端建立连接时,将保存的以太帧头信息添加到构造的目标SYN报文中并从Linux网桥上除SYN入接口以外的另一个业务口发送出去。如此,实现了交换网络透明网桥模式下透明代理,无需更改网络拓扑,无需配置IP和路由,且易于实现。
Description
技术领域
本申请涉及网络通信技术领域,具体而言,涉及一种网桥透明代理方法、装置、存储介质及设备。
背景技术
在一些复杂的网络环境中,由于IP资源限制、交换网络管理等问题,针对新添加到网络环境中的网络设备不能为其配置业务IP,但是需要利用透明代理的方式对经过设备的报文进行检测或者转发。相关技术中针对此类场景的主要解决方案是利用DPDK(DataPlane Development Kit,数据平面开发套件)的交换模块将透明代理报文发送到Linux内核或从内核读取透明代理报文并外发,Linux内核协议栈处理完毕之后,将应用数据传递给用户层代理进程。然而,DPDK需要处理透明代理报文连接关联等问题,实现比较复杂。
发明内容
本申请实施例的目的在于提供一种网桥透明代理方法、装置、存储介质及设备,旨在解决相关技术中存在的针对网桥无IP地址配置,路由不可达情况下,透明代理的实现较为复杂的问题。
第一方面,本申请实施例提供的一种网桥透明代理方法,应用于透明代理设备,所述透明代理设备的Linux网桥上配置有两个业务口;所述方法包括:
截获客户端向服务端发送的TCP的SYN报文,保存所述SYN报文中的以太网帧头信息;所述以太网帧头信息包括MAC地址信息及SYN入接口索引;
构造SYN-ACK报文,利用指定钩子点将保存的以太帧头信息中的源MAC地址和目的MAC地址反转后,添加到所述SYN-ACK报文头部,并将所述SYN-ACK报文从所述SYN入接口索引对应的业务口发送出去,在再次接收到所述客户端的报文时,确定与所述客户端建立连接;
在与所述服务端建立连接时,构造目标SYN报文,利用所述指定钩子点将保存的以太帧头信息添加到所述目标SYN报文中,并将所述目标SYN报文从目标外出接口发送出去;所述目标外出接口是所述Linux网桥上除所述SYN入接口索引对应的业务口以外的另一个业务口。
在上述实现过程中,对透明代理设备的Linux网桥进行配置,将需要用于转发的两个业务口加入该Linux网桥中,在截获到客户端发送的SYN报文时,保存该SYN报文中包括MAC地址信息及SYN入接口索引在内的以太网帧头信息,之后利用指定钩子点将保存的以太帧头信息反转源MAC地址和目的MAC地址后添加到构造的SYN-ACK报文,并将该目标SYN报文从SYN入接口发送出去,以建立与客户端的连接,而在与服务端建立连接时,将保存的以太帧头信息添加到构造的目标SYN报文中并从Linux网桥上除SYN入接口以外的另一个业务口发送出去。如此,实现了交换网络透明网桥模式下透明代理,无需更改网络拓扑,无需配置IP和路由,且易于实现。
进一步地,在一些实施例中,所述透明代理设备的Linux内核中设置有ebtables扩展模块;所述截获客户端向服务端发送的TCP的SYN报文,包括:
通过所述ebtables扩展模块,对进入的TCP报文进行匹配,以确定所述TCP报文是否属于已建立的Socket或者监听的透明代理Socket;所述TCP报文包括SYN报文;
若匹配成功,通过策略路由将所述TCP报文发送到所述Linux内核。
在上述实现过程中,利用ebtables扩展模块和策略路由,将客户端发送的SYN报文路由到内核。
进一步地,在一些实施例中,所述通过策略路由将所述TCP报文发送到所述Linux内核之前,包括:
将所述TCP报文打上Mark X标记;所述Linux内核中设置有:针对带有Mark X标记的报文,禁止将目的MAC地址设置为进入接口MAC地址。
在上述实现过程中,修改Linux内核代码,使其针对带有Mark X标记的报文,禁止将目的MAC地址设置为进入接口MAC地址,这样,Linux网桥接收到透明代理报文时,会进行ebtables扩展匹配,匹配成功后,为该透明代理报文打上Mark X标记,如此,后续内核还能基于该目的MAC地址来外发报文。
进一步地,在一些实施例中,所述保存所述SYN报文中的以太网帧头信息,包括:
创建request_sock结构体,并在所述request_sock结构体中增加tproxy_option信息,所述tproxy_option信息用于记录所述SYN报文中的以太网帧头信息。
在上述实现过程中,提供一种保存以太网帧头信息的具体方式,即内核Socket层接收到SYN请求时,可创建request_sock结构体,在该结构体中增加tproxy_option信息,用于保存SYN报文中的以太网帧头信息。
进一步地,在一些实施例中,所述指定钩子点是Netfilter的POST_ROUTING钩子点。
在上述实现过程中,提供用于在外发报文中添加以太网帧头信息的钩子点可选项。
进一步地,在一些实施例中,所述透明代理设备的Linux内核中设置有目标套接字参数;所述方法还包括:
基于接收到所述服务端返回的报文的业务口的索引,更新所述目标套接字参数。
在上述实现过程中,设置目标套接字参数来记录目标外发接口的索引,便于后续针对发往服务端的透明代理报文的处理。
进一步地,在一些实施例中,所述方法还包括:
当存在需要发送给所述服务端的透明代理报文时,使用所述目标套接字参数设置所述透明代理报文的报文头部,并将所述透明代理报文从所述目标外出接口发送出去。
在上述实现过程中,后续发往服务器的透明代理报文均使用目标套接字参数来设置以太网MAC信息,提升处理效率。
第二方面,本申请实施例提供的一种网桥透明代理装置,应用于透明代理设备,所述透明代理设备的Linux网桥上配置有两个业务口;所述装置包括:
帧头保存模块,用于截获客户端向服务端发送的TCP的SYN报文,保存所述SYN报文中的以太网帧头信息;所述以太网帧头信息包括MAC地址信息及SYN入接口索引;
第一外发模块,用于构造SYN-ACK报文,利用指定钩子点将保存的以太帧头信息中的源MAC地址和目的MAC地址反转后,添加到所述SYN-ACK报文头部,并将所述SYN-ACK报文从所述SYN入接口索引对应的业务口发送出去,在再次接收到所述客户端的报文时,确定与所述客户端建立连接;
第二外发模块,用于在与所述服务端建立连接时,构造目标SYN报文,利用所述指定钩子点将保存的以太帧头信息添加到所述目标SYN报文中,并将所述目标SYN报文从目标外出接口发送出去;所述目标外出接口是所述Linux网桥上除所述SYN入接口索引对应的业务口以外的另一个业务口。
第三方面,本申请实施例提供的一种电子设备,包括:存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现如第一方面任一项所述的方法的步骤。
第四方面,本申请实施例提供的一种计算机可读存储介质,所述计算机可读存储介质上存储有指令,当所述指令在计算机上运行时,使得所述计算机执行如第一方面任一项所述的方法。
第五方面,本申请实施例提供的一种计算机程序产品,所述计算机程序产品在计算机上运行时,使得计算机执行如第一方面任一项所述的方法。
本申请公开的其他特征和优点将在随后的说明书中阐述,或者,部分特征和优点可以从说明书推知或毫无疑义地确定,或者通过实施本申请公开的上述技术即可得知。
为使本申请的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。
附图说明
为了更清楚地说明本申请实施例的技术方案,下面将对本申请实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本申请的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
图1为本申请实施例提供的一种网桥透明代理方法的流程图;
图2为本申请实施例提供的一种基于Linux网桥的透明代理方法中针对客户端SYN报文的处理流程的示意图;
图3为本申请实施例提供的一种基于Linux网桥的透明代理方法中与服务端建立连接的处理流程的示意图;
图4为本申请实施例提供的一种网桥透明代理装置的框图;
图5为本申请实施例提供的一种电子设备的结构框图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行描述。
应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。同时,在本申请的描述中,术语“第一”、“第二”等仅用于区分描述,而不能理解为指示或暗示相对重要性。
如背景技术记载,相关技术中存在着针对网桥无IP地址配置,路由不可达情况下,透明代理的实现较为复杂的问题。基于此,本申请实施例提供一种网桥透明代理方案,以解决上述问题。
接下来对本申请实施例进行介绍:
如图1所示,图1是本申请实施例提供的一种网桥透明代理方法的流程图,所述方法应用于透明代理设备,所述透明代理设备的Linux网桥上配置有两个业务口。也就是说,该透明代理设备是搭载有Linux网桥的网络设备,即该透明代理设备可以是Linux网桥设备。Linux网桥是一种以同种协议连接两个局域网的产品,可以认为是一个决定发送的包是到自己的局域网还是到另一个局域网的设备。通常来说,Linux网桥上可以配置有一个或多个业务口,而本实施例方案对Linux网桥进行了配置,将需要用于转发的两个业务口加入网桥中,一个业务口用于与客户端进行交互,另一个业务口用于与服务端进行交互,需要说明的是,当网络环境中存在多个客户端时,这些客户端的收发报文共用一个业务口。
所述方法包括:
在步骤101、截获客户端向服务端发送的TCP的SYN报文,保存所述SYN报文中的以太网帧头信息;所述以太网帧头信息包括MAC地址信息及SYN入接口索引;
本实施例所实现的透明代理是TCP透明代理,可包括客户端与服务端建立TCP连接,以及建立完毕后客户端与服务端之间的TCP数据报文处理。TCP(Transmission ControlProtocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,其使用三次握手协议建立连接,当主动方发出SYN(Synchronize Sequence Numbers,同步序列编号)连接请求后,等待对方回答SYN+ACK(Acknowledge character,确认字符),并最终对对方的SYN执行ACK确认。因此,当客户端要与服务端建立TCP连接时,客户端发送SYN报文,此时透明代理设备对该SYN报文进行拦截及获取。
在一些实施例中,所述透明代理设备的Linux内核中设置有ebtables扩展模块;本步骤中提到的截获客户端向服务端发送的TCP的SYN报文可以包括:通过所述ebtables扩展模块,对进入的TCP报文进行匹配,以确定所述TCP报文是否属于已建立的Socket或者监听的透明代理Socket;所述TCP报文包括SYN报文;若匹配成功,通过策略路由将所述TCP报文发送到所述Linux内核。也就是说,透明代理设备可以利用ebtables扩展模块和策略路由,将源地址或目的地址属于客户端地址或服务端地址的报文,即透明代理报文发送到内核。具体地,ebtables是Linux系统下网络数据包过滤的配置工具,其工作在数据链路层,本实施例方案为内核增加一个ebtables扩展模块,用于匹配透明代理报文,即对进入透明代理设备的TCP报文查找是否属于已经建立的Socket或者监听的透明代理Socket,从而实现过滤功能;该ebtables扩展模块还设置有对应的用户层扩展,用于将符合条件的透明代理报文上传到内核网络层,进行路由查找。策略路由是一种比基于目标网络进行路由更加灵活的数据包路由转发机制,用ACL(Access Control Lists,访问控制列表)来定义一种特别的数据包,比如源地址是客户端的包,再针对这个ACL定义的包,配置一个选路策略,本实施例方案中,透明代理设备使用策略路由,将包括客户端向服务端发送的SYN报文在内的透明代理报文路由到本地回环(loopback)接口。
通常来说,Linux内核在接收到报文后,会将目的MAC地址设置为进入接口MAC地址,这样容易对透明代理设备对透明代理报文外出查找正确的外出接口产生影响,因此,在一些实施例中,所述通过策略路由将所述TCP报文发送到所述Linux内核之前,可以包括:将所述TCP报文打上Mark X标记;所述Linux内核中设置有:针对带有Mark X标记的报文,禁止将目的MAC地址设置为进入接口MAC地址。也就是说,修改Linux内核代码,使其针对带有Mark X标记的报文,禁止将目的MAC地址设置为进入接口MAC地址,这样,Linux网桥接收到透明代理报文时,会进行ebtables扩展匹配,匹配成功后,为该透明代理报文打上Mark X标记,如此,后续内核还能基于该目的MAC地址来外发报文。另外,Linux内核针对其他类型的报文,仍按照将目的MAC地址设置为进入接口MAC地址的机制进行处理。
在截获该SYN报文后,透明代理设备保存该SYN报文中的以太网帧头信息。在以太网中,数据通信的基本单位是以太网帧,由头部(header)、数据(data)以及校验和(checksum)三部分构成,在本实施例方案的场景中,SYN报文的以太网帧头信息包括MAC地址信息及SYN入接口索引,这里的MAC地址信息包括用于标记数据由哪台机器发送的源MAC地址和用于标记数据由哪台机器接收的目的MAC地址,这里的SYN入接口索引是标记透明代理设备接收该SYN报文的业务口的ID,例如,Linux网桥配置的两个业务口的ID分别为Eth1和Eth2,其中接收该SYN报文的业务口的ID为Eth1,则该SYN入接口索引即为Eth1。当然,该以太网帧头信息除了这两种信息以外,还可以包括其他信息,如标记报文类型的信息等。在一些实施例中,所述保存所述SYN报文中的以太网帧头信息可以包括:创建request_sock结构体,并在所述request_sock结构体中增加tproxy_option信息,所述tproxy_option信息用于记录所述SYN报文中的以太网帧头信息。也就是说,内核Socket层接收到SYN请求时,可创建request_sock结构体,在该结构体中增加tproxy_option信息,用于保存SYN报文中的MAC地址信息及SYN入接口索引等以太网帧头信息。当然,在其他实施例中,也可以根据实际情况的需求设置其他结构块来保存该以太网帧头信息,本申请对此不作限制。
在步骤102、构造SYN-ACK报文,利用指定钩子点将保存的以太帧头信息中的源MAC地址和目的MAC地址反转后,添加到所述SYN-ACK报文头部,并将所述SYN-ACK报文从所述SYN入接口索引对应的业务口发送出去,在再次接收到所述客户端的报文时,确定与所述客户端建立连接;
透明代理设备的Linux内核构造SYN-ACK报文来响应客户端发送的SYN报文,以代理原本的服务器与客户端建立连接。本实施例方案实现的是在交换网络中,网桥无IP地址配置,路由不可达情况下的透明代理,也就是说,透明代理设备中无需配置IP地址和路由,而是通过本实施例方案的逻辑来实现。
具体地,本步骤中提到的SYN-ACK报文是Linux内核构造的,在构造完成后,内核可以将SYN-ACK报文发给IP层,由于保存的以太网帧头信息中,源MAC地址是客户端所在设备的MAC地址,目的MAC地址是服务端所在设备的MAC地址,因此,透明代理设备利用指定钩子点反转这两个MAC地址,使得调整后的以太网帧头信息中,源MAC地址是服务端所在设备的MAC地址,目的MAC地址是客户端所在设备的MAC地址,这样,透明代理设备将调整后的以太网帧头信息添加到SYN-ACK报文头部,并将该SYN-ACK报文从SYN入接口索引对应的业务口,即SYN入接口发送出去。如此,当客户端返回的ACK报文再次进入Linux内核时,说明与客户端的TCP连接正常建立。
可选地,前面提到的指定钩子点可以是Netfilter的POST_ROUTING钩子点,Netfilter是Linux系统引入的一个子系统,它作为一个通用的、抽象的框架,提供一整套的hook函数的管理机制,使得诸如数据包过滤、网络地址转换和基于协议类型的连接跟踪成为了可能,而POST_ROUTING钩子点就是Netfilter提供的一种钩子点,所有马上便要通过网络设备出去的包通过此钩子点,内置的源地址转换功能(包括地址伪装)在此钩子点进行。因此,基于此钩子点,可以实现将正确的以太网帧头信息添加到对应的外发报文头部。
另外,透明代理设备将SYN-ACK报文从SYN入接口发送出去,可以是调用dev_queue_xmit函数实现的。这一函数是设备驱动程序执行传输的接口,用于直接使用skb_buff结构发包。当然,在其他实施例中,这一发送还可以基于其他方式实现,本申请对此不作限制。
在步骤103、在与所述服务端建立连接时,构造目标SYN报文,利用所述指定钩子点将保存的以太帧头信息添加到所述目标SYN报文中,并将所述目标SYN报文从目标外出接口发送出去;所述目标外出接口是所述Linux网桥上除所述SYN入接口索引对应的业务口以外的另一个业务口。
透明代理尝试与被代理的服务器连接时,Linux内核会构造新的SYN报文发送给服务端发起连接请求。具体地,本步骤中提到的目标SYN报文就是Linux内核所构造的新的SYN报文,在构造完成目标SYN报文后,透明代理设备利用指定钩子点将保存的以太帧头信息添加到该目标SYN报文中,最后,透明代理设备基于SYN入接口索引查找目标外出接口,并将目标SYN报文从该目标外出接口发送出去,这里的目标外出接口是Linux网桥上除SYN入接口索引对应的业务口以外的另一个业务口,沿用前面的例子,Linux网桥上配置有Eth1和Eth2两个业务口,若SYN入接口索引对应的业务口是Eth1,则目标外出接口是Eth2。如此,使得客户端和服务端均感知不到透明代理设备的存在,实现交换网络网桥模式下透明代理,无需更改网络拓扑,也无需配置IP和路由。
进一步地,透明代理设备针对目标外出接口的查找可以是基于目标套接字参数来完成的,这里的目标套接字参数可以是指sk_bound_dev_if这一参数。在实现时,透明代理设备可以将前面提到的tproxy_option信息通过IP_TPROXY_MAC_INFO选项设置到新建立的Socket上,同时为该Socket设置SO_BINDTO_DEVICE,值为tproxy_option上保存的接口索引,这样,透明代理设备在准备外发目标SYN报文时,可以根据sock上设置的sk_bound_dev_if接口索引,查找到目标外出接口。这样,当接收到服务端返回的SYN-ACK报文时,透明代理设备可以基于接收到该报文的业务口的索引,更新该目标套接字参数。也就是说,当服务端返回的SYN-ACK报文达到本机内核协议栈TCP处理模块后,更新sk_bound_dev_if为SYN-ACK进入接口索引,这样,便于后续针对发往服务端的透明代理报文的处理。
更进一步地,上述方法还可以包括:当存在需要发送给所述服务端的透明代理报文时,使用所述目标套接字参数设置所述透明代理报文的报文头部,并将所述透明代理报文从所述目标外出接口发送出去。也就是说,后续发往服务端的透明代理报文只需要在Netfilter的POST_ROUTING中使用sock结构体保存的sk_bound_dev_if,获取对应的net_device指针,然后重新设置外出报文的以太网MAC信息并调用dev_queue_xmit函数发送即可。如此,方便且快捷,有利于提升处理效率。
需要说明的是,当确定与客户端建立连接时,内核可以利用request_sock结构体创建完整的sock结构体,将request_sock结构体保存的MAC信息保存到inet_sock结构体上,并将request_sock结构体上保存的SYN入接口索引保存到sock结构体的sk_bound_dev_if上,从而方便后续透明代理报文外发时对需要的MAC信息以及外发接口信息的获取。
本申请实施例,对透明代理设备的Linux网桥进行配置,将需要用于转发的两个业务口加入该Linux网桥中,在截获到客户端发送的SYN报文时,保存该SYN报文中包括MAC地址信息及SYN入接口索引在内的以太网帧头信息,之后利用指定钩子点将保存的以太帧头信息反转源MAC地址和目的MAC地址后添加到构造的SYN-ACK报文,并将该目标SYN报文从SYN入接口发送出去,以建立与客户端的连接,而在与服务端建立连接时,将保存的以太帧头信息添加到构造的目标SYN报文中并从Linux网桥上除SYN入接口以外的另一个业务口发送出去。如此,实现了交换网络透明网桥模式下透明代理,无需更改网络拓扑,无需配置IP和路由,且易于实现。
为了对本申请的方案做更为详细的说明,接下来介绍一具体实施例:
本实施例提供一种基于Linux网桥的透明代理方法,以实现在交换网络中,网络设备作为二层纯透明网桥时,网桥无IP地址配置,路由不可达情况下的透明代理。这一方案是在Linux的网桥模块的基础上,利用ebtables和策略路由将透明代理报文发送到内核,将客户端发送的报文中的以太网帧头信息保存到内核sock结构上,并利用Netfilter Hook和策略路由,将本地外发的报文跳过链路层地址查找,直接外发给对端;在连接被代理的服务器时,将保存的以太网帧头信息利用Netfilter Hook添加到外发报文上,跳过ARP(AddressResolution Protocol,地址解析协议)查找,直接将透明代理报文正确外发。
本实施例方案在实现时的准备工作包括:为内核增加一个ebtable扩展模块,以扩展匹配功能,即对进入代理设备的TCP报文查找是否属于是已经建立的Socket或者监听的透明代理Socket,若是,则设置skb→mark为1;为内核增加一个结构体,本实施例使用tproxy_option,用于保存SYN报文的入接口索引和以太网帧头部MAC信息,同时为内核Socket中增加一个IP选项IP_TPROXY_MAC_INFO,用于获取和设置Socket接口上的入接口索引和以太网帧头部MAC信息;增加ebtalbes模块对应的用户层扩展,用于将符合条件的透明代理报文上送到内核网络层,进行路由查找;增加策略路由,用于将透明代理报文路由到本地回环接口;配置网桥,将需要用于转发的两个业务口加入网桥中。
之后,本实施例方案的工作流程主要包括针对客户端SYN报文的处理流程,以及与服务端建立连接的处理流程,其中,针对客户端SYN报文的处理流程如图2所示,包括:
S201、内核网桥模块接收第一SYN报文;具体地,该第一SYN报文是客户端向服务端发送的用于请求建立TCP连接的SYN报文;
S202、判断该第一SYN报文是否为透明代理报文,是则执行S203,否则执行S209;具体地,在内核网桥模块接收到透明代理报文skb时,会进行ebtables扩展匹配,匹配成功后,设置该Skb→mark=1;内核对于skb→mark=1的报文,禁止将目的MAC地址设置为进入接口MAC地址;
S203、将该第一SYN报文策略路由到本地;
S204、创建request_sock结构;
S205、在request_sock结构上保存第一SYN报文上的以太网帧头信息;具体地,内核scoket层接收到syn请求,创建request_sock结构,在该结构体中增加tproxy_option信息,用于保存SYN报文中的MAC地址信息及SYN入接口索引;
S206、构造第一SYN-ACK报文,将request_sock结构上保存的MAC地址信息中的源MAC地址和目的地址进行反转,再以此利用Netfilter的Post_Routing Hook在该第一SYN-ACK报文上添加以太网帧头信息;
S207、使用dev_queue_xmit函数将该第一SYN-ACK报文外发出去;
S208、当接收到客户端返回的ACK报文时,确定与客户端之间TCP连接连接正常;
S209、直接转发第一SYN报文。
而与服务端建立连接的处理流程如图3所示,包括:
S301、为新建立的Socket设置SO_BINDTO_DEVICE,值为针对客户端SYN报文的处理流程中,tproxy_option上保存的接口索引;
S302、构造第二SYN报文,基于保存的接口索引实现对第二SYN报文的外发;具体地,内核构造第二SYN报文后下发给IP层,报文经过Netfilter的POST_ROUTING Hook,在该钩子中增加回调函数,将外出的SYN透明代理skb→data偏移数据重置,正确设置以太网帧头信息,根据sock上设置的sk_bound_dev_if接口索引,通过网桥模块,查找此接口所在网桥的另外一个接口,获取对应的struct net_device指针,调用dev_queue_xmit函数将第二SYN报文直接从网卡发送出去;
S303、接收到服务器返回的第二SYN-ACK报文;
S304、更新sk_bound_dev_if为第二SYN-ACK报文入接口索引;具体地,该第二SYN-ACK报文是服务器返回的SYN-ACK报文,当内核从接口中收到服务器返回的SYN-ACK报文,经过ebtables规则匹配成功后,设置skb→mark并经策略路由,进入本机回环接口进行处理。第二SYN-ACK报文到达本机内核协议栈tcp处理模块后,更新sock结构上的sk_bound_dev_if为第二SYN-ACK报文入接口索引,同时清除为此sock保存的dst_cache(路由缓存),以方便透明代理报文外出查找正确的外出接口,至此,代理进程与后端服务器连接已经建立成功,后续发往服务器的透明代理报文只需要在Netfilter的POST_ROUTING中使用sock结构保存的sk_bound_dev_if,获取对应的net_device指针,然后重新设置外出报文的以太网MAC信息并调用dev_queue_xmit发送,即可实现发往服务器的透明代理报文的外发。
本申请实施例的方案,利用Linux ebtables和Bridge模块,通过策略路由和内核协议栈,实现了纯交换网络透明网桥模式下透明代理。
与前述方法的实施例相对应,本申请还提供网桥透明代理装置及其应用的终端的实施例:
如图4所示,图4是本申请实施例提供的一种网桥透明代理装置的框图,所述装置应用于透明代理设备,所述透明代理设备的Linux网桥上配置有两个业务口;所述装置包括:
帧头保存模块41,用于截获客户端向服务端发送的TCP的SYN报文,保存所述SYN报文中的以太网帧头信息;所述以太网帧头信息包括MAC地址信息及SYN入接口索引;
第一外发模块42,用于构造SYN-ACK报文,利用指定钩子点将保存的以太帧头信息中的源MAC地址和目的MAC地址反转后,添加到所述SYN-ACK报文头部,并将所述SYN-ACK报文从所述SYN入接口索引对应的业务口发送出去,在再次接收到所述客户端的报文时,确定与所述客户端建立连接;
第二外发模块43,用于在与所述服务端建立连接时,构造目标SYN报文,利用所述指定钩子点将保存的以太帧头信息添加到所述目标SYN报文中,并将所述目标SYN报文从目标外出接口发送出去;所述目标外出接口是所述Linux网桥上除所述SYN入接口索引对应的业务口以外的另一个业务口。
上述装置中各个模块的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。
本申请还提供一种电子设备,请参见图5,图5为本申请实施例提供的一种电子设备的结构框图。电子设备可以包括处理器510、通信接口520、存储器530和至少一个通信总线540。其中,通信总线540用于实现这些组件直接的连接通信。其中,本申请实施例中电子设备的通信接口520用于与其他节点设备进行信令或数据的通信。处理器510可以是一种集成电路芯片,具有信号的处理能力。
上述的处理器510可以是通用处理器,包括中央处理器(CPU,Central ProcessingUnit)、网络处理器(NP,Network Processor)等;还可以是数字信号处理器(DSP)、专用集成电路(ASIC)、现成可编程门阵列(FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本申请实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器510也可以是任何常规的处理器等。
存储器530可以是,但不限于,随机存取存储器(RAM,Random Access Memory),只读存储器(ROM,Read Only Memory),可编程只读存储器(PROM,Programmable Read-OnlyMemory),可擦除只读存储器(EPROM,Erasable Programmable Read-Only Memory),电可擦除只读存储器(EEPROM,Electric Erasable Programmable Read-Only Memory)等。存储器530中存储有计算机可读取指令,当所述计算机可读取指令由所述处理器510执行时,电子设备可以执行上述图1方法实施例涉及的各个步骤。
可选地,电子设备还可以包括存储控制器、输入输出单元。
所述存储器530、存储控制器、处理器510、外设接口、输入输出单元各元件相互之间直接或间接地电性连接,以实现数据的传输或交互。例如,这些元件相互之间可通过一条或多条通信总线540实现电性连接。所述处理器510用于执行存储器530中存储的可执行模块,例如电子设备包括的软件功能模块或计算机程序。
输入输出单元用于提供给用户创建任务以及为该任务创建启动可选时段或预设执行时间以实现用户与服务器的交互。所述输入输出单元可以是,但不限于,鼠标和键盘等。
可以理解,图5所示的结构仅为示意,所述电子设备还可包括比图5中所示更多或者更少的组件,或者具有与图5所示不同的配置。图5中所示的各组件可以采用硬件、软件或其组合实现。
本申请实施例还提供一种存储介质,所述存储介质上存储有指令,当所述指令在计算机上运行时,所述计算机程序被处理器执行时实现方法实施例所述的方法,为避免重复,此处不再赘述。
本申请还提供一种计算机程序产品,所述计算机程序产品在计算机上运行时,使得计算机执行方法实施例所述的方法。
在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,也可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,附图中的流程图和框图显示了根据本申请的多个实施例的装置、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现方式中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
另外,在本申请各个实施例中的各功能模块可以集成在一起形成一个独立的部分,也可以是各个模块单独存在,也可以两个或两个以上模块集成形成一个独立的部分。
所述功能如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述仅为本申请的实施例而已,并不用于限制本申请的保护范围,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
以上所述,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应所述以权利要求的保护范围为准。
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
Claims (10)
1.一种网桥透明代理方法,其特征在于,应用于透明代理设备,所述透明代理设备的Linux网桥上配置有两个业务口;所述方法包括:
截获客户端向服务端发送的TCP的SYN报文,保存所述SYN报文中的以太网帧头信息;所述以太网帧头信息包括MAC地址信息及SYN入接口索引;
构造SYN-ACK报文,利用指定钩子点将保存的以太帧头信息中的源MAC地址和目的MAC地址反转后,添加到所述SYN-ACK报文头部,并将所述SYN-ACK报文从所述SYN入接口索引对应的业务口发送出去,在再次接收到所述客户端的报文时,确定与所述客户端建立连接;
在与所述服务端建立连接时,构造目标SYN报文,利用所述指定钩子点将保存的以太帧头信息添加到所述目标SYN报文中,并将所述目标SYN报文从目标外出接口发送出去;所述目标外出接口是所述Linux网桥上除所述SYN入接口索引对应的业务口以外的另一个业务口。
2.根据权利要求1所述的方法,其特征在于,所述透明代理设备的Linux内核中设置有ebtables扩展模块;所述截获客户端向服务端发送的TCP的SYN报文,包括:
通过所述ebtables扩展模块,对进入的TCP报文进行匹配,以确定所述TCP报文是否属于已建立的Socket或者监听的透明代理Socket;所述TCP报文包括SYN报文;
若匹配成功,通过策略路由将所述TCP报文发送到所述Linux内核。
3.根据权利要求2所述的方法,其特征在于,所述通过策略路由将所述TCP报文发送到所述Linux内核之前,包括:
将所述TCP报文打上Mark X标记;所述Linux内核中设置有:针对带有Mark X标记的报文,禁止将目的MAC地址设置为进入接口MAC地址。
4.根据权利要求1所述的方法,其特征在于,所述保存所述SYN报文中的以太网帧头信息,包括:
创建request_sock结构体,并在所述request_sock结构体中增加tproxy_option信息,所述tproxy_option信息用于记录所述SYN报文中的以太网帧头信息。
5.根据权利要求1所述的方法,其特征在于,所述指定钩子点是Netfilter的POST_ROUTING钩子点。
6.根据权利要求1所述的方法,其特征在于,所述透明代理设备的Linux内核中设置有目标套接字参数;所述方法还包括:
基于接收到所述服务端返回的报文的业务口的索引,更新所述目标套接字参数。
7.根据权利要求1所述的方法,其特征在于,所述方法还包括:
当存在需要发送给所述服务端的透明代理报文时,使用所述目标套接字参数设置所述透明代理报文的报文头部,并将所述透明代理报文从所述目标外出接口发送出去。
8.一种网桥透明代理装置,其特征在于,应用于透明代理设备,所述透明代理设备的Linux网桥上配置有两个业务口;所述装置包括:
帧头保存模块,用于截获客户端向服务端发送的TCP的SYN报文,保存所述SYN报文中的以太网帧头信息;所述以太网帧头信息包括MAC地址信息及SYN入接口索引;
第一外发模块,构造SYN-ACK报文,利用指定钩子点将保存的以太帧头信息中的源MAC地址和目的MAC地址反转后,添加到所述SYN-ACK报文头部,并将所述SYN-ACK报文从所述SYN入接口索引对应的业务口发送出去,在再次接收到所述客户端的报文时,确定与所述客户端建立连接;
第二外发模块,用于在与所述服务端建立连接时,构造目标SYN报文,利用所述指定钩子点将保存的以太帧头信息添加到所述目标SYN报文中,并将所述目标SYN报文从目标外出接口发送出去;所述目标外出接口是所述Linux网桥上除所述SYN入接口索引对应的业务口以外的另一个业务口。
9.一种计算机可读存储介质,其特征在于,其上存储有计算机程序,所述计算机程序被处理器执行时实现如权利要求1至7任一项所述的方法。
10.一种电子设备,其特征在于,包括处理器、存储器及存储在存储器上并可在处理器上运行的计算机程序,其中,所述处理器执行所述计算机程序时实现如权利要求1至7任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211650671.3A CN115914425A (zh) | 2022-12-21 | 2022-12-21 | 一种网桥透明代理方法、装置、存储介质及设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211650671.3A CN115914425A (zh) | 2022-12-21 | 2022-12-21 | 一种网桥透明代理方法、装置、存储介质及设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115914425A true CN115914425A (zh) | 2023-04-04 |
Family
ID=86492469
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211650671.3A Pending CN115914425A (zh) | 2022-12-21 | 2022-12-21 | 一种网桥透明代理方法、装置、存储介质及设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115914425A (zh) |
-
2022
- 2022-12-21 CN CN202211650671.3A patent/CN115914425A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US20200067891A1 (en) | Securing end-to-end virtual machine traffic | |
CN110838935A (zh) | 高可用sdn控制器集群方法、系统、存储介质及设备 | |
US10063675B2 (en) | Performing duplicate address detection for an integrated routing and bridging device | |
CN110381007B (zh) | Tcp加速方法及装置 | |
CN115914425A (zh) | 一种网桥透明代理方法、装置、存储介质及设备 | |
Cisco | DECnet Commands | |
Cisco | DECnet Commands | |
Cisco | DECnet Commands | |
Cisco | DECnet Commands | |
Cisco | DECnet Commands | |
Cisco | DECnet Commands | |
Cisco | DECnet Commands | |
Cisco | DECnet Commands | |
Cisco | DECnet Commands | |
CN114268578A (zh) | 切换线路的数据传输方法、装置、设备及存储介质 | |
Cisco | DECnet Commands | |
Cisco | DECnet Commands | |
Cisco | DECnet Commands | |
Cisco | DECnet Commands | |
Cisco | DECnet Commands | |
Cisco | DECnet Commands | |
Cisco | DECnet Commands | |
Cisco | DECnet Commands | |
Cisco | DECNet Commands | |
Cisco | DECnet Commands |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |