通用透明代理方法

文档序号:1470102 发布日期:2020-02-21 浏览:5次 >En<

阅读说明:本技术 通用透明代理方法 (Universal transparent proxy method ) 是由 贺桂友 柳遵梁 于 2019-08-27 设计创作,主要内容包括:本发明公开了一种通用透明代理方法,包括如下步骤:通过Linux机器连接客户端和服务端;配置用户脚本文件,启动透明代理服务;数据接收发送模块接收数据包,修改数据包,然后上发Freebsd协议栈进行处理,最后上发异步网络框架模块后进入用户层,进行用户层数据处理。本发明具有如下有益效果:本发明使用Freebsd协议栈处理数据,提高了效率,部署简单,开发便捷;在Freebsd协议栈基础上提供异步网络开发接口库Libnet和库LibProxy,Libnet处理网络数据收发,LibProxy用于对Libnet封装,将网络复杂情况交给Libnet处理,便于开发人员进行二次开发。(The invention discloses a universal transparent proxy method, which comprises the following steps: connecting a client and a server through a Linux machine; configuring a user script file and starting a transparent proxy service; and the data receiving and sending module receives the data packet, modifies the data packet, sends a Freebsd protocol stack for processing, and finally sends an asynchronous network frame module and then enters a user layer for processing the data of the user layer. The invention has the following beneficial effects: the invention uses the Freebsd protocol stack to process data, improves the efficiency, has simple deployment and convenient development; the method is characterized in that an asynchronous network development interface library Libnet and a library LibProxy are provided on the basis of a Freebsd protocol stack, the Libnet processes network data receiving and transmitting, the LibProxy is used for packaging the Libnet and handing network complex conditions to the Libnet for processing, and developers can conveniently carry out secondary development.)

通用透明代理方法

技术领域

本发明涉及网络通信技术领域,尤其是涉及一种配置简单,部署便捷,便于二次开发的通用透明代理方法。

背景技术

传统透明代理方法需要对防火墙进行规则配置如iptables,搭建网桥,用户程序控制,对网络环境十分依赖,后期网络环境变更,则需要重新部署,实施起来十分不便利,并且需要详细了解现场网络拓扑环境;需要根据现场网络拓扑环境,获取相关信息,如Vlanid等;需要配置Vlan号,做bond绑定;不支持多Vlan网络和负载均衡多条线路节点;后期维护成本大。

发明内容

本发明为了克服现有技术中存在的实施部署不便利,网络环境复杂的不足,提供了一种配置简单,部署便捷,便于二次开发的通用透明代理方法。

为了实现上述目的,本发明采用了以下技术方案:

一种通用透明代理方法,包括IGB网卡驱动模块、数据接收发送模块、Freebsd协议栈和异步网络框架模块;包括如下步骤:

(1-1)通过Linux机器连接客户端和服务端,启动Linux系统,自动运行自动化脚本;

(1-2)配置用户脚本文件,运行用户程序,启动DPDK服务,启动透明代理服务;

(1-3)数据接收发送模块接收数据包,修改数据包,然后上发Freebsd协议栈;

(1-4)Freebsd协议栈对修改后的数据包进行处理,然后上发异步网络框架模块;

(1-5)数据包上发异步网络框架模块后进入用户层,进行用户层数据处理。

本发明通过在客户端和服务端之间建立双向连接,将客户端的数据发送给服务端,服务端的数据发送给客户端,代理服务器在中间仅起到中转作用,而本身却是透明的,服务端和客户端均无法感知透明代理服务器的存在。

作为优选,步骤(1-2)的具体步骤如下:

(2-1)利用脚本config.ini配置网卡信息;

(2-2)利用脚本config.yaml配置透明代理支持的最大连接数,本机代理端口和网卡进出编号;

(2-3)利用serverip.yaml是配置要代理服务器的IP和Port;

(2-4)运行用户程序,启动DPDK服务,启动透明代理服务。

作为优选,步骤(1-3)的具体步骤如下:

(3-1)数据接收发送模块从IGB网卡驱动模块收到数据包,解析数据包,根据脚本config.yaml配置的网卡进出编号进行判断,

如果接收到的数据包为客户端方向数据,取出目的IP和目的Port字段,转入步骤(3-2);

如果接收到的数据包为服务端方向数据,取出源IP和源Port字段,转入步骤(3-2);

(3-2)将取出的IP和Port字段组成key,进行Hash查找,根据脚本serverip.yaml配置的代理服务器的IP和Port字段过滤数据包,如果key不符合配置的代理服务器的IP和Port字段,数据包进行二层转发,转入步骤(3-1);如果key符合配置的代理服务器的IP和Port字段,转入步骤(3-3);

(3-3)数据包依据SYN和ACK标签判断是否为初次请求,

如果数据包为客户端初次请求,将网卡编号,网卡MAC,源IP,源Port字段,目的IP,目的Port字段,Vlan标签字段存入hash表中,转入步骤(3-4);

如果数据包不是初次请求,转入步骤(3-4);

(3-4)依据配置文件config.yaml和config.yaml配置的本机IP和本机代理端口,替换客户端请求数据包中的目的IP和目的Port字段,重新计算校验码,上发Freebsd协议栈。

作为优选,步骤(1-4)的具体步骤如下:

(4-1)Freebsd协议栈对数据包进行协议解析,丢弃不合法的数据包;

(4-2)Freebsd协议栈接收到客户端TCP三次握手的数据包后,会发送响应数据包;

(4-3)取出响应数据包的目的IP和目的Port字段,组成key,查找hash_port_recvHash表,hash_port_recv是客户端请求的IP和Port字段组成key的Hash表,

如果查找成功,表明该响应数据包是发往客户端方向的,替换该响应数据包的源IP和源Port字段为服务端的IP和服务端的Port字段,转入步骤(4-5);

如果查找失败,取出该响应数据包的源IP和源Port字段,组成Key,转入步骤(4-4);

(4-4)查找hash_port_send Hash表,hash_port_send是本机与服务端建立TCP连接的本机IP和Port组成key的Hash表,

如果查找成功,表明该响应数据包是发往服务端方向的,替换该响应数据包的源IP和源Port字段为客户端的IP和客户端的Port字段;转入步骤(4-5);

如果查找失败,不替换任何数据,直接发送0号网口;

(4-5)将替换过IP和Port字段的数据包递交到网卡,网卡进行校验码硬件运算,上发异步网络框架模块。

作为优选,步骤(1-5)的具体步骤如下:

(5-1)数据包上发异步网络框架模块后进入用户层,LibProxy库使用Libnet函数建立客户端和服务端的双向连接,Libnet函数为异步网络框架模块中的异步函数;

(5-2)使用LibProxy库函数从客户端接收数据和向客户端发送数据;

(5-3)使用LibProxy库函数从服务端接收数据和向服务端发送数据。

作为优选,还包括如下步骤:

(6-1)对客户端发送的数据进行合法性检验和安全验证;

(6-2)对服务端发送的数据进行敏感信息脱敏处理。

因此,本发明具有如下有益效果:本发明使用Freebsd协议栈处理数据,提高了效率,部署简单,开发便捷;在Freebsd协议栈基础上提供传统方式的异步网络开发接口库Libnet和库LibProxy,Libnet处理网络数据收发,LibProxy用于对Libnet封装,只提供数据处理接口,将网络复杂情况交给Libnet处理,克服了网络环境复杂性,便于开发人员进行二次开发。

附图说明

图1是本发明的一种流程图;

图2是本发明的一种网络位置图;

图3是本发明的一种工作时序图。

图中:IGB网卡驱动模块1、Freebsd协议栈2、异步网络框架模块3、客户端4、服务端5、透明代理服务器6、网络7、用户层8。

具体实施方式

下面结合附图与具体实施方式对本发明做进一步描述:

如图1所示的实施例是一种通用透明代理方法,包括IGB网卡驱动模块(1)、数据接收发送模块、Freebsd协议栈(2)和异步网络框架模块(3);包括如下步骤:

步骤100,通过Linux机器连接客户端和服务端,启动Linux系统,自动运行自动化脚本;

如图2所示,首先Linux机器插上两根网线,一根是对客户端(4),一根是对服务端(5),启动机器后进入Linux操作系统,通过透明代理服务器(6)和网络(7)连接服务端和客户端,自动运行自动化脚本,脚本包括IGB网卡驱动模块***,配置大页面内存和网卡绑定。

(1)IGB网卡驱动模块:在Intel开发工具集中编译其源代码,会出现igb_uio.ko,使用命令insmod igb_uio.ko加载到Linux内核中,IGB网卡驱动模块是用于实现控制和操作网卡发送和接受数据的功能。

(2)配置大页面内存:传统Linux内存页默认是4KB大小,会造成TLB Cache Miss(页表缓冲丢失),修改页面大小为2MB大小,会减小TLB Cache Miss,是一种性能优化技术,具体操作命令如下:

mkdir-p/mnt/huge

mount-t hugetlbfs nodev/mnt/huge

echo2048>/sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_h ugepages

(3)网卡绑定:Linux操作系统启动后,内核会接管网卡,内核不再控制网卡,而是交给IGB网卡驱动模块来管理,因此需要把网卡绑定到IGB驱动模块,控制权交由IGB驱动模块,命令如下:

./dpdk-devbind.py--bind=igb_uio mc1

./dpdk-devbind.py--bind=igb_uio mc2

mc1和mc2为网卡名字,dpdk-devbind.py是绑定脚本文件;

步骤200,配置用户脚本文件,运行用户程序,启动DPDK服务,启动透明代理服务;

步骤201,利用脚本config.ini配置网卡信息,网卡信息包括IP,子网掩码,网关和CPU掩码;IP和网关地址为私有地址,CPU掩码是指定程序运行在哪个CPU核心上,防止任务在多个CPU之间切换,造成性能损耗;

步骤202,利用脚本config.yaml配置透明代理支持的最大连接数,本机代理端口和网卡进出编号;最大连接数取决于系统硬件资源;本机代理端口是客户端请求数据交由哪个TCP端口;配置网卡进出编号是区分数据是客户端方向,还是服务器方向,是为了优化代码对数据包分析,避免多次查询;

步骤203,利用serverip.yaml是配置要代理服务器的IP和Port;IP和Port组成Key用于Hash查找;

步骤204,运行用户程序,启动DPDK服务,启动透明代理服务,程序命令如下:

./user_program 0>log0 2>&1&

./arp-p 0-s 10.10.10.254 10:0c:29:86:48:53

程序启动时使用int ret=rte_eal_init(argc,argv)初始化物理硬件配置;init_lcore_conf()设定运行CPU核心;init_mem_pool()配置程序使用内存;ret=init_port_start()初始化网卡,设定特定参数,如自动计算校验码;使用rte_hash_create(&hash_params)创建快速Hash查找表,用于数据包收发IP和Port快速替换;使用专用arp命令配置网关ip和mac关系,是为了数据包能够发送出去启动透明代理服务;

步骤300,数据接收发送模块接收数据包,修改数据包,然后上发Freebsd协议栈;

步骤301,数据接收发送模块从IGB网卡驱动模块收到数据包,解析数据包,根据脚本config.yaml配置的网卡进出编号进行判断,

如果接收到的数据包为客户端方向数据,取出目的IP和目的Port字段,转入步骤302;

如果接收到的数据包为服务端方向数据,取出源IP和源Port字段,转入步骤302;

步骤302,将取出的IP和Port字段组成key,进行Hash查找,根据脚本serverip.yaml配置的代理服务器的IP和Port字段过滤数据包,如果key不符合配置的代理服务器的IP和Port字段,数据包进行二层转发,转入步骤301;如果key符合配置的代理服务器的IP和Port字段,转入步骤303;

步骤303,数据包依据SYN和ACK标签判断是否为初次请求,

如果数据包为客户端初次请求,将网卡编号,网卡MAC,源IP,源Port字段,目的IP,目的Port字段,Vlan标签字段存入hash表中,转入步骤304;

如果数据包不是初次请求,转入步骤304;

步骤304,依据配置文件config.yaml和config.yaml配置的本机IP和本机代理端口,替换客户端请求数据包中的目的IP和目的Port字段,重新计算校验码,上发Freebsd协议栈。

步骤400,Freebsd协议栈对修改后的数据包进行处理,然后上发异步网络框架模块;

步骤401,Freebsd协议栈对数据包进行协议解析,丢弃不合法的数据包;

步骤402,Freebsd协议栈接收到客户端TCP三次握手的数据包后,会发送响应数据包;

步骤403,取出响应数据包的目的IP和目的Port字段,组成key,查找hash_port_recv Hash表,hash_port_recv是客户端请求的IP和Port字段组成key的Hash表,

如果查找成功,表明该响应数据包是发往客户端方向的,替换该响应数据包的源IP和源Port字段为服务端的IP和服务端的Port字段,转入步骤405;如果查找失败,取出该响应数据包的源IP和源Port字段,组成Key,转入步骤404;

步骤404,查找hash_port_send Hash表,hash_port_send是本机与服务端建立TCP连接的本机IP和Port组成key的Hash表,

如果查找成功,表明该响应数据包是发往服务端方向的,替换该响应数据包的源IP和源Port字段为客户端的IP和客户端的Port字段;转入步骤405;

如果查找失败,不替换任何数据,直接发送0号网口;

步骤405,将替换过IP和Port字段的数据包递交到网卡,网卡进行校验码硬件运算,上发异步网络框架模块。

步骤500,数据包上发异步网络框架模块后进入用户层(8),进行用户层数据处理;

步骤501,数据包上发异步网络框架模块后进入用户层,LibProxy库使用Libnet函数建立客户端和服务端的双向连接,Libnet函数为异步网络框架模块中的异步函数;

LibProxy库使用Libnet异步函数void async_accept(mc_tcp*ptcp,callback_cb)接受客户端新连接;使用void async_connect(end_point&dpdkep,end_point&ep,callback_cb cb)建立本机到服务器新连接,建立客户端和服务端的双向连接;

步骤502,使用LibProxy库函数从客户端接收数据和向客户端发送数据;

使用LibProxy库中的void onRecvFromClient(std::weak_ptr<BaseSession>sessionPtr,const char*pData,uint32_t cbSize)函数从客户端收取数据;使用int32_tsendToClient(const BasePktPtr&pktPtr)函数发送数据到客户端;

步骤503,使用LibProxy库函数从服务端接收数据和向服务端发送数据;

使用LibProxy库中的void onRecvFromServer(std::weak_ptr<BaseSession>sessionPtr,const char*pData,uint32_t cbSize)函数从服务器收取数据;int32_tsendToServer(const BasePktPtr&pktPtr)函数发送数据到服务器。

LibProxy库接收和发送函数则分别调用Libnet库的接收和发送函数。Libnet异步网络库API和传统网络开发API无异。当用户关闭TCP连接,Libnet会自动清除底层hash无效信息记录,用户层无感知。

Libnet部分接口如下

Void async_accept(mc_tcp*ptcp,callback_cb);

Void async_connect(end_point&dpdkep,callback_cb cb);

Void async_connect(end_point&dpdkep,end_point&ep,callback_cb cb);

Void async_read(std::shared_ptr<buffer>pbuffer,callback_cb cb);

Void async_write(std::shared_ptr<buffer>pbuffer,callback_cb cb);

Void async_close(callback_cb cb);

Void async_close_dpdk(callback_cb cb);

Void async_add_protect_server(end_point ep,callback_cb cb);

Bool is_close();

将客户端的数据发送给服务端,服务端的数据发送给客户端,而代理服务器在中间起到中转作用,而本身却是透明的,对双方而言是不存在的;在实际开发过程中,透明代理服务器根据自身业务需求,增加过滤机制;例如,对客户端发送的数据进行合法性检验,安全验证,防止黑客入侵。对服务器发送数据进行敏感信息脱敏处理,防止信息外泄等。

如图3所示,客户端发送TCP连接,过滤代理数据包后,替换数据包IP和PORT,校验码重新计算,进入Freebsd协议栈,完成三次握手,通知异步网络框架模块,上发用户层,新连接建立,此时用户发送对服务器的新连接,此过程中用户无需做过多操作,只需对SOCKET进行数据接收和发送,所有IP和PORT替换在底层接收和发送入口都已经操作完成;HASH表自动更新,连接断开后自动清除无效数据,上层用户无感知。

应理解,本实施例仅用于说明本发明而不用于限制本发明的范围。此外应理解,在阅读了本发明讲授的内容之后,本领域技术人员可以对本发明作各种改动或修改,这些等价形式同样落于本申请所附权利要求书所限定的范围。

12页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:一种网络流量时空特征提取和异常检测的方法及装置

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!

技术分类