NAT穿越(共7篇)
NAT穿越 篇1
摘要:采用“打洞”穿越锥型NAT与使用端口预测穿越对称型NAT相结合的方法,成功穿越了各种NAT,解决了对等联网下NAT的穿越问题。该方案既无需改变现有网络设备,又能确保内网的安全性,同时还解决了目前穿越方式存在的只能穿越部分类型的NAT、丢包、延时的问题。
关键词:P2P,NAT,分类,类型检测,穿越
在迅猛发展的互联网中,网络地址转换NAT(Network Address Translator)技术有效缓解了网络之间互连协议IP(Internet Protocol)地址短缺的问题,同时也对内网安全起到了很好的保护作用。对等网络P2P(Peer to Peer)流媒体技术被广泛用于电子商务、网络电视、远程教育、在线直播、实时视频会议、网络视频广告、视频点播、远程医疗等。NAT用于实现内外网客户端间的访问,但多数情况下内外网客户端无法实现直接访问[1],因此实现内外网客户端间的对等互访必须解决信息包穿越NAT的问题。
1 NAT
NAT是一个互联网工程任务组IETF(Internet Engineering Task Force)标准,它将只能在私网中使用的内网IP地址通过与少量的公网IP地址建立映射关系,实现内网客户端对互联网的访问。当内网客户端需要访问Internet时,NAT将信息流中的内网IP地址修改为可以在Internet上路由的公网IP地址,从而实现内网客户端与外网客户端之间的通信,同时建立内网地址与外网地址间的映射关系表。同样,当外网客户端需要与内网客户端通信时,NAT对照建立的映射表,把经过信息流中的IP地址修改为与其对应的内网IP地址发往内网客户端[2]。NAT缓解了公网IP地址的短缺,使私网地址得以复用,同时加强了内网安全性。
2 NAT的分类及特点
UDP(User Datagram Protocol)是用户数据包协议,IETF制定了UDP数据包穿越NAT的简单协议STUN(Simple Traversal of UDP over NATs),它将NAT分为4类,即:完全锥型NAT,地址受限锥型NAT,端口受限锥型NAT和对称型NAT。
(1)完全锥型NAT:当内网的客户端A连接外网客户端时,NAT会为其分配一个端口,此后外网所有发到这个端口的UDP数据包都可以到达内网客户端A。
(2)地址受限锥型NAT:当内网的客户端A连接外网的客户端B时,NAT会为其分配一个端口,此后B可以用任何端口与A通信,但其他的外网客户端则不能与A通信。
(3)端口受限锥型NAT:当内网的客户端A连接外网的客户端B时,NAT会为其分配一个端口,此后B只能用此端口与A通信。B用其他端口或其他客户端均不能与A通信。
(4)对称型NAT:与前三种锥型NAT不同,对称型NAT内网客户端在连接外部客户端时随连接的目标不同分配的端口也将发生改变,或者说当内外网客户端连接时,内网客户端分配到的IP地址和端口、外网客户端分配到的目标IP地址和端口,其中任一项发生改变,都会引起连接路径将随之改变。
3 NAT类型的检测
不同类型的NAT在端口分配和映射记录等细节上差异很大,其穿越方法也有所不同,因而穿越NAT前需要对NAT的设备类型进行检测[3,4],NAT类型检测流程如图1所示。
检测方法步骤为:
(1)客户端向服务器的IP1:Prot1发送源地址的请求包,其中有包的源地址IP3:Port3。若客户端的地址为IP0:Prot0,比较IP0:Prot0与IP3:Port3是否相同,若相同,则客户端前没有NAT;否则转步骤(2)。
(2)客户端向具有两个公网IP地址(IP1、IP2)和两个端口(Prot1、Prot2)的服务器依次发起4次连接,即IP1:Prot1、P1:Prot2、IP2:Prot1、IP2:Prot2,每次连接都能从服务器返回的数据包中找到客户端经过NAT转换后的映射关系。比对客户端相邻两次连接请求所分配的端口号,并计算端口的增量,如果无增量,则NAT为锥型NAT,转步骤(3);有增量则为对称性NAT,转步骤(5)。
(3)客户端再向服务器端IP1:Prot1发送报文,要求使用IP2:Prot1回复。如果收到回复,则说明该NAT类型是完全锥型NAT;如果请求若干次都收不到响应消息,则不是完全锥型NAT,转步骤(4)。
(4)客户端再向IP1:Prot1发送消息,要求用IP1:Prot2回复,如果收到回复,则说明该NAT是地址受限锥型NAT,如果发送若干次请求消息都没有收到响应消息,则说明该NAT是端口受限锥型NAT。
(5)如果每次的增量均相同,则为增量型NAT;如果增量不同,则为随机型NAT。
4 NAT的穿越方案
按照映射关系中端口的变化将NAT分为锥型NAT和对称型NAT,其中锥型NAT包括完全锥型、地址受限锥型、端口受限锥型3种。锥型NAT的映射与目的地址无关,即源地址相同映射就相同;而对称型NAT的映射则同时关联源地址和目的地址,穿越过程相对复杂[5]。
4.1 锥型NAT的穿越
锥型NAT使用已经成熟的UDP“打洞”技术[6,7],即利用STUN服务器得到客户端的映射地址,当双方需要通信时,可以通过服务器的配合获取对方的地址和端口,建立P2P直连。客户端A与客户端B的连接如图2所示。
客户端A与客户端B通信穿越的步骤为:
(1)通信时NAT A将客户端A的内网地址和端口转换为NAT A的外网地址和端口,并建立映射关系。同样NAT B也将客户端B的内网地址和端口转换为NAT B的外网地址和端口,建立映射关系。
(2)客户端A通过服务器S向客户端B发出连接请求。服务器S向客户端A、B发送对方的NAT映射地址,即外部地址。
(3)客户端B收到客户端A的外部地址后,将A的外部地址作为目的地址发送UDP数据包“打洞”,该数据包使B端网络的NAT设备允许后续的、以A端地址为源地址的UDP数据包进入其内部网络。形象地称B向A打了一个“洞”。
(4)客户端A收到客户端B的外部地址后,以B的外部地址为目的地址发送探测UDP数据包,同样该数据包也在A端网络的NAT设备上建立对应映射。
(5)客户端B收到客户端A的探测数据包后,向A发送确认数据包,A、B就此建立UDP连接。
4.2 对称型NAT的穿越
STUN协议不能穿越对称型NAT,原因是对称型NAT的映射关系是由源地址、源端口、目的地址、目的端口共同决定的,如果其中一方发生变化,则映射关系也将改变。如对称型NAT内网的客户端与外网不同的客户端发生连接时,其分配的端口号会不同,相应地映射关系也就不一样。因此,发生连接时NAT会为不同的目标节点分配新的端口号,这与其先前在服务器上建立映射关系时使用的端口号不同,发送方无法得知向接收方发送数据包时NAT所分配的新端口号,因此也就不能完成连接。正是由于对称型NAT相对于锥型NAT映射关系要复杂得多,因而其安全性更高[8,9,10],更适合对安全性要求高的企业使用。
本文是在对目前使用的各种NAT穿越方法认真比对后,通过对NAT及其穿越原理的细致分析研究,给出了使用预测端口的方法穿越对称型NAT。该方法将对称型NAT分为增量型NAT和随机型NAT两类。
对称型NAT对每次的连接要求为“源IP、源端口、目标IP、目标端口”的顺序在NAT映射表中找匹配项,若没有找到完全匹配项,则按新连接对待并为其分配新端口号。对于增量型NAT,新端口号的分配原则是在前次分配的端口值上增加一个固定值进行分配,如前次分配的端口号为P,则新端口号就为P1=P+n(n为整数)。对于随机型NAT,新端口号的分配原则是在前次分配的端口值上增加一个在一定端口(1024,65535)范围内的随机量进行分配,如前次分配的端口号为P,则新端口号就为P1=P+n(n为某一范围内随机整数)。客户端获取新的端口后连接过程类似于STUN协议,如NAT A、NAT B都为对称型NAT,客户端A与客户端B通信的具体穿越步骤如下(可参见图2):
(1)客户端A(或B)向具有两个IP地址IP1、IP2,两个端口Prot1、Prot2的服务器S依次发起4次连接,即IP1:Prot1、IP1:Prot2、IP2:Prot1、IP2:Prot2,每次连接都能从服务器S返回的数据包中找到客户端A(或B)经过NAT转换后的映射关系。比对客户端A(或B)相邻两次连接请求所分配的端口号,计算端口的增量,如果每次的增量都相同,则获得固定增量,转步骤(2),如果增量不同,则为随机增量,转步骤(6)。
(2)客户端A将从NAT A上获得的增量发送给服务器S并通知S与B的连接请求,服务器S通知客户端A、B的连接请求,并发送客户端A的预测地址给客户端B。
(3)客户端B通过端口映射,把从NAT B上得到的预测增量由服务器S发送给A,客户端A向B的预测地址发送连接请求,报文穿越NAT A建立来自B的映射规则。
(4)由于客户端B向客户端A的预测端口发送信息包前在NAT A上已经建立了映射,因而客户端B的连接请求能直接通过。
(5)客户端A获得连接请求后发送确认包,建立了客户端A与B间的直接通信,也就不再需要服务器S。
(6)NAT A对新连接端口分配是随机变化的,两次之间的变化量为△t(△t为整数),虽然△t值都是由NAT设备通过某种方式随机选择的,但通常每次分配的端口号之间都会具有一定的函数关系或是统计上的相关性,这主要取决于具体的设备和网络环境。如客户端A发生新的连接时,NAT A为其分配新的端口号P1,假定NAT A为客户端A上次连接分配的端口号为P,则必然存在P1=P+△t,△t=f(P)。通过在多种网络条件下的测试和分析,也证实了多数情况下存在具有某种特征的分布特性值△t。因此,可以通过其分布特性来预测△t所属范围,并对该范围端口进行试探,以实施穿越。
4.3 NAT穿越中“打洞”方的确定
若内网客户端A对应的NAT与客户端B对应的NAT类型不同时,选择由客户端A“打洞”或选择由客户端B“打洞”其穿越算法、复杂度、难度等也都不同。通过对不同类型NAT穿越中选取不同方“打洞”的实验分析,给出确定“打洞”方的方法,以降低算法的复杂度,提高穿越质量[11]。
若NAT类型一方是锥型,另一方是对称型时,由锥型一方“打洞”;若一方为完全锥型,另一方为地址受限锥型或端口受限锥型,则由完全锥型一方“打洞”;若一方为地址受限锥型,另一方为端口受限锥型,则由地址受限锥型一方“打洞”;若双方都是对称型NAT,且一方为增量型,另一方为随机型,则由增量型一方“打洞”。
对称型NAT越来越多地被应用于安全性要求较高的企业网中。本文提出的端口预测法是穿越对称型NAT很有效的方法,该方法克服了STUN无法穿越对称型NAT的缺陷,且保持了STUN方式无须改动现有的NAT设备、协议简单等特征,同时还解决了目前穿越对称型NAT方案中存在延迟和丢包的问题。提高了信息的安全性,节省了财力、物力、人力,具有很好的应用前景。
参考文献
[1]陈明东.OpenH323网络视频会议中微量化穿越技术研究[J].计算机与现代化,2012,(2):120-123.
[2]朱光,张云华,卢娟.基于ICE的VOIP穿越NAT方案研究[J].计算机应用与软件,2011,28(10):222-224.
[3]彭李超,谭兵.基于STUNT的Symmetric NAT穿越[J].微计算机应用,2010,31(10):32-35.
[4]黄桂敏,朱晓姝.基于UDP协议穿透NAT设备的对等网络模型研究[J].计算机工程与设计,2010,31(2):317-320.
[5]ROSENBERG J,WEINBERGER J,HUITEMA C.et al.STUN-simple traversal of UDP(User Datagram Protocol)through NATs(Network Address Translators)[C].RFC3489.March2003.
[6]WG M,TAKEDA Y.Symmetric NAT traversal using STUN[S].IETF,2003.
[7]李航,马林华.音视频穿越IP NAT技术的实现[J].通信技术,2008,41(13):65-68.
[8]畅巨峥,汪滢,王庆辉.利用ICE实现VOIP媒体流穿越[J].计算机应用技术,2010(6):105-108.
[9]刘娟娟,陶加祥.一种基于第三方服务器的P2P穿透NAT的实现方法[J].软件导刊,2010,9(1):121-123.
[10]王秀欣,戚宇林,王鼎.基于NATT协议的NAT穿越技术的设计与实现[J].电力系统通信,2009(4):65-68.
[11]孙名松,段志鸣.混合式P2P网络UDP下NAT穿越方案的研究与设计[J].计算机与数字工程,2010(4):104-107.
一种无服务器NAT穿越技术 篇2
1 主要的NAT穿越技术
目前主要的NAT穿越技术包括代理穿越, 反向连接以及UDP打洞技术。
1.1 代理穿越
代理穿越通过服务器把通信构建成类似于标准C/S的通信模式。假设拥有一台已知的位于公网的服务器S, 以及分别位于不同NAT私网中的Client A与Client B, A、B已经分别与S建立C/S通信。由于A、B各自的NAT会阻止其它Client直接与其建立连接, 由此导致A、B无法直接建立通信连接。因此A、B通过S作为代理服务器为其传递信息, 以达到通信的目的。
1.2 反向连接
反向连接技术只适用于一种情况, 即想要建立连接的两终端, 只有一个终端处于NAT私网中, 另一个终端则处于非NAT私网中, 如果处于非NAT私网中的终端想要主动与NAT私网下终端建立连接, 则需要使用反向连接技术。设Client A处于NAT私网中, 而Client B不在NAT私网中。如果B向主动发起一个与A的连接通信, B只能将连接请求消息传递给已知公网服务器S, 由S将B的连接请求转发给A, 让A收到消息后主动向B发起一个“反向”的连接请求。
1.3 UDP打洞技术
UDP打洞技术是目前较为有效的NAT穿越技术[6]。它通过位于公网的服务器使两个终端建立起直接的端对端会话。分别位于不同NAT下的Client A和Client B想要建立连接, 可以先与位于公网的服务器S建立连接, 建立连接的同时S记录了A、B各自NAT分配给它们的公网地址信息。如果A想与B建立连接, 可以向S发送请求, S将B的地址信息反馈给A, 同时将A的连接请求转发给B。A收到B的地址信息, 向B发送一连串的UDP请求;B收到S转发的消息后也主动向A发起一连串连接请求, A、B都在各自的NAT上打了“洞”。A、B均能穿越对方的NAT建立直接连接。此后A、B的通信将不再依赖服务器S, 实现了直接的端对端通信。
可以看出, 它们都需要一台位于公网的固定终端充当服务器用于帮助通信的建立。而固定服务器的单点失效, 负载过大等问题都会直接影响通信的顺利进行, 为此, 需要设计一种无服务器的NAT穿越技术, 来解决上述问题。
2 无服务器NAT动态穿越技术
由于UDP打洞技术需要一台位于公网的固定终端充当服务器用于帮助通信的建立。而固定服务器的单点失效, 负载过大等问题都会直接影响通信的顺利进行, 为了缓解打洞技术中服务器给P2P通信带来的潜在影响, 设计了新的通信协议DNA (Dynamic NAT based on ALM) , 在DNA中没有专门设置固定的公网服务器, 而把服务器的功能集合到了所有参与通信的终端中, 使参与通信的终端能够判断出自身所处的网络环境, 根据所处网络环境识别并保存其它成员终端的地址信息, 在参与通信的同时都可以帮助其它内网终端之间实现“打洞”并建立通信。
2.1 设计原理
通过对NAT特点的分析, 设计出了远程终端地址信息判断算法和无服务器UDP打洞算法来解决NAT对于实现ALM通信的两个阻碍。
1、远程终端地址信息判断算法
由于NAT私网终端对外网终端是不可见的, 外网终端都无法识别处于NAT下私网终端的正确地址信息, 因此无法主动向其发送连接请求以建立通信连接。
为了实现该功能, DNA协议中设计了判断终端处于私网或公网网络环境信息的算法。终端C1向另一终端C2发送连接请求, 在该连接请求消息中包含了C1识别的自身地址信息, C2收到该连接请求后, 一方面通过Socket解析得到C1的地址信息, 另一方面可以从连接请求消息中得到C1的另一个地址信息。处于NAT下的终端连入因特网, NAT都会给它分配一个公网上的合法网络地址, 与该终端在NAT私网下的地址不同, 因此C2通过对C1的两个地址信息的比较得出自身处于公网或私网的网络环境信息, 并根据自身所处的网络环境判断出收到的两个关于C1的地址信息中, 哪一个是私网地址信息, 哪一个是公网地址信息, 然后将两个地址信息都存入到C2的Member List (成员列表) 中。最后向判断出的C1公网地址发送响应消息, 在该响应消息中包含了C2识别的自身地址信息, 以及C2的网络环境信息。同样C1得出C2的公网、私网地址信息并存入C1的Member List。当C1、C2与其它终端建立连接后, 也会将其它终端的地址信息存入Member List, 因此参与通信的终端都能保存所有参与通信终端地址信息。
2、无服务器UDP打洞算法
由于NAT阻止外网终端主动访问私网终端, 会自动丢弃来至外网的连接请求信息, 外网终端无法与NAT下的私网终端成功建立连接。因此想要与NAT下的私网终端建立连接, 则必须由NAT下的私网终端主动向外网终端发送连接请求。
为此, 每台参与通信的终端都拥有一个Pending List。目的是暂时保存还未建立连接的远程终端的地址信息。当通信中的某一终端Member List更新 (有新的终端与其建立了连接) 后, 会主动向其Member List中的所有成员发送更新后的Member List, 收到更新消息的终端会将该Member List中的成员与自己Member List中的成员比较, 如果发现自身Member List中没有的成员, 则将该成员的信息存入自己的Pending List并向Pending List中的成员持续发送连接请求信息。同理, 其它的终端也会将新发现的终端地址信息存入自己的Pending List, 并主动向其发送连接请求。于是未建立连接的双发都主动向对方发送连接请求, 双方NAT上都为通信打出一个“洞”, 消息都能顺利穿越对方NAT建立通信。双方建立连接后, 将对方的信息从自身Pending List中删除并存入Member List。由此, 想要加入通信的终端只需要向任意一台位于公网的终端发送连接请求, 就能成功建立通信。
通过以上两点设计, 想要建立通信的终端均可以向参与通信的终端发送连接请求, 且均能成功建立通信, 而每个参与通信的终端都同时具备客户端和服务器的功能。
2.2 通信协议设计
DNA协议中设计了五种通信消息和三类列表以帮助穿越算法的实现。五种消息分别是:Connect request message、Reply message、Update message、Heart beat message和Quit message。这五种消息构成了整个通信的实现流程。三类列表为:Local List、Member List和Pending List。每台参与通信的终端都同时设置了这三类列表, 以帮助终端间通信的建立和维护。其中, Local List用以保存本地终端自身的信息;Member List用以保存已经与本地终端建立连接通信的所有远程终端信息;Pending List用以保存识别到的但还没有建立通信连接的远程终端信息。下面以节点终端A、B之间通信为例, 说明DNA协议的具体实现流程。
1、Connect request message, A主动向B发送Connect request message之前会先将能识别的自身的一部分信息存入自己的Local List中。如果A已经与其它节点建立连接, 那么A有可能识别到自身的网络环境信息, 并将其存入Local List中。然后A直接从自身的Local List中提取出Connect request message需要的所有A的信息, 包含在Connect request message中发送给B。
B接收到A发送来的Connect request message, 先判断A的信息是否存在于自己的Member List中如果存在则直接忽略该消息, 如果不存在则B就根据该消息中的内容判断自己的Mark值, 并更新自己的Local List。同时, 判断A的Mark值, 并最终通过“远程终端地址信息判断算法”判断出A的私网地址信息和公网地址信息。最后, B将A的信息存入自己的Member List中。
2、Reply message, B收到A的Connect request message, 判断出A的地址信息后, 向A发送Reply message。A收到B的Reply message后, 得知自己和B的Mark值, 更新A的Local List。同样也采取“终端地址信息判断算法”判断出B的公网地址信息和私网地址信息, 并将B的信息存入自己的Member List中。A、B间正式建立起通信连接。
3、Update message, 如果A与其它新的节点终端C建立了通信连接, 则A将该终端的信息加入自身的Member List中, 此时A的Member List被更新, 于是A将更新后的Member List发给与其相连的所有远程终端 (此时为B和C) , 该消息即为Update message。远程终端收到A的Update message后, 提取出Update message中包含的Member List信息, 并与自身Member List中的信息对比, 如果发现新的成员终端信息, 于是将该成员终端信息放入Pending List中, 然后向Pending List中的终端持续发送Connect request message, 这一过程就能实现终端之间主动发送Connect request message完成NAT上的“UDP打洞”, 建立起与其它终端的通信连接。所有参与通信会议的终端之间都会建立起两两连接, 相互之间都可以进行直接的ALM通信。
4、Heart beat message, 由于DNA协议设计以UDP打洞技术为实现基础, 那么根据UDP协议不可靠传输的特点, DNA协议中专门设置了Heart beat message。终端会间隔一定的时间 (要小于NAT设备设置的空闲时间值) 向与Member List中的终端发送Heart beat message, 以表示其运行状态正常。
收到Heart beat message的终端, 会根据Heart beat message中的ID号 (通信会议中每个终端的ID号唯一, DNA协议以ID号来识别终端) 在自己的Member List中找到相应的终端信息, 并更新该终端的Timer值。如果超过一定的时间没有收到某一相连终端的Heart beat message, 即Timer超过一定时间没有更新后, 则判断该远程终端失效, 于是将该终端相应的信息从Member List中删除, 不再向它发送通信数据并断开连接。
3 实验及结果
我们在实验室利用8台PC机来构建网络环境, 其中6台设置为通信系统终端, 2台用于设置虚拟NAT设备, 搭建了实验测试所需的公网、私网网络环境, 真实布置了NAT的Internet网络结构的三种情况:网络中布置一个NAT构成一个内外网环境、网络中布置两个NAT构成两个不同内网和外网的环境、网络中布置了两个NAT构成一个多层NAT的内外网环境。实现一个简单的通信系统, 用于验证NAT穿越的功能。另系统对于IP地址的分配方式没有特殊要求, 既可以采用静态IP地址, 也可以采用动态IP地址。具体测试内容、测试步骤、预期结果以及实际结果见表二。
1、布置一个NAT构成内外网环境
由于整个网络环境都是基于实验室的内部网络环境构成的, 因此网络结构中给外网终端分配了实验室的内网IP地址, 为192.168.0.1~192.168.0.255地址段。如图2, PC1、PC2、PC3都分配了外网终端IP地址, 并给PC7也分配了外网终端IP地址192.168.0.79, 同时在PC7上配置以NAPT方式运行的虚拟NAT设备。该NAT下内部网络分配的地址段为192.168.16.1~192.168.16.255。图中PC4、PC5和PC6都处于该NAT管理下的内部网络中。
2、布置两个NAT构成外网和两个内网环境
如图3, PC1、PC2和PC3仍然设置为外网终端, 与PC7和PC8一样分配外网终端IP地址。PC7的设置不变, 仍然为虚拟NAT设备, PC4处于该NAT管理的内部网络中。另外增加一台PC8构建第二个虚拟NAT设备, 其内部网络分配地址段为192.168.10.1~192.168.10.255, PC5和PC6处于该NAT管理的内部网络中。这样就形成了两个不同的内网及一个实验室外网构成的网络环境。
3、布置两个NAT构成多层内外网环境
多层NAT网络结构即是在NAT管理的内部网络中再放置一个NAT设备, 从而形成内网中的内网。具体布置如图4。PC1、PC2、PC3和PC7分配了外网终端IP地址。仍然在PC7上设置虚拟NAT设备, 在此将PC8放置在PC7虚拟NAT设备形成的第一层内部网络中, 分配IP地址为192.168.16.111。然后, 再把PC8配置成一个虚拟NAT设备, 形成第二层内部网络, 分配地址段为192.168.8.1~192.168.8.255, 将PC4、PC5和PC6放置到这个内部网络中。从而, PC4等终端相对于位于外网的PC1等终端而言, 是处于两层NAT后的内部网络中, 因此要实现它们之间的连接就必须穿越两层NAT设备。
可以看出, 采用DNA协议实现NAT穿越, 系统不需要检测网络环境是否具有多层的NAT结构, 均能成功的建立通信连接, 发送并接受消息, 并不需要任何其它的措施, 证明了DNA网络协议的有效性。同时从以上各种连接情况可以看出, 终端想要加入会议, 可以向会议中任意公网终端发送连接请求加入, 也可以向位于同一私网的终端发送连接请求加入, 因此缓解对公网固定终端的依赖性, 分散通信压力。
4结论
由于目前穿越NAT实现内外网通信都需要一台位于公网的固定服务器作为通信建立的媒介, 一旦该服务器失效, 内外网通信将无法进行。因此本文通过设计新的通信协议DNA, 并对DNA协议做了简单的测试, 能够在不需要固定公网服务器的情况下成功实现NAT穿越, 建立内外网终端的通信, 扩大了内外网通信建立的可行性, 同时也增强了内外网通信建立的稳定性。
参考文献
[1]郑纬民等.对等计算研究概论[J].中国计算机学会通讯, 2005, 1 (2) :1-21.
[2]El-Sayed A, Roca V, Mathy, L.A survey of proposals for an alternative group communication service[J].IEEE Network, 2003, 17 (1) :46-51.
[3]叶保留等.应用层组播研究进展[J].计算机科学, 2005, 32 (6) :6-10, 53.
[4]Rosenberg, J, Weinberger J, Huitema C, Mahy R.STUN-Simple Traversal of UDP Through NATs[EB/OL].IETF RFC 3489, Mar 2003.http://www.rfc-editor.org/rfc/rfc3489.txt.
[5]Yang-Hua Chu, Sanjay, Sanjay G.Rao, Srinivasan Seshan, Hui Zhang.A Case for End System Multicast[J].IEEE Journal on Selected Areas in Communications, 2002, 20 (8) :1456-1471.
[6]BryanFord, PydaSrisuresh, DanKegel.Peer-to-Peer Communication across Network Address Translators[C].Proceedings of the 2005 USENIX Annual Technical Conference, 2005:179-192.
NAT穿越 篇3
IPSec(IP Security)[1]协议作为一种重要的安全技术已经在互联网中得到了广泛应用。IPSec对报文的保护通过AH(Authentication Header)和ESP(Encapsulating Security Payload)两个安全协议实现。NAT[2]技术将传入数据报和外发数据报中的地址和端口进行转换,缓解了IPv4地址不足的问题。解决了在不需要为网点中的每台计算机都分配全球有效IP地址的情况下,在网点中的主机都可通过地址转换访问因特网。然而,IPSEC和NAT技术不兼容。如果同时使用IPSec和NAT技术,NAT会修改IPSec包的源和目的地址以及端口号,进而破坏IPSec报文的完整性[3]。
1目前的解决方法
为了解决IPSec和NAT不兼容的问题,IETF(Internet Engineering Task force)提出了RSIP[4]解决方案。RSIP方案设置了RSIP服务器和RSIP网关。这样,当内部与外部通信时,RSIP网关转发出去的报文是以内部主机在RSIP服务器上申请的IP地址为源地址的报文。RSIP方案解决了NAT与IPSec不兼容的问题,但是它也存在缺点:
(1)要求IPSec设备实现RSIP的客户端协议。在IKE重建密钥时,需修改IKE的源端口,所以可能会引起无法与现有的IPSec设备协同工作的问题。
(2)将NAT网关部署成RSIP网关,耗费大。Ari Huttunen[5]提出了用UDP封装IPsec ESP包的方法。
UDP封装首先在IKE协商的第一阶段检测通信双方间是否存在NAT转换,如果存在,则将原IPSec包完全封装在一个UDP包中,传送给接收方。接收方接到报文后去掉UDP头后还原IPSec包。这样封装后的数据包成为一个普通的UDP数据包,可以进行NAT转换。该方法不修改NAT设备,部署比较容易,但它也存在不足:同一NAT后的不同主机,在使用传输模式时有可能发生冲突。
2新的解决方法
综上分析可知,RSIP解决方案部署困、难耗费大,难以与现有的IPSec设备兼容;Ari Huttunen提出的用UDP封装IPSec ESP包的方法在传输模式下无法区别同一NAT后的不同主机,不能避免冲突的产生。两种方法不能同时满足即部署容易又可以有效避免在传输模式下的冲突的要求,严重阻碍着IPSec和NAT协同工作的进一步发展。为此,本文提出了一种新方法。该方法结合了RSIP解决方案和Ari Huttunen提出的用UDP封装IPSec ESP包的方法的优点,有效解决IPSec和NAT的冲突问题。
设计思想如下:
(1)用UDP包封装整个IPSec包,引入session,用来传递原始IP和端口信息。这样不管是在传输模式还是隧道模式,当NAT改变外部IP头后,均可根据sesssion所提供的信息识别原始的IP地址。在对端(IPSec接收端)去掉外部IP头和UDP头后,就可以识别原始IP地址发送的数据。
(2)引入MARK,用来标识IKE数据包和IPSec数据包。如果数据包为IKE数据包,则MARK=1;如果数据包为IPSec数据包,则MARK=0。
(3)通信主机的发起端发送IKE探测报文NAT-D(NAT-Discovery),确认通信双方间是否存在NAT。在IKE协商的第一阶段,通过交换Verdor ID确认通信双方是否支持NAT穿越。如果不存在NAT,则进行IPSec通信;如果存在NAT,但不支持NAT穿越,则无法正常通信;如果存在NAT且支持NAT穿越,则采用图一的报文封装格式——改进的UDP封装格式进行通信。
(4)通信模式支持传输模式和隧道模式。
(5)IKE协商的第二阶段,通过安全联盟SA(security association)协商通信的模式以及报文封装的格式。
(6)内部主机发送存活时间保持包,保持NAT映射,通信对端丢弃存活时间保持包。
3实现
(1)session头长度为6B,采用C语言描述如下:
在Session发现阶段,封装载荷的格式中包含TAG_VALUE字段,我们将它的最后6个字节指定为内部IP地址和port号。在传输模式中,IPSec报文中不含内部IP头,这样我们就可以通过TAG_VALUE字段识别内部IP地址,进而可以解决同一NAT后不同主机在使用传输模式时有可能发生冲突的问题。
(2)通信流程。
试验组网图如图2所示。防火墙A连接内部主机,防火墙B连接外部主机,防火墙A和防火墙B做IPSec报文安全传输,防火墙C做NAT转换。
①内部主机INNER PC向外部主机OUT PC发送数据,在防火墙A和防火墙B之间建立IPSec,在IKE协商的第一阶段通过交换Vendor-ID报文确认双方是否支持NAT穿越。
②通过NAT发现报文确认内部主机与外部主机进行通信时是否经过了NAT转换。
③在IKE协商的第2阶段通过SA协商通信模式,确认采用传输模式或隧道模式。
④内部主机与外部主机通信时,数据包经过防火墙A先进行IPSEC封装,SESSION封装载荷的TAG_VALUE字段后6个字节设置为发送端的IP地址和PORT号。设置MARK域为1,同时进行UDP封装。
⑤数据包经过NAT网关Firewall C到达外部主机时,源IP地址为NAT网关地址,目的地址为外部主机地址,源端口被修改。防火墙B去除外层IP报头和UDP报头,数据包送往IPSEC层,根据MARK域区分IKE包和IPSEC包,进行相应处理。
⑥外部主机OUT PC与内部主机INNER PC通信。首先,报文进行IPSEC封装,源地址为防火墙B的IP地址,目的地址为内部主机,SESSION封装载荷的TAG_VALUE字段后6个字节设置为Firewall B出口的IP地址和PORT号。设置MARK域为1,同时进行UDP封装。目的地址为NAT网关地址,目的端口为防火墙A出口的原始源端口经NAT改变后的端口号,设置标志位。
⑦内部主机接收到报文后,去除外层IP报头和UDP报头,后续的处理过程同内部主机与外部主机通信
⑧内部主机定期发送保持NAT映射保持报文,外部主机丢弃收到的保持激活报文。
4应用模式分析
4.1传输模式分析
在传输模式下,对于图4的拓扑结构,采用Ari Huttunen提出的封装方法,由于发送端的IP地址经过NAT设备进行了转化,因此服务器无法区分包到底是来自A还是B的。
采用改进的UDP封装方法能够解决上述问题,具体步骤如下:
(1)PC A和PC B向服务器发送两个NAT发现报文,前一个是服务器的地址和端口的HASH值,后一个是自己的地址和端口的HASH值。HASH值的计算方法如式1所示。CK-S和CK-R是发送方和接收方的cookie。
HASH=HASH(CK-S|CK-R|IP|PORT) (1)
服务器收到NAT发现报文后重新根据收到包的实际地址(即PC A和PC BJ经过NAT转换的公网地址)端口来计算HASH值进行比较,发现HASH值不同,据此判断PC A和PC B进行了NAT转换。
(2)同一NAT后面的不同主机PC A和PC B对应的内部IP地址是唯一的。通过Session的TAG_VALUE字段能够判断内部主机的IP地址和端口号,以此区分来自PC A和PC B的会话。
4.2隧道模式分析
对于隧道模式,采用改进的UDP封装方法,数据包经过NAT设备后,只修改外部IP头和UDP头中的数据。内部IP头只是IPSec报文的一部分,在接收端按顺序进行解封装,就能还原原始数据包。
5可行性分析
本方法通过UDP封装数据包,加入Session,保护了原始IP地址和端口信息,避免了IPSec和NAT的冲突,能解决IPSec和NAT不兼容的问题。本方法不改变NAT设备,易于实现并且支持IPSec的所有模式。
6优缺点分析
表1为NAT穿越方法比较。如表1所示,相对于RSIP方法,本方法不仅具有能使NAT与IPSEC协同的优点,而且更易于部署和实现;相对于UDP封装IPSec ESP数据包方法,本方法虽然增加了载荷长度,但是却可以支持IPSec的所有模式。
7结束语
IPSec和NAT冲突的问题影响了IPSec的正常通信。本文提出方法的可有效解决IPSec和NAT不兼容的问题。同时,改进的UDP封装方法支持IPSec的所有模式,更容易部署和配置。该方法层次清晰,形式简单,使得该方法很值得推广应用。
摘要:提出了一种改进的方法,用以解决IPSec和NAT的冲突问题。该方法引入了标识域和会话域。IPSec接收端通过会话域中载荷的TAGVALUE的后6个字节来识别源IP地址和端口信息,通过标识域识别IKE报文和IPSec报文。报文对NAT是透明的。实验证明该方法能很好地解决在传输模式下多用户接入的问题而且方便实现。
关键词:Internet协议安全,网络地址转换,NAT穿越,Internet密钥交换协议
参考文献
[1]Naganand Doraswamy.IPSec:新一代因特网安全标准[M].北京:机械工业出版社,2000.
[2]Douglas E.Comer.用TCP/IP进行网际互连(第五版)[M].北京:电子工业出版社,2007.2
[3]Donoho D.Denoising by Soft-thresholding[J].IEEE Transactions on Information Theory,1995,41(3):613-627
[4]BorellaM,GrabelskyD.Realm specific IP:protocol specifica-tion[EB/OL].2001-10[2005-11].http://tools.iet.f org/html/rfc3103.
P2P通信穿越NAT技术分析 篇4
1 转发 (Relaying)
最可靠但又是最低效的点对点通信方法, 莫过于是将P2P网络通信看作一个C/S结构, 通过服务器来转发信息。假设两个客户主机A和B均与一个服务器S (18.181.0.31:1234) 发起了TCP或者UDP连接, 如图1所示, 服务器S具有公网固定IP地址, 两个客户端分布在不同的私网中, 这样, 它们各自的NAT代理服务器将不允许它们进行直连。取而代之的方式是, 两个客户端可以把服务器S当作信使来转发消息。比如, 为了将消息发送到B, A先发送一条信息给服务器S, 服务器S再利用初始化时已经建立的连接, 将信息转发给B。这一方法的优势是:当两个客户端都与服务端保持连接的时候, 它将始终如一的正常工作。但是它的劣势也很明显:它将全面依赖并消耗服务器的资源、性能和网络带宽, 两个客户端的通信反应时间将明显增加, 即使它们与服务器始终保持着连接。
2 逆向连接 (Connection Reversal)
部分P2P应用程序使用一种直接但有效的称作逆向连接 (connection reversal) 的技术, 但是它只能在通信的两端只有一端处于NAT之后的情况下才能使用, 具体流程如图2所示。当前很多P2P系统都使用了这种技术, 它的主要限制在于:只有在一端位于NAT之后时这一技术才能生效。然而当今真实的情况是, 越来越多的客户端两端都处于NAT之后, 那么这一方法就是不可行的。
3 UDP打孔
UDP Hole (UDP打孔) 允许两个客户端在中心服务器的帮助下建立直接P2P连接任务, 即使这两个客户端都在NAT后面。
3.1 中心服务器
假设两个客户A, B能与中心服务器S发生UDP通信, 当一个客户在S中注册, 服务器S将记录该客户的两个节点 (Endpoints) :客户本来的
3.2 建立P2P通信过程
假设客户A希望与B建立直接UDP通信, 打孔过程如下:
(1) 开始时A不知如何与B通信, 因此A需要在S的帮助下与B建立UDP通信;
(2) S向A回复一份包含B的公共节点和私有节点的消息报文。同时, S通过与B的UDP通信向B发送一个包含A的公共节点和私有节点的连接请求。一旦A和B都接收到了这些消息, 那么它们就能彼此知道对方的私有和公共节点;
(3) 当A从S接收到B的公共和私有节点, 则A就开始向这两个节点发送UDP数据包, 并锁定最先返回有效回复的结点。同理, B也一样。
4 应用程序的通信
这里将通过考虑两种典型场景来介绍连接双方的应用程序是如何按照计划进行通信的:第一种场景, 假设两个客户端都处于不同的NAT之后;第二种场景, 假设两个客户端都处于同一个NAT之后, 但是它们彼此都不知道 (它们在同一个NAT中) 。
4.1 客户端都处于相同的NAT之后
当两个客户端同时位于相同的NAT之后, 而且是在同一个子网内部时, Client A与S之间的会话使用了NAT的62000端口, Client B与S之间的会话使用了62005端口, 如图3所示。
假设Client A和Client B要使用“UDP打孔技术”, 并通过服务器S这一“媒介”来认识, Client A和Client B则首先会从服务端S得到彼此的公网IP地址和端口, 然后就往对方的公网IP地址和端口上发送消息。在这种情况下, 如果NAT仅仅允许在内部网主机与其它内部网主机 (处于同一个NAT之后的网络主机) 之间打开UDP会话通信通道, 而内部网主机与其它外部网主机不被允许, 那么Client A和Client B就可以通话了。这种情形被称为“Loopback Translation” (“回环转换”) , 因为数据包首先从局域网的私有IP发送到NAT转换, 然后“绕一圈”, 再回到局域网中来, 但即使如比也比这些数据通过公网传送好。在这种情形下, 解析和发送的过程有些多余, 并且Client A和Client B之间的对话可能潜在性地给NAT增加了负担。
4.2 客户端都处于不同的NAT之后
当Client A和Client B都拥有自己的私有IP地址, 并且都处在不同的NAT之后时, 端对端的程序将运行于Client A Client B和S之间, 并且它们都开放了UDP端口4321。Client A和Client B首先分别与S建立通信会话, 这时NAT A把它自己的UDP端口62000分配给Client A与S的会话, NAT B也把自己的UDP端口31000分配给Client B与S的会话。如图4所示。
假如Client A想与Client B建立一条UDP通信直连, 而Client A只是简单地发送一个UDP信息到Client B的公网地址138.76.29.7:31000, NAT B则会不加考虑的将这一信息丢弃 (除非NAT B是一个full cone NAT) 。因为这一UDP信息中所包含的地址信息, 与Client B和服务器S建立连接时存储在NAT B中的服务器S的地址信息不符。同样的, Client B如果做同样的事情, 发送的UDP信息也会被NAT A丢弃。假如Client A开始发送一个UDP信息到Client B的公网地址上, 与此同时, 它又通过S中转发了一个邀请信息给Client B, 请求Client B也给ClientA发送一个UDP信息到Client A的公网地址上, 这时Client A向Client B的公网IP (138.76.29.7:31000) 发送的信息会导致NAT A打开一个处于Client A的私有地址和Client B的公网地址之间的新的通信会话, 与此同时, NAT B也会打开一个处于Client B的私有地址和Client A的公网地址 (155.99.25.11:62000) 之间的新的通信会话。一旦这一新的UDP会话各自向对方打开了, Client A和Client B之间就可以直接通信, 而无需S来牵线搭桥了, 即打孔技术。
UDP打孔技术有很多实用的地方:第一, 一旦这种处于NAT之后的端对端的直连通信建立之后, 连接的双方可以轮流担任对方的媒介, 把对方介绍给其它的客户端, 这样就极大地降低了服务器S的工作量;第二, 应用程序不用关心这一NAT是属于cone还是symmetric, 即便需要关心, 如果连接的双方有一方或者双方都恰好不处于NAT之后, 基于上叙的步骤, 它之间还是可以建立很好的通信通道;第三, 打孔技术能够自动运作在多重NAT之后, 不论连接的双方经过多少层NAT才到达Internet, 都可以进行通信。
4.3 客户端分别处于多层NAT之后
在有些网络拓扑中就存在多层NAT设备, 如果不熟悉网络拓扑的知识, 要想建立一条“理想的”端对端连接基本上是不可能的。以图5为例来说明。
假如NAT C是由Internet服务供应商 (ISP) 配置的一个大型工业NAT, 它使用少量的公网IP地址来为一些客户群提供服务;NAT A和NAT B则是为ISP的两个客户群所配置的独立NAT网关, 它们为各自客户群的私人家庭网络提供IP地址。只有Server S和NAT C拥有公网固定IP地址, 而NAT A和NAT B所拥有的“公网”IP地址对于ISP的寻址域来说则实际上“私有”的, 这时Client A的地址对于NAT A的寻址领域来说也是“私有”的, Client B的地址对于NAT B的寻址域来说同样是“私有”的。
同前所述, 每个客户端都建立了一个“外出”的连接到服务器S, 导致NAT A和NAT B分别进行一次公有/私有转换, 并导致NAT C为每个会话都建立了一个公有/私有的转换。
现在假设Client A和Client B想要建立一条端对端的UDP直连。理想的方法应该是Client A发送一条信息到Client B在NAT B的公网地址192.168.1.2:31000上, 这一地址在ISP的寻址域内;同时, Client B也发送一条消息到Client A在NAT B的公网地址上, 也就是192.168.1.1:30000。如果能这样发的话如此, 问题也就解决了, 可惜Client A和Client B根本就不可能知道对方的这个地址, 因为Server S只记录了它们真正的公网地址155.99.25.11:62000和155.99.25.11:62001。即使Client A和Client B通过某种途径得知了这些地址, 还是不能够保证这样就能进行通话了, 因为这些地址是由ISP的私有寻址域分配的, 可能会与私有域所分配的其他无关客户端地址相冲突。因此, 如果客户端之间想要进行端对端的通信的话, 别无选择, 只能通过它们真正的公网地址来进行, 并且NAT C必须还得支持“Loopback Translation”才行。
5 TCP打孔技术
在NAT后主机间建立P2P TCP连接比UDP连接稍微复杂些, 但是TCP打孔和UDP打孔在协议层上是非常相似的。目前基于TCP的打孔技术主要有Simultaneous TCP Open和Sequential Hole Punching等技术。
参考文献
[1]Dejan S Milojicic, Vana Kalogeraki, Rajan Lukose, et al.Peer-to-peer computing[EB/OL].http://www.hpl.hp.com/techreports/2002/HPL-2002-57R1.pdf.
[2]Hain, T., “Architectural Implications of NAT”, RFC 2993, November 2000.
[3]J.Rosenberg.STUN-Simple Traversal of User Datagram ProtocolThrough Network Address Translators[C].IETF RFC 3489.
[4]Saikat Guha and Paul Francis.Simple traversal of UDP throughNATs and TCP too (STUNT) .http://nutss.gforge.cis.cornell.edu/.
[5]Dan Kegel.NAT and peer-to-peer networking, July1999.http://www.alumni.caltech.edu/?dank/peer-nat.html.
[6]B.Ford, P.Srisuresh, Caymas Systems, and D.Kegel, .Peer-to-Peer (P2P) communication across middleboxes.http://midcomp2p.source-forge.net/draft-ford-midcom-p2p-01.txt, April 27, 2004.
NAT穿越 篇5
关键词:NAT,FW,隧道穿越,私网,公网
NAT (Network Address Translation) 是一种网络地址转换技术, 透明地对所有私网地址按照一定的规则转换为合法的公网地址[1]。在企业内部使用私有网络地址, 该地址对于Internet是不可见的。如果私网内的主机与公网上的主机通信, 必须通过NAT把私网地址翻译成合法的公网地址。这种地址映射关系是通过NAT设备中的一张地址映射表来维护的。使用NAT技术, 解决了IP地址紧缺的问题, 同时使得内外网络隔离, 对外隐藏了内部网络拓扑结构, 提供了一定的网络安全保障[2]。
FW (Firewall) 防火墙是指设置在不同网络或网络安全域之间的一系列部件的组合[3]。它一般位于可信任的企业内部网和不可信的公共网之间, 是不同网络或网络安全域之间信息的唯一出入口, 能根据企业的安全政策制定允许、拒绝、监测出入网络的信息流, 而且其本身具有较强的抗攻击能力。它是提供信息安全服务, 实现网络和信息安全的基础设施。
在逻辑上, 防火墙是一个网络分离器, 一个网络限制器, 也是一个网络分析器, 有效地监控了内部网和Internet之间的任何活动, 保证了内部网络的安全。
基于H.323语音数据报的NAT/FW隧道穿越与一般数据报在原理上和实现上具有不同。例如:语音服务器的呼叫模式必须设置为路由模式时, 才能启用NAT/FW隧道穿越功能;语音服务器支持的隧道穿越功能仅支持基本的通话应用, 目前仍不支持语音业务。
1、数据报的NAT/FW隧道穿越原理
1.1 从私网到公网的NAT/FW穿越地址转换原理
NAT/FW设备收到来自私网的IP报文后, 将IP报文的源IP由私网地址转换为NAT/FW设备的公网地址, 并将私网地址与公网地址的映射关系更新到NAT/FW设备的地址映射表中供公网地址到私网地址的转换时使用, 然后将报文发送到公网目的主机。如果地址转换失败, 则丢弃该报文[4]。
1.2 从公网到私网的NAT/FW穿越地址转换原理
NAT/FW设备收到来自公网的IP报文后, 在地址映射表中查找该IP报文的公网目的地址对应的地址映射关系, 将公网目的地址转换为私网目的地址, 然后将报文发送到私网内的目的主机。如果在地址映射表中查找映射关系失败, 则丢弃该报文[4]。
2、语音数据报的隧道穿越过程
2.1 语音服务器的NAT/FW隧道穿越功能
隧道是指穿越私网和公网之间的NAT/FW的一条TCP或UDP通道。NAT/FW隧道穿越是指通过隧道在NAT和防火墙的两侧进行通信。语音服务器的NAT/FW隧道穿越功能实现了位于NAT/FW内的私网与位于NAT/FW外的公网之间的语音通信和跨NAT/FW的不同私网之间的语音通信[5]。
语音服务器在组网中需要建立三条隧道实现公网与私网之间的NAT/FW穿越功能:
(1) 私网处理服务器 (Process Server) 和公网位置服务器 (Location Server) 之间用于通信的TCP隧道;
(2) 私网处理服务器 (Process Server) 和公网处理服务器 (Process Server) 之间用于通信的TCP隧道;
(3) 私网处理服务器 (Process Server) 和公网处理服务器 (Process Server) 之间用于传送语音媒体流的UDP隧道。
隧道建立之前, 必须在防火墙上为这三种类型的隧道开放相应的端口。
2.2 语音服务器实现私网与公网之间的隧道穿越的原理
XE IP PBX 1上的处理服务器和语音网关H.323 Gateway 1位于私网内, XE IP PBX 2上的处理服务器、语音网关H.323 Gateway2和XE IP PBX 3上的位置服务器位于公网上, 公私网之间布置了NAT/FW防火墙[5], 如图2-1所示。
XE服务器实现私网与公网之间隧道穿越的原理如下:
(1) XE IP PBX 3上的位置服务器启动时打开一个TCP连接侦听端口;
(2) XE IP PBX1上的处理服务器启动时经过NAT/FW防火墙与XE IP PBX3上的位置服务器连接建立一条隧道Tunnel 1, 该隧道用来完成XE IP PBX 1上的处理服务器和XE IP PBX 3上的位置服务器之间的信令交互;
(3) XE IP PBX 3上的位置服务器将公网和私网内的处理服务器之间的隧道信息下发给私网内XE IP PBX 1上的处理服务器和公网内XE IP PBX 2上的处理服务器;
(4) XE IP PBX1上的处理服务器经过NAT/FW防火墙与公网内XE IP PBX 2上的处理服务器连接建立TCP隧道Tunnel 2和UDP隧道Tunnel 3;
(5) 在呼叫建立过程中, H.323 Gateway 1和H.323 Gateway 2通过XE IP PBX 1上的处理服务器和XE IP PBX 2上的处理服务器之间的TCP隧道Tunnel 2交互H.323呼叫控制信令、H.323媒体通道控制信令或SIP信令;
(6) 呼叫过程中, H.323 Gateway 1和H.323 Gateway 2通过XE IP PBX 1上的处理服务器和XE IP PBX 2上的处理服务器之间的UDP隧道Tunnel 3传送语音媒体流。
2.3 私网与公网之间NAT/FW隧道穿越配置步骤
图2-2是模拟企业内部网与Internet外部网通过路由器和防火墙连接的网络拓扑图, 所有设备及端口的IP地址如图2-2所示。在网络实现过程中, 必须确保所有IP网络节点路由可达。
2.3.1 配置H.323 Gateway 1
2.3.2 配置H.323 Gateway 2
2.3.3 配置处理服务器1
2.3.4 配置处理服务器2
2.3.5 配置位置服务器
2.3.6 NAT/FW的配置
本实例中NAT/FW设备采用H3C的SecPath 1000设备进行组网。因组网时采用的NAT/FW设备不同, 在配置过程中配置方法略有差异。
3、结语
本文简要地解释了N A T、F W的概念及其工作原理, 着重阐述了从私网到公网和从公网到私网NAT/FW隧道穿越的原理和具体实现过程, 以期对读者有所帮助。
参考文献
[1]张世勇.计算机网络地址翻译 (NAT) 的原理及其具体应用.数字技术与应用, 2010.01.
[2]李文琴.NAT技术在校园内部网络中的应用.重庆工商大学学报 (自然科学版) , 2007.04.
[3]汪飞, 彭智洋, 曹宁.一种穿越NAT/FW的有效方案——基于H.323集中式视频会议系统.河海大学常州分校学报, 2007.02.
[4]吴刚.基于SIP穿越NAT/FW方案的研究.硅谷, 2010.16.
NAT穿越 篇6
网络地址转换(NAT)技术的出现在很大程度上缓解了目前由于Internet用户数量的剧增所引发的IPv4地址不足的问题,而IPv6技术的运用与普及程度在目前还不成熟,还不具备取代IPv4的条件,所以在一段时间内,NAT技术的应用还是将处于主流地位。
NAT设备通常拥有一个或多个合法公网地址,其身后的众多主机一般只拥有私有地址,因而主机不能直接访问Internet上的资源。它通过把局域网内部的主机私有地址映射为一个符合要求的公网地址以供局域网内部的主机访问Internet上的资源而达到地址复用的目的。通过NAT设备,不仅可以隐藏NAT设备后局域网的内部网络结构,使外部网络不能直接访问内部网络中的设备,保护了内部网络中的设备以及主机,同时整个内部网络只需要NAT设备拥有少数合法的公网地址就能实现整个内部网络中的主机请求外部网络资源时所需要的合法的Internet地址的映射,实现了公网地址的复用。有效的解决了IPv4地址不足的问题。NAT设备的广泛存在,对解决当前IPv4地址短缺问题、构建防火墙、保证网络安全等都发挥了重要作用。但NAT设备这些特性的存在也在一定程度上影响了P2P等新兴技术的应用。当内部网络中的主机需要参与到P2P网络中时,NAT设备隐藏内部网络中主机的特性,严重限制了内网外网中主机间P2P网络的建立。怎样快速有效穿越NAT设备的限制建立起内外网络间主机的直接连接,正是本文所要研究的问题。
2 NAT设备的分类
2.1 NAT与NAPT型
NAT设备是一种拥有一个或者多个公网IP地址的设备,当内部网络需要访问公网时,NAT设备即把这些公网IP地址映射给需要的内部主机使用,把所有来自于内网数据的IP地址替换为合法的Internet地址(只改变IP地址不改变端口号)。NAPT是一种在NAT上发展起来的设备,NAPT设备一般只拥有一个公网IP地址,NAT设备把来自内网内的数据的IP地址替换为合法的Internet地址,替换IP地址的同时,端口号也进行修改,并通过端口号来识别是私有网络中的哪台主机发出的连接[1]。
目前,大部分的NAT设备都属于后者,NAPT设备已经基本取代了NAT设备,因此一般情况下我们所说的NAT设备即指的是NAPT设备。本文所讨论的也只限于NAPT设备。
2.2 Symmetric和Cone型NAT设备
按照RFC 3489(STUN协议,Simple Traversal of UDP through NATs)的解释可以把NAT分为两大类:Symmetric型:对于连接到外部不同的目标,Symmetric型NAT会将同一个内部地址端口分配到不同的外出端口上。Cone型:对于连接到外部不同的目标,Cone型NAT会将同一个内部地址端口对分配到相同的外出端口上[2]。
3 现阶段NAT设备的穿越
3.1 NAT设备穿越技术简介
目前穿越NAT设备的研究在各类型的设备以及不同的协议上取得了不同程度的进展。Symmetric类型的设备由于在每新建一个内部网络到外部网络的端口映射时,都会在NAT设备上分配不同的外部端口号,而且这些端口号大部分都属于随机分配,不具有预测性,由于对方主机不能得到连接的端口号,所以给相应的UDP、TCP协议穿透NAT设备产生了严重的影响,穿透难以实现,致使这方面的研究未取得实质性的进展。不过在部分的Symmetric类型的设备上,由于映射的端口号产生是具有一定的规律性的,在这种类型的设备上,通过一定的端口预测算法对方主机能够预测到该主机发出连接的端口号,实现穿越还是具有一定的可能性的。Cone类型设备由于如果内部地址相同映射到NAT设备上的端口号都相同的原因,所以穿越问题相比Symmetric类型要简单些,目前UDP协议的NAT穿越技术已经比较成熟,IETF也给出了关于UDP穿越的协议和标准,形成了完善的RFC文档[2]。而TCP协议的NAT穿越问题目前正在不断的发展进步中,尚不成熟。由于TCP连接的建立需要涉及到TCP协议状态的转换问题,需要经过“三次握手”,通信双方都必须按照一定的顺序发送或接收特定的数据包才能建立会话,复杂程度大大高于UDP穿越NAT的复杂性。
3.2 现阶段成熟的TCP穿越方案介绍
现阶段TCP协议穿越NAT相对比较成熟的方法是利用原始套接字的编写方法,构建自定义特殊的IP数据包,修改IP选项LSR经过特殊的路由方式,修改IP选项TTL值以便获得路由的相关信息,使通信双方能同时打开TCP连接,最后再构建特殊的TCP“三次握手”数据包,并通过公网的第三方服务器的帮助,欺骗客户机TCP堆栈,建立起同时在NAT后的两个主机之间的TCP直连。这种方法通过特殊的方式,绕过了TCP连接建立初期需要的“三次握手”状态转换过程中,同步包可能被NAT拒绝而无法建立连接的情况。这种方法在一定的程度上很依赖于第三方服务器的同步控制,且控制方法与实现比较复杂[3,4]。
4 另一种TCP穿越Cone型NAT的方法
本方法根据UDP穿越NAT方法的思想,对其进行了一些步骤的改进以及相应的处理,使其在Cone型NAT上适应建立TCP连接的要求,快速建立起同时位于Cone型NAT后的主机间的连接。
条件假设:假设Client A和Client B分别是位于NAT后,需要进行TCP直连的两台主机,Server是位于公网的一台进行辅助连接的服务器。辅助连接服务器Server分别在Port S1端口(主控制端口)和Port S2端口(协助连接端口)进行监听。NAT设备对于内网主机发动的连接所产生的ICMP不可达消息不返回内网主机,在NAT端直接进行丢弃。
两台客户机建立直连的方法步骤如下:
4.1 NAT类型的验证,端口是否可预测
可以通过两种方法在开始实施穿越NAT之前对NAT的类型及其端口是否可预测进行验证,这也是本方法穿越NAT的关键步骤。
第一种方法:
客户机使用端口Port分别与公网上第三方服务器Server的端口Port S1和Port S2建立TCP连接,第三方服务器Server分析两次连接的发起方经NAT映射后的传输层地址是否相同,如果相同则可判断NAT的端口映射是可预测的;如不相同,则继续按照第二种方法中所述方法继续判断。
第二种方法:
客户机分别使用端口Port和Port+1与公网上第三方服务器Server的端口Port S1建立TCP连接,第三方服务器Server分析两次连接的发起方经NAT映射后的传输层地址端口是否连续,如果连续则可判断NAT的端口映射是可预测的;如不连续,可要求客户机依次增加端口号Port连接服务器Server端口Port S1,服务器端分析多次经过NAT映射后的端口号是否是有规律的,如是有规律的,则可继续执行下列的步骤,进行连接;如没有规律,则终止程序运行,此方法不再适用。
目前大部分的Cone型NAT设备,通过方法一就可验证得到端口可预测的结果。
4.2 通过第三方辅助连接服务器的帮助建立起TCP直连
根据上面的两种方法,如果测试得到双方客户机所处的NAT都为端口可预测型NAT,则可通过下列步骤,经由第三方服务器的帮助建立起双方客户机的直连。
1)辅助连接服务器打开Port S1主控制端口和Port S2协助连接端口,分别在两个端口上进行监听。
2)客户机Client A、Client B分别用上述方法对所属环境下NAT类型进行测试。如果通过则继续执行4.2.3。
3)客户机Client A、Client B分别与辅助连接服务器Port S1进行连接,获取当前登录用户的信息。
4)假设现在Client A需要与Client B进行TCP直连,Client A产生随机端口Port A,绑定到新套节字,连接至辅助连接服务器Server端口Port S2,向Server:Port S2端口发送“请求Client B连接Client A”的消息。新创建一个监听套节字,并通过Set Sock Opt()函数传递SO_REUSEADDR参数,使该套节字可以重用之前的端口号,之后绑定到已知的Port A端口,重用Port A端口,开始进行监听工作。
5)辅助连接服务器Server:Port S2收到Client A:Port A的请求信息,记录下此时Client A:Port A端口经过Client A端NAT经过映射后的外部IP地址以及端口号。并把Client A:Port A外部IP地址以及端口号通过辅助连接服务器Server:Port S1发送给Client B。并命令Client B连接Client A:Port A的外部IP:端口号。
6)Client B在收到辅助连接服务器Server发送过来的Client A相关信息后,Client B产生随机端口Port B,绑定到新创建的套节字,并开始连接辅助连接服务器Server端口Port S2。与此同时Client B新创建一个监听套节字,用上述端口重用方法设置此套节字,并绑定到Port B端口,开始监听工作。
7)此时辅助连接服务器Server记录下Client B:Port B端口经过Client B端NAT经过映射后的外部IP地址以及端口号,并将此信息递交给Clinet A;
8)lient A在收到了Client B的相关信息后,创建一个新的套节字,通过之前的端口重用的方法,使之绑定到之前已知的Port A端口。Client A利用此套节字,和获得的Client B的相关信息,开始发动连接操作。这个操作在部分Client B端NAT上不会被拦截,就能直接连接成功,如能连接成功就跳过下列步骤。但大部分Client B端NAT都会拦截Client A发动的这个连接操作,这是由于出于安全的考虑,非请自来的数据包一般都会被NAT直接过滤抛去掉。此时Client A收到返回错误值的连接操作函数完成通知。虽然此次连接没有成功,但此时Client A端的NAT已经记录了本方发送连接的IP地址以及端口和远端主机的IP地址和端口,为接下来的真正连接做好了准备。此步操作即所谓的“打洞”操作。
9)Client A关闭之前的连接套节字套节字,随后Client A发送“准备好”的消息至Server:Port S1端口。
10)Server在收到了Client A发送过来的准备好的消息后,发送通知给Client B,Client B在收到了这个消息后就可以通知之前已经获得的Client A:Port A的外部IP和端口号发动连接。至此Client A和Client B之间TCP直连建立完毕。
5 连接成功率
利用本文所提出的方法建立TCP穿越NAT设备的连接,成功率较高,在双方都为Cone型NAT设备的后方时,连接成功率可以接近98%(8款Cone型NAT设备组合配对,每次测试进行100次穿越NAT的连接),由于试验条件的限制,没有尽可能的测试更多Cone型NAT设备,但居于以上的测试数据,本文所提出的方法,在一定的条件成立的条件下,还是比较可靠和高效的。
6 和传统TCP穿越方法的对比
该文所提出的方法和当前较成熟的TCP穿越NAT的方法对比我们可以得出:传统方法在TCP三次握手的过程中,需要欺骗TCP堆栈,使用自定义的数据包来完成握手的同步信息,同步的开销大,复杂度高,而本方法无论在实现的复杂度上,还是实现的方法步骤上都大为简化,且所需要的第三方公网服务器的同步协助简单、步骤较少,第三方公网服务器所承受的网络负载也大为降低,可进一步提升大容量的P2P软件所需要的第三方服务器的网络负载能力。此方法比传统方法的劣势也是我们可以看出的,必须是双方的NAT设备都要为Cone型。受到此约束,在当前网络上,必然有一部分的NAT型设备不受本文所提出的方法的支持。
7 结束语
经过测试,本方法适用于绝大部分的Cone型NAT设备,可以快速的穿透Cone型NAT,建立起分别位于NAT后两台主机间的TCP直连。通过改进上述方法,例如:在2.8中Client A获取Client B的外部IP地址和端口后进行的“打洞”操作,可人为设定超时值,不必等待系统超时值的到来,进一步缩短整个连接过程的用时,提升系统的响应速度。本方法实现的简单性以及所需要第三方服务器进行同步的步骤较少及操作简单,在一定程度上相比之前介绍的方法,可进一步减轻服务器的总体负担,提升服务器并发的客户流量。在实际的运用中是也一种不错的穿越NAT建立TCP直连的方法。在此方法的基础上,如果建立不成功,再改用上述如通过原始套节字构建特殊的IP数据包的方法进行连接[5,6]。两种方法的配合使用,将在系统的联通性以及提升服务器端系统的总体流量上相辅相成,是一个比较完善的解决方案。
参考文献
[1]RFC3022,Traditional IP Network Address Transla-tor(Traditional NAT)[S].
[2]RFC3489,Simple Traversal of UDP Through Network Address Translators(NATs)[S].
[3]肖继民,吴新龙.端到端通信中TCP的NAT穿越解决方案[J].南京邮电大学学报:自然科学版,2006,26(1):89-92.
[4]王庆庆,杜旭.穿越NAT建立TCP连接[J].计算机与数字工程,2006,34(12):63-65.
[5]Stevens W R.UNIX网络编程[M].3版.北京:清华大学出版社,2006:619-641.
NAT穿越 篇7
现在接入Internet的计算机数量猛增,能分配的IPv4网络地址资源已远远不能满足需要,解决地址资源不足且又广泛应用的方法是采用网络地址转换(NAT,Network Address Translation)技术。NAT技术使得处于同一个局域网内的计算机能够以一个公用IP地址出现在广域网上,这就为计算机终端提供了透明接入Internet的能力,能很好地解决IPv4地址不足的问题。但是由于NAT只允许局域网内的计算机访问外网,而外网是不能直接对局域网内的计算机进行访问的,这就给远程控制中计算机间的通信带来了的困难。如何穿越NAT进行通信成为远程控制中需要解决的问题。
1 NAT的类型
NAT分为两大类,基本的NAT和NAPT。
(1)基本的NAT映射一个内部私有IP地址到一个公网IP地址上,当数据包穿过NAT时,基本的NAT会改变IP包中的原IP地址,但不更换它的IP包中端口号。
(2)Network Address/Port Translator(NAPT)当IP数据包穿过NAPT时,NAPT不仅会改变IP包中的原IP地址,还会更换IP包中端口号,它可以允许多台内网主机同时共享一个单独的公网IP地址。根据端口绑定的实现方式不同,又可将NAPT分为两类:
a.Cone NAT每当建立一个端口,把一个私有IP地址、私有端口和公网IP、公网端口绑定后,对于以后来自同一私有IP和端口号的应用连接,Cone NAT将重复使用同一个绑定的端口,只要有一个连接,这个绑定端口就会保持激活状态。
b.对称NAT(Symmetric NAT)对称NAT在连接期间不会始终保持私有IP、私有端口和公网IP、公网端口的绑定不变。相反,它会为每个新的连接重新分配一个公共端口。由于当前的NAT大部分都是ConeNAT,本文中只讨论远程控制系统中的客户端和服务器端处在两个不同的Cone NAT后面要求直接进行TCP连接的情况。
2 TCP打洞(TCP Hole Punching)[1]原理
客户端和服务器端之间利用TCP打洞技术进行通信的网络环境[2]如图1所示,通信双方处于不同的NAT后,通过有公网地址的中介服务器协助,最终实现双方的TCP直连。
(1)当客户端[192.168.36.2:3001]与中介服务器[211.82.48.34:8001]建立TCP连接,通过NAT A后,IP包中的IP地址和端口将变为[155.99.25.11:5001]。
(2)当服务器端[10.10.1.8:4001]与中介服务器[21182.48.34:8001]建立TCP连接,通过NAT B后,IP包中的IP地址和端口将变为[138.76.29.8:6001]。
(3)当客户端需要与服务器端建立TCP连接时,首先连接中介服务器的协助端口[7001],建立用于协助的TCP连接,而此时客户端使用的端口号为[9001]。
(4)中介服务器通过已经与服务器端建立的TCP连接向服务器端发送连接通知,通知服务器端向[21182.48.34:7001]回送消息。
(5)服务器端向中介服务器回复连接请求,建立用于协助的TCP连接。
(6)中介服务器向服务器端返回连接客户端经过NAT A映射后的IP地址、端口[155.99.25.11:5001],并关闭与服务器端用于协助的TCP连接;
(7)服务器端尝试向客户端的[155.99.25.11:5001]发送建立TCP连接的请求,NAT A会记录此次连接的源地址和端口号。
(8)服务器端在端口[10001]启动TCP监听,并使用与中介服务器建立TCP连接,通知中介服务器,服务器端已完成TCP打洞和做好TCP直连准备。
(9)中介服务器向客户端发送服务器端经NAT B映射后的IP地址、端口[138.76.29.8:6001],并关闭与客户端用于协助的TCP连接。
(10)客户端向[138.76.29.7:6001]发送TCP连接请求,即可与服务器端成功建立TCP直连。
3 TCP打洞在远程控制系统中的应用
远程控制系统由客户端和服务器端组成,客户端可以监控服务器端的屏幕以及进行一些简单的远程控制。客户端和服务器端的通信采用TCP连接方式,通过设置一个有公网的中介服务器来实现远程控制中双方的直接通信,中介服务器记录各用户的ID[3]。采用Socket网络编程技术来实现,这样可以使远程控制能够在Internet中进行工作。
4 结束语
本文分析了通过TCP Hole Punching的方法使处于Internet中的不同NAT后的主机能够建立TCP连接,从而实现双方的直接通信和进行控制操作。
参考文献
[1]Bryan Ford,Pyda Srisuresh,Dan Kegel.Peer-to-Peer Communication Across Network-Address Translators[EB/OL].http://www.bford.in-fo/pub/net/p2pnat/.
[2]徐向阳,韦昌法.基于NAT穿越技术的P2P通信方案的研究与实现[J].计算机工程与设计,2007,28(7):1559-1603.