《电子技术应用》
您所在的位置:首页 > 通信与网络 > 业界动态 > 基于STUN协议的NAT路由器穿越算法设计与实现

基于STUN协议的NAT路由器穿越算法设计与实现

2009-06-11
作者:刘胜辉1,刘油锤2

    摘 要: NAT穿越是多媒体传输技术中的一个重要研究课题,STUN解决方案能解决部分NAT的穿越问题,但是还有一定的弊端。在STUN技术的基础上,介绍了NAT路由器的识别方法,详细分析并设计一种解决NAT路由器穿越问题的算法,并对处于不同NAT路由器环境下的直接通信给出一种解决方案。既提高了NAT路由器的识别效率,也改善了通信质量。
    关键词:  NAT;STUN;直接通信;穿越

 

    NAT是为了解决网络IP地址资源紧缺而出现的一种技术,由于其具有隐藏内网IP的功能,增加了内网的网络安全性,所以得到了广泛的应用。但是,由于外网主机不能首先发起对处于NAT后主机的访问,特别是处于两个内网主机不能直接进行通信,这对一些应用程序的部署造成一定的困难。比如说网络视频会议系统和VoIP系统。为了解决这个问题,也就是处于内网的主机之间能够穿越它们之间的NAT建立直接通信,已经提出了许多方法,STUN(Simple Traversal of UDP Through NetWork Address Translators)技术就是其中比较重要的一种解决方法,并得到了广泛的应用。
    本文主要是基于STUN协议,对NAT路由器识别问题进行研究,对NAT类型的判断方法做了改进,详细分析并提出一种算法来解决NAT路由器穿越问题,对处于NAT路由器后的主机设计了直接通信方案。
1 NAT(Network Address Translator) 介绍
1.1 NAT简述
    NAT即网络地址转换,是一个IETF(Internet Engineering Task Force)标准,它允许一个整体的组织或机构用一个公用的IP地址出现在网络上,归根到底,NAT就是把内部私有的IP地址翻译成公网上合法的IP地址的一种技术。
    NAT负责把内部主机的数据包的源地址(私有IP地址)按照一定的规则翻译成合法的、唯一的公网IP地址,源数据包的端口转换成NAT的一个端口,目的IP地址和端口不变,最终数据包经过路由器发送到目的地址。同时,NAT也负责把外部主机返回的数据包的目的地址和端口转换成内网的私有地址和端口,源地址和端口不变。这种变换的本质是在NAT内部维护着一张转换表,负责由内到外和由外到内的IP地址与端口的转换。
    对于视频会议和VoIP软件来说,对位于不同NAT内部的主机通信需要靠服务器来转发完成,这样就会增加服务器的负担。为了解决这种问题,要尽量使位于不同NAT内部的主机建立直接通信,其中,最重要的一点就是要判断出NAT的类型,然后才能根据NAT的类型,设计出直接通信方案。
1.2 NAT类型
    根据STUN协议,把NAT分为以下几种类型
    (1) 完全锥形(Full Cone)NAT:所有内部IP地址和端口的请求都被映射到相同的外部地址和端口,任何外部主机都可以通过映射的外部地址向内部主机发送数据包。
    (2) 受限锥形(Restricted Cone)NAT:所有从相同内部IP和端口的请求都被映射为相同的外部地址和端口,与Full Cone不同的是,必须是内部主机已经向外部主机发送过数据包,外部主机才能通过IP地址向内部主机发送数据包。
    (3) 端口受限锥形(Port Restricted Cone)NAT:和Restricted Cone类似,但是包括对端口的限制,外部主机(IP地址X,端口P)向内部主机发送数据包当且仅当满足内部主机先前已经向(X,P)发送过数据包。
    (4) 对称(Symmetric)NAT:限制最严格的NAT,所有来自同一内部IP地址和端口发送到某一特定目的IP地址和端口的请求,都会映射为同一个目的地址和端口。若同一台内部主机从同一个端口发送数据包,只是目的地址和端口不同,那么映射关系也是不同的。并且,只有曾经收到过内部主机请求的外部主机才能向内部主机发送数据包。
2 NAT路由器
2.1 STUN技术简介
    STUN技术能使客户端应用程序发现它和公共互联网之间存在的NAT和防火墙及其类型,还能获得路由器分配给它的公网IP地址和端口号。它主要由三部分组成:STUN客户端、STUN服务器端、NAT路由器。如图1所示。

 


    STUN客户端通过向服务器端发送不同的消息类型,根据服务器端不同的响应来判断客户端IP地址类型,如果是内部网络地址,还可以判断所经过的NAT类型,同时可以得到路由器分配给它的公网IP地址和端口(映射过的)。
    STUN服务器端根据客户端不同的动作(客户端发送不同的消息类型)作出不同的处理,可以获得客户端的源地址与端口(映射过得公网IP地址和端口)并返回给客户端。根据客户端发送的消息类型,按照要求用不同的IP地址和端口返回给客户端。

2.2 NAT路由器类型判断
2.2.1 测试方案设计

    根据RFC3489提供的解决方案,NAT类型的判断由客户端来完成。设计了下面两种测试方法。
    测试1:客户端(IP:A,PORT:A)向服务器(IP:B,PORT:B)发送消息,服务器响应客户端的请求,做出动作,服务器(IP:B,PORT:B)发送Response给客户端(IP:A,PORT:A)。
    测试2:客户端(IP:A,PORT:A)向服务器(IP:B,PORT:B)发送消息,服务器(IP:B,PORT:C)发送Response给客户端(IP:A,PORT:A)。
2.2.2 NAT 路由器类型判断
    由图2可以得到客户端所处的网络环境有以下几种:
    · 阻塞UDP 的防火墙;
    ·公开的互联网上(有公网IP);
    ·对称型UDP防火墙;
    ·完全锥形或受限锥形NAT;
    ·对称NAT;
    ·端口受限锥形NAT;
    ·受限锥形。

 


2.3 NAT路由器类型判断改进
    RFC3489给出了判断NAT路由器类型的解决方案,它需要在公网上部署两台服务器才能对NAT路由器进行判断,这就需要两个IP地址才能完成测试,这在Windows环境下比较难实现,对于当今IP地址比较缺乏的情况下,往往要花费的成本比较大。本文对RFC3489所给的解决方案进行了改进,在同一台服务器上用不同的端口对客户端的消息进行响应,设计出以上的测试方案,来判断出NAT的类型。但是有些情况不能具体识别出固定类型,但是这并不影响后续工作,本文研究目的是为了在客户端之间建立直接联系。所以这种方法还是很有应用价值的。
3 NAT路由器穿越算法设计
3.1 NAT路由器穿越概述

    通过以上的分析,很容易看出,对于处于不同网络环境的客户端来说,想进行直接通信,首先需要判断出NAT的类型,根据NAT路由器的类型来决定处于路由器后面的主机双方是否可以进行直接通信。以某个公司的网络为例,公司通过NAT路由器连接到公网上,公司内部通过NAT路由器建立了三个局域网。网络环境(见图1)处于路由器后面的主机双方要直接通信需要有STUN服务器的配合。根据判断的NAT路由器的类型确定路由器后面的双方客户端是否可以建立直接通信。
3.2 NAT路由器穿越算法
    根据前面分析,NAT路由器的穿越算法可以描述如下:
    (1) 终端A、B分别登录服务器,判断自己所处的网络环境,即各自所处网络中NAT的类型。
    (2) 从服务器获得终端B所处的网络NAT的类型,确定是否可以建立直接通信。
    (3) 不能建立直接通信的情况,程序直接退出
    (4) 对于可以建立直接通信的网络,确定具体的解决方案。有下面几种情况
    a.终端A、终端B处于同一网段时,终端A直接向终端B发送Message消息。终端B响应Message消息,回复Message消息给终端A。
    b.对于不同网段,分为两种情况。终端B为对称NAT的情况,终端A首先向终端B发送Message消息,然后终端A往服务器发送Message2消息。服务器收到Message2消息后,服务器再向终端B发送Message3消息,终端B根据收到的消息类型做出响应,往终端A发送Message消息;对于终端B为非对称NAT的情况,终端A首先向服务器发送Message2消息,然后再发送Message消息给终端B。
    (5) 终端A、终端B退出服务器。建立直接通信成功。
    在发送消息时,要建立消息来源信息库,如IP地址,端口号,以及映射关系。方便处理消息时使用相关资源。算法流程如图3所示,终端A(图中用A标识) 与终端B(图中用B标识) 建立直接通信,STUN服务器为Server。消息类型有Message、Message 2、Message 3三种消息类型。

 


    这里以终端B所处的NAT类型为对称NAT为例,终端A的IP为172.22.2.9,其公网IP为210.80.43.104,Server的IP为202.120.58.178,终端B的IP192.168.101.6,终端B的公网IP是222.191.255.68。图4为终端A在与终端B建立直接通信的时序图。

 


    图4中,只对终端A与终端B处于不同的网段内作了一个分析。对于二者处于同一个网段内的情况,比较容易解决,终端A直接向终端B发送Message 消息即可建立直接通信。
    对于终端B处于非对称NAT的情况,解决方案的差别之处就在于发送的消息顺序不一样。非对称NAT的情况下,终端A首先发送Message 2消息和服务器通信,然后在发送Message消息与终端B进行通信。这与对称NAT的情况刚好相反。
    为了能够顺利的建立直接通信,在建立直接通信成功后,让客户端双方在相互通信3次,确认直接通信是否成功,在下面的仿真实验中可以体现出来。
    有三种情况现在还没有找到比较好的解决办法:双方处于阻碍UDP防火墙的NAT路由器;双方都是对称NAT的防火墙;一方为对称NAT,另一方为端口受限NAT。
3.3 算法仿真结果
    对于NAT路由器穿越算法,进行了实验测试,仿真中,发送的消息类型(TRANS,MESSAGE,Message3),客户端实验结果如图5、图6所示。

 

 


    此外,对于双方客户端处于同一局域网内不同级别的NAT后面理论上是可以直接通信的,但是要取决于最外层的NAT是否支持Loopback translate功能,也就是内网主机A向内网主机B的最外层NAT外网地址和端口发送数据,最外层的NAT是够能够将数据转发给主机B,如果最外层NAT支持此功能,则A和B可以建立直接通信,否则不能。
4 NAT路由器穿越算法的优缺点
    NAT技术的优点决定了它的应用广泛性,但是根据STUN协议来实现NAT路由器的穿越问题往往需要的开销比较大,本文提出了一种比较方便的算法,在不增加成本的基础上能够准确地判断出来NAT路由器的类型,对NAT路由器穿越问题进行了详细的研究、设计。这对于中小型的企业来说,不仅节省了成本预算,而且达到了实际的效果。但是对于有些公司部署对称NAT路由器,该算法还有一些不足之处,还需要进一步研究,对算法进行改进。
    本文对STUN协议提出的NAT识别方法进行了有效地改进,并对NAT路由器的穿越问题进行了详细地研究,并设计出比较合理的算法。提高了效率,节省了成本。并指出了该算法的优点和不足。
参考文献
[1] Rosenberg J, Weinberger J. STUN-Simple Traversal of user Datagram Protocol (UDP) Trough Network Address Translators (NATs). RFC3489, 2003.
[2] Egevang K. The IP Network Address Translator (NAT). RFC1631, 2001.
[3]  Hitema C. Short Term NAT Requirements for UDP Based Peer-to-Peer Applications. IETF Draft, 2001.
[4] P Srisuresh, M Holdrege . IP Network Address Translator(NAT) Terminology and Considerations. RFC2663, 1999.

本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。