专利名称:一种穿透linux类防火墙建立通信的方法
技术领域:
本发明涉及计算机网络通信领域,特别是配置有LINUX防火墙的两个计算机内网之间的通信。
背景技术:
NAT英文全称是“Network Address Translation”,中文意思是“网络地址转换”, 它允许一个整体机构以一个公用IP地址出现在hternet上,它是一种把内部私有网络地址(IP地址)翻译成合法网络IP地址的技术。当内部节点要与外部网络进行通讯时,NAT 将内部地址替换成公用地址,从而在外部公网(internet)上正常使用,NAT可以使多台计算机共享hternet连接,这一功能很好地解决了公共IP地址紧缺的问题。通过这种方法, 只申请一个合法IP地址,就把整个局域网中的计算机接入hternet中。这时,NAT屏蔽了内部网络,所有内部网计算机对于公共网络来说是不可见的,而内部网计算机用户不会意识到NAT的存在。NAT有三种类型静态NAT (Static NAT),动态地址NAT (Pooled NAT),网络地址端口转换NAPT。其中静态NAT是内部网络中的每个主机都被永久映射成外部网络中的某个合法的地址,动态地址NAT则是在外部网络中定义了一系列的合法地址,采用动态分配的方法映射到内部网络,NAPT则是把内部地址映射到外部网络的一个IP地址的不同端口上。典型的NAPT 有以下几种类型Full Cone NAT, Restricted Cone NAT, Port Restricted Cone NAT和Symmetric NAT,前三种为锥形NAT,最后一种为对称NAT。NAT功能通常被集成到路由器、防火墙、ISDN路由器或者单独的NAT设备中。在NAPT方式下,由于NAT的存在,两台分属不同内网的主机不能看到对方,因此有些情况下不能直接通信。要实现通信,需借助双方都可以直接进行通信的主机进行转发,但由于带宽等因素的限制,现在又发展出了一种“打洞”技术。由于技术上的限制,锥形NAT方式下可以实现打洞,对称NAT方式下打洞是不可能的。锥形NAT方式下,传统的打洞方式执行下面步骤
假设有两个分属不同内网的主机A和B以及一台A和B都可以访问到的公网上的服务器C,A的内网地址是192. 168. 1.2,端口号是3000,B的内网地址是10. 1. 1.2,端口号是 4000,A和B不可以直接通信,因为两个IP都是内网IP不可以在公网上传递。这需要防火墙采用NAT进行地址端口转换。下面步骤实现打洞
1、主机A使用地址(192. 168. 1.2:3000)作为源地址发送UDP报文到C,A前面的防火墙FA是1. 1. 1. 1,A发出的数据包到达FA后,地址变化为1. 1. 1. 1:4000。2、主机B使用地址(10. 1. 1.2:4000)作为源地址发送UDP报文到C,B前面的防火墙FB是2. 2. 2. 2,B发出的数据包到达FB后,地址变化为2. 2. 2. 2:5000。3、C 通过(1. 1. 1. 1:4000)将 B 的地址(2. 2. 2. 2:5000)告知 A (2. 2. 2. 2:5000)将A 的地址(1. 1. 1. 1:4000)告知 B。4、主机A使用地址(192. 168. 1. 2:3000)作为源地址向B发送UDP报文,A前面的防火墙FA是1.1. 1.1,A发出的数据包到达FA后,地址变化为1. 1. 1. 1:4000。这个报文是会被B前面的防火墙拒绝的,该报文的作用是建立B到(1. 1. 1. 1:4000)的通道,就是“打洞”。5、主机B使用地址(10. 1. 1.2:4000)作为源地址向A发送UDP报文,B前面的防火墙FB是2. 2. 2. 2,B发出的数据包到达FB后,地址变化为2. 2. 2. 2 5000,该报文可以穿过 A前面的防火墙到达A,因为在步骤4中已经建立了 B到(1. 1. 1. 1:4000)的通道。6、主机A和B可以正常通信。LINUX防火墙内部都有NAT,LINUX内核实现的是一种非典型的锥形NAT。在这种类型的NAT下,如果没有内外地址、端口的映射记录时,对于内部始发的首个到特定地址和端口的数据包,网关将像典型的锥形NAT —样进行地址映射并创建记录,如上述步骤1和2 所述。但在有到某个特定地址和端口的映射记录时(该记录可由外部输入数据包触发生成, 如上述步骤4所述),对于内部始发的首个到特定地址和端口的数据包,如上述步骤5所述, 网关将采用对称NAT的工作方式另外选取端口进行映射,就是B在步骤4 (外部数据输入) 和步骤5 (内部始发的首个数据包)分别建立地址映射记录。这种根据首个数据包方向来创建映射记录的方法使得传统的基于打洞的机制会失效。
发明内容
本发明通过改进传统的打洞机制来实现在不同LINUX防火墙之后的两个设备间使用UDP建立网络通讯的方法。为实现上述目的,本发明采用的技术方案是一种穿透LINUX类防火墙建立通信的方法,该方法依赖于分属不同内网的两台计算机A和B,以及不属于A和B所在内网并且 A和B可以访问到的服务器C,内网设置有LINUX类型防火墙,特别是A、B、C中装载配套的通信模块,在穿透LINUX类防火墙建立A和B之间的通信通道时,通信模块执行过程中包括以下步骤
①、计算机A生成以地址IA和端口PA为源地址,地址IC和端口 PC为目的地址,内容包括A的身份信息MA的UDP报文并发送,报文穿过A外部的防火墙到达服务器C,防火墙将 IA和PA转换为FIA和FPA,服务器C记录MA以及UDP报文的源地址FIA和端口信息FPA 到专用存储单元,
②、计算机B生成以地址IB和端口PB为源地址,地址IC和端口 PC为目的地址,内容包括B的身份信息MB的UDP报文并发送,报文穿过B外部的防火墙到达服务器C,防火墙将 IB和PB转换为FIB和FPB,服务器C记录MB以及UDP报文的源地址FIB和端口信息FPB 到专用存储单元,
③、计算机B向服务器C发送UDP报文,查询身份为MA的计算机地址和端口信息,并要求C通知身份为MA的计算机A进行通信准备操作,
④、服务器C收到计算机B的报文后,服务器C以FIA和FPA为目的地址和目的端口号向计算机A发送信息,内容包括地址FIA和端口 FPA以及MB的地址FIB和端口 FPB信息, 并要求A为地址FIB和端口 FPB进行通信准备,然后从专用存储单元中获得对应MA的FIA和FPA并回复给计算机B,
⑤、计算机A收到服务器C的信息后,根据地址信息FIA和FIB分别探测计算机A到达其所在内网的LINUX类防火墙和计算机B的LINUX类防火墙的跳数TA和TB,如果TA+1大于TB-I,则重新探测,否则计算机A以IA和PA为源地址和端口,以FIB和FPB为目标地址和端口,以TA+1为IP报文的生存期发送UDP报文,
⑥、计算机B收到来自服务器C的包含地址FIA和端口FPA信息的报文后,向计算机A 发送UDP报文,报文以IB为源地址,PB为源端口,以FIA为目标地址,FPA为目标端口。从A到防火墙的跳数是指从A开始,报文到达防火墙所经过的转发次数,生命周期是报文在网络中转发次数的限制。如果从A到防火墙的跳数为10,报文的生命周期设置大于10,则报文可以到达防火墙;如果报文的生命周期设置小于10,则报文在到达防火墙之前就被放弃,到达不了防火墙。由于IP路由可能发生变化,因此在每次打洞时都要探测跳数TA和TB。内网中,计算机外的防火墙可能有多层,判断TA+1和TB-I的意义在于,可以判定A 最外的防火墙是不是B最外的防火墙。如果是这种情况,两个设备还是有可能不可能通信的。由于设定了 UDP报文的生命周期为TA+1,计算机A发出的报文穿过其外部的防火墙就被丢弃,无法到达计算机B外部的防火墙,因此在计算机B端的NAT不会生成新的映射关系。此时计算机A已经准备好接收计算机B的报文,计算机B发送给计算机A的报文可以到达,同时计算机B也准备好接收计算机A的报文。这样,计算机A和计算机B之间就可以直接进行通信。
下面结合附图对本发明进行详细说明。图1是本发明的设备布局及报文发送循序图。其中1-6对应步骤①-⑥,11为计算机A外部的防火墙,12为计算机B外部的防火墙,11和12都可以使多重防火墙。
具体实施例方式一种穿透LINUX类防火墙建立通信的方法,该方法依赖于分属不同内网的两台计算机A和B,以及不属于A和B所在内网并且A和B可以访问到的服务器C,内网设置有LINUX 类型防火墙,特别是:A、B、C中装载配套的通信模块,在穿透LINUX类防火墙建立A和B之间的通信通道时,通信模块执行过程中包括以下步骤
①、计算机A生成以地址IA和端口PA为源地址,地址IC和端口 PC为目的地址,内容包括A的身份信息MA的UDP报文并发送,报文穿过A外部的防火墙到达服务器C,防火墙将 IA和PA转换为FIA和FPA,服务器C记录MA以及UDP报文的源地址FIA和端口信息FPA 到专用存储单元,
②、计算机B生成以地址IB和端口PB为源地址,地址IC和端口 PC为目的地址,内容包括B的身份信息MB的UDP报文并发送,报文穿过B外部的防火墙到达服务器C,防火墙将 IB和PB转换为FIB和FPB,服务器C记录MB以及UDP报文的源地址FIB和端口信息FPB到专用存储单元,
③、计算机B向服务器C发送UDP报文,查询身份为MA的计算机地址和端口信息,并要求C通知身份为MA的计算机A进行通信准备操作,
④、服务器C收到计算机B的报文后,服务器C以FIA和FPA为目的地址和目的端口号向计算机A发送信息,内容包括地址FIA和端口 FPA以及MB的地址FIB和端口 FPB信息, 并要求A为地址FIB和端口 FPB进行通信准备,然后从专用存储单元中获得对应MA的FIA 和FPA并回复给计算机B,
⑤、计算机A收到服务器C的信息后,根据地址信息FIA和FIB分别探测计算机A到达其所在内网的LINUX类防火墙和计算机B的LINUX类防火墙的跳数TA和TB,如果TA+1大于TB-I,则重新探测,否则计算机A以IA和PA为源地址和端口,以FIB和FPB为目标地址和端口,以TA+1为IP报文的生存期发送UDP报文,
⑥、计算机B收到来自服务器C的包含地址FIA和端口FPA信息的报文后,向计算机A 发送UDP报文,报文以IB为源地址,PB为源端口,以FIA为目标地址,FPA为目标端口。上面所述的身份信息MA和MB是计算机A和B的名称。在步骤⑤中使用SYN+ICMP方式来探测防火墙的跳数。步骤⑥中及后续过程中,报文的生命周期采用系统默认的正常值。另一个方案中,步骤⑤为计算机A收到服务器C的信息后,以IA和PA为源地址和端口,以FIB和FPB为目标地址和端口,以2为IP报文的生存期发送UDP报文。另一个方案中,步骤④为服务器C收到计算机B的报文后,服务器C以FIA和FPA 为目的地址和目的端口号向计算机A发送信息,内容包括地址FIA和端口 FPA以及MB的地址FIB和端口 FPB信息,并要求A为地址FIB和端口 FPB进行通信准备。另一个方案中,在步骤⑤中,增加以下步骤计算机A以IA和PA为源地址和端口向服务器C发送UDP报文,报告已经为B做好了通信准备,服务器C收到计算机A的报文后, 向计算机B发送UDP报文,内容包含地址FIA和端口 FPA信息,告知计算机B,计算机A已经做好通信准备。实施例1 参见附图1,A和B是两个分属不同内网的计算机,C是A和B都可以访问到的公网上的服务器,A的内网地址是192. 168. 1. 2,名称为netl-A,B的内网地址是 10. 1. 1. 2,名称为net2-B,计算机A和B所在内网都设置有防火墙,两个内网的公网地址分别为1. 1. 1. 1和2. 2. 2. 2,服务器C的地址为3. 3. 3. 3,A和B都运行在LINUX下,并且 A、B、C中都装载有专用通信模块。当A和B需要通信时,通信模块执行以下步骤,并且在以下步骤中,A发送报文使用(192. 168. 1.2:3000)作为源地址和端口号,B发送报文使用 (10. 1. 1. 2:3000)作为源地址和端口号,C发送报文使用(3. 3. 3.3:2000)作为源地址和端口号。计算机A以其计算机名netl-A为主要内容的UDP报文发送给C,这时A外部的防火墙将(192. 168. 1. 2:3000)转换成(1. 1. 1. 1:4000)。服务器C记录A的标志码netl-A和 (1.1.1:4000),计算机B以其计算机名net2-B为主要内容的UDP报文发送给C,这时A外部的防火墙将(10. 1. 1. 2:3000)转换成(2. 2. 2. 2:5000)。服务器C记录B的标志码net2_B 和(2. 2. 2.2:5000),计算机B向服务器C发送UDP报文,查询身份为netl-A的计算机地址和端口信息,并要求C通知身份为netl-A的计算机进行通信准备操作,服务器C收到计算机B的报文后,服务器C以(1. 1. 1 4000)为目的地址和目的端口号向计算机A发送信息, 信息中包含(1. 1. 1:4000)和(2. 2. 2. 2:5000),并要求A为(2. 2. 2. 25000)进行通信准备, 然后从专用存储单元中获得对应netl-A的(1. 1. 1 4000)并回复给计算机B,计算机A根据地址信息(1. 1. 1. 1)和(2. 2. 2. 2),以SYN+ICMP方式,分别探测到计算机A到达所在内网的 LINUX防火墙和计算机B的LINUX防火墙的跳数TA和TB,如果TA+1大于TB-I,则重新探测,否则计算机A以(192. 168. 1. 2:3000)为源地址和端口,以(2. 2. 2. 2:5000)为目标地址和端口,以TA+1为IP报文的生存期发送UDP报文,计算机B收到服务器C的报文后,向计算机A发送UDP报文,报文以(10. 1. 1.2:3000)为源地址和源端口,以(1. 1. 1:4000)为目标地址和目标端口,报文的生命周期采用系统默认的正常值。以上过程就已经建立了计算机A和B之间的通信通道,两台计算机可以直接通信。实施例2 实际应用中,只有大型公司或复杂网络才有多重防火墙,多数情况下我们可以默认计算机A和B外部都只有一层防火墙,因此,在步骤⑤中,计算机A收到服务器 C的信息后,(192. 168. 1. 2:3000)为源地址和端口,以(2. 2. 2. 25000)为目标地址和端口, 以2为IP报文的生存期发送UDP报文,这可以保证报文穿过A外部的防火墙,到达不了 B 外部的防火墙,并且可以节省时间。实施例3 当C收到B的请求时,C只通知A为B做通信准备,此时并不将A的地址信息发送给B,A完成通信准备后,通知C,这时C才将A的地址信息通知B。这样做的好处是当B收到C发送过来的关于A的地址信息时,A已经为B做好了通信准备。
权利要求
1.一种穿透LINUX类防火墙建立通信的方法,该方法依赖于分属不同内网的两台计算机A和B,以及不属于A和B所在内网并且A和B可以访问到的服务器C,内网设置有LINUX 类型防火墙,其特征在于A、B、C中装载配套的通信模块,在穿透LINUX类防火墙建立A和 B之间的通信通道时,通信模块执行过程中包括以下步骤①、计算机A生成以地址IA和端口PA为源地址,地址IC和端口 PC为目的地址,内容包括A的身份信息MA的UDP报文并发送,报文穿过A外部的防火墙到达服务器C,防火墙将 IA和PA转换为FIA和FPA,服务器C记录MA以及UDP报文的源地址FIA和端口信息FPA 到专用存储单元,②、计算机B生成以地址IB和端口PB为源地址,地址IC和端口 PC为目的地址,内容包括B的身份信息MB的UDP报文并发送,报文穿过B外部的防火墙到达服务器C,防火墙将 IB和PB转换为FIB和FPB,服务器C记录MB以及UDP报文的源地址FIB和端口信息FPB 到专用存储单元,③、计算机B向服务器C发送UDP报文,查询身份为MA的计算机地址和端口信息,并要求C通知身份为MA的计算机A进行通信准备操作,④、服务器C收到计算机B的报文后,服务器C以FIA和FPA为目的地址和目的端口号向计算机A发送信息,内容包括地址FIA和端口 FPA以及MB的地址FIB和端口 FPB信息, 并要求A为地址FIB和端口 FPB进行通信准备,然后从专用存储单元中获得对应MA的FIA 和FPA并回复给计算机B,⑤、计算机A收到服务器C的信息后,根据地址信息FIA和FIB分别探测计算机A到达其所在内网的LINUX类防火墙和计算机B的LINUX类防火墙的跳数TA和TB,如果TA+1大于TB-I,则重新探测,否则计算机A以IA和PA为源地址和端口,以FIB和FPB为目标地址和端口,以TA+1为IP报文的生存期发送UDP报文,⑥、计算机B收到来自服务器C的包含地址FIA和端口FPA信息的报文后,向计算机A 发送UDP报文,报文以IB为源地址,PB为源端口,以FIA为目标地址,FPA为目标端口。
2.根据权利要求1所述的一种穿透LINUX类防火墙建立通信的方法,其特征在于所述的身份信息MA和MB是计算机A和B的名称。
3.根据权利要求1所述的一种穿透LINUX类防火墙建立通信的方法,其特征在于步骤⑤中使用SYN+ICMP方式来探测防火墙的跳数。
4.根据权利要求1所述的一种穿透LINUX类防火墙建立通信的方法,其特征在于步骤⑥中,报文的生命周期采用系统默认的正常值。
5.根据权利要求1所述的一种穿透LINUX类防火墙建立通信的方法,其特征在于步骤⑤为计算机A收到服务器C的信息后,以IA和PA为源地址和端口,以FIB和FPB为目标地址和端口,以2为IP报文的生存期发送UDP报文。
6.根据权利要求1或5所述的一种穿透LINUX类防火墙建立通信的方法,其特征在于 步骤④为服务器C收到计算机B的报文后,服务器C以FIA和FPA为目的地址和目的端口号向计算机A发送信息,内容包括地址FIA和端口 FPA以及MB的地址FIB和端口 FPB信息,并要求A为地址FIB和端口 FPB进行通信准备。
7.根据权利要求6所述的一种穿透LINUX类防火墙建立通信的方法,其特征在于在步骤⑤中,增加以下步骤计算机A以IA和PA为源地址和端口向服务器C发送UDP报文,报告已经为B做好了通信准备,服务器C收到计算机A的报文后,向计算机B发送UDP报文, 内容包含地址FIA和端口 FPA信息,告知计算机B,计算机A已经做好通信准备。
全文摘要
一种穿透LINUX类防火墙建立通信的方法,涉及计算机网络通信领域,特别是配置有LINUX防火墙的两个计算机内网之间的通信,该方法依赖于分属不同内网的两台计算机A和B,以及不属于A和B所在内网并且A和B可以访问到的服务器C,内网设置有LINUX类型防火墙,在通信建立过程中,设置报文的生命周期,避免防火墙形成对称型NAT,从而建立A和B之间的通信通道。
文档编号H04L29/06GK102546588SQ20111038448
公开日2012年7月4日 申请日期2011年11月28日 优先权日2011年11月28日
发明者程朝辉, 陈立人 申请人:深圳市华信安创科技有限公司