一种Symmetric NAT穿透的新方法
2017-03-01冯金哲殷海兵
冯金哲 殷海兵
(中国计量学院信息工程学院 浙江 杭州 310018)
一种Symmetric NAT穿透的新方法
冯金哲 殷海兵
(中国计量学院信息工程学院 浙江 杭州 310018)
NAT(Network Address Translator)不仅解决了IP地址短缺的问题,而且也使内网主机避免了来自网络外部的攻击。但对于P2P应用来说,需要建立端到端的连接,所以说如何穿透NAT成为了P2P技术中的一个关键。通过对当前NAT穿透技术的研究,发现依靠TURN(Traversal Using Relay NAT)来实现对Symmetric NAT穿透往往存在服务器负担重、延时、丢包的问题,于是给出一种基于端口预测的NAT穿透新方法。该方法避免了依靠TURN来实现对Symmetric NAT穿透所带来的难题,大大满足了对网络安全要求高而使用对称型NAT企业的需求。
Symmetric NAT TURN P2P NAT穿透
0 引 言
网络地址转换[1]NAT是一个非常有名的工具,能够使IP地址在网络上重用。NAT可以将内网私有地址和端口号转换成公网地址和端口号,进而建立一个会话实现与公网主机进行通信。但是NAT只允许单方面发起连接,即内网可以作为客户端访问外网,而不能作为服务器提供服务。很明显,这与P2P的资源共享的思想所不容[2]。于是解决NAT穿透问题将是实现P2P对等服务的前提。
目前,存在多种NAT穿透的方法。一种常用的穿透方法STUN(Simple Traversal of UDP over NAT)[3]是NAT的UDP简单穿透,基于C/S架构,但不能实现Symmetric NAT的穿透;而对于Symmetric NAT穿越一般采取TURN中继方式。虽然中继服务器能够实现对Symmetric NAT的穿透,但同时也容易导致TURN服务器负担过重,引起延时、丢包现象的发生。
本文采取的NAT穿透新方法,能够成功实现对Symmetric NAT的穿透。对称型NAT被广泛应用于对安全性要求较高的交流通信中,但目前依靠中继转发的方案存在一定的缺陷。本文采取基于端口预测方法实现对Symmetric NAT的穿透,克服了依靠中继服务器穿越的缺陷,特别适合对网络安全要求高而使用对称型NAT的企业公司。
1 NAT分类
STUN标准中,根据NAT对IP地址和端口的映射方式[4],如图1所示,把NAT分为四类:完全锥型NAT(Full Cone NAT)、限制锥型NAT(Restricted Cone NAT)、端口限制锥型NAT(Port Restricted Cone NAT)和对称型NAT(Symmetric NAT)。
图1 NAT地址映射关系
(1) 完全锥型NAT:特点是内部主机P访问外网主机时,NAT给其分配一个端口号,外网的任何主机都可以凭借这一端口号给内网主机发送UDP数据包。映射关系为P:p→A:b,任何外部主机都可以通过(A:b)发送数据到上(P:p)。
(2) 限制锥型NAT:特点是当内部主机P访问外网主机X时,NAT给其分配一个端口,主机X可以用任何端口与P通信,但外网主机不能与P通信。映射关系为P:p→A:b→X,只有来自X的数据包才能通过(A:b)发送到上(P:p)。
(3) 端口限制锥型NAT:特点是当内部主机P访问外网主机X时,NAT给其分配一个端口,主机X只能用本端口与P通信,X用其他端口或其他主机不能与P通信。映射关系为P:p→A:b→X:x,只有来自X:x的数据才能通过(A:b)发送到(P:p)上。
(4) 对称型NAT:特点是只有同一内部主机地址(P:p),并且发送到同一地址(X:x)的请求消息,NAT才会映射为相同的外部地址(A:b),返回的数据也只接受该内部主机X:x这一目的地址。映射关系为P:p→A:b→X:x;当访问(Y:y)时,映射则变为P:p→B:c→Y:y。
2 NAT穿透方案
NAT穿透一般分为两种情况:(1) 终端A与B通信,A位于NAT后面,而B位于公网上。这种情况两者通信比较简单,只要让位于NAT后面的A终端先建立联系,NAT就不起作用了,A可以从服务器上取得B的地址,主动发起连接,B回应的数据包就可以容易地穿透NAT。(2) 如果A与B均位于NAT之后,这时候A与B的通信是否成功就与两个NAT的类型有关了。主要的实现方法是终端A与B先通过与服务器的联系,获得各自在NAT外部的地址,即IP地址和端口号;然后A与B再分别向对方的外部地址发送数据邀请包,获取自己与对方通信的外部地址,这就是所谓的“打洞”[5-7]。打洞完成后,双方就可以建立联系进行端到端的通信了。但是,当一方NAT的类型为对称型,而另一个是端口限制型NAT或对称型NAT时,将无法获取外部地址,进而邀请包也无法成功到达,也就无法穿透NAT实现两者的通信。
2.1 STUN 方法
STUN是一种Client/Server的协议,也是一种Request/Response的协议。STUN穿透NAT实现A与B的通信方法,如图2所示。
图2 STUN穿透NAT
(1) 客户端A与服务器建立联系,NAT A为其分配端口11000,服务器得到A的地址100.10.10.10:11000。
(2) 客户端B也与服务器建立联系,NAT B为其分配端口22000,服务器得到B的地址200.20.20.20:22000。这时A如果直接向B发送数据包会被NAT B丢弃,所以通过在NAT B上打一个方向为A的洞,那么A就可以向B发送数据了。
(3)服务器发起打洞的指令,客户端B向A的地址100.10.10.10:11000发送一个UDP的数据包,这个数据包被NAT A丢弃,但在NAT B上建立起了映射记录,这样NAT B就不会再丢弃来自A的数据报文了。
(4) 服务器通知客户端A可以通信了,A向客户端B发送UDP数据包,NAT B 允许数据包通过,于是A与B就实现端到端的通信了。
2.2 TURN 方法
STUN的局限性在于不支持对称型NAT穿透,而一些在安全性要求较高的企业网络中,配置的NAT多是对称型NAT。所以STUN的扩展TURN[8]就出现了,TURN解决NAT的问题与STUN相似,只不过STUN穿透方法得到的地址是出口NAT上的外部地址,而TURN方法得到的地址为TURN服务器上的公网地址。但负载比较大时,利用TURN方式会引起服务器负担过重,出现丢包和延时的现象。
2.3 NAT穿透新方法
针对STUN存在不能实现对Symmetric NAT穿透的局限性,以及TURN方式存在数据包延迟和丢包的缺陷。本文给出了一个新的方法,此方法成功实现了对Symmetric NAT的穿透。此方法的实现思路如图3所示。具体分为三个阶段。
图3 NAT穿透新方法
2.3.1 第一阶段
终端A访问服务器C和D确定NAT类型。
(1) 终端A首先和服务器C建立联系,服务器C分析NAT A映射的端口号。
(2) 服务器C向终端A传递(1)得到的端口号。
(3) 紧接着,终端A向服务器D发送一个数据包。这个数据包中包含了(1)中分析得到的端口号信息。同样的方式,服务器D也分析了NAT A映射的端口号并记录下来。服务器D根据比较这两个端口号的异同,可得出NAT A的类型。若两个端口相同,则NAT A属于锥型NAT;否则,属于对称型NAT。
2.3.2 第二阶段
这个阶段里,终端B采用第一阶段一样的方式,分别访问服务器C和D。
(1) 终端B首先访问服务器C,然后,服务器C分析得到NAT B的映射端口号。
(2) 服务器C把(1)中得到的端口号回应给终端B。
(3) 终端B向服务器D发送数据包。数据包中包含了(1)中分析得到的端口号信息。服务器D同样分析了NAT B映射的端口号并记录下来。服务器D根据比较两个端口的异同,得出NAT B的类型,若两个端口一致,则NAT B属于锥型NAT;否则为对称型NAT。
2.3.3 第三阶段
这一阶段里,对端口进行预测。假设在第一、二阶段检测得到的NAT A和NAT B都属于对称型。很显然,通过对两次端口的观察,可以确定端口号有三种变化趋势:递增、递减或随机分配。同时,也可以对NAT如何分配端口号有了一个很准确的预测范围。对于端口号变化呈递增或递减的情况,对很多NAT而言,一般差值在1或者2[9]。而对于端口随机分配的情况,总的端口数为N=65 535-1024,根据统计学的推算,当随机猜测439次,就会保证至少有一次预测成功率达95%[10]。如果尝试猜测的次数足够多,可以说,基本能成功实现终端A与B的连接。具体实现如下:
(1) 根据第一、二阶段分析得到的信息,也即NAT A与服务器C与D的交流信息,可以预测一个合适的打洞端口。服务器D把包含预测端口号信息发送给终端B。
(2) 根据(1)中的信息,终端B尝试发送数据包。对于这样的数据包肯定会被NAT A丢弃,但NAT B却记录了此次连接的信息。
(3) 基于第一、二阶段的两类信息,也即NAT B与服务器C与D的交流信息,也可以预测一个合适的打洞端口。服务器D同样也会发送包含预测端口号信息到终端A。
(4) 根据(3)中包含的信息,终端A向终端B发送数据包。由于第(2)步中终端B尝试连接过终端A,所以这些数据包会被NAT B识别并允许通过。从而终端A与B之间便建立起了连接。
3 实验验证
考虑到实际测试环境很复杂,这里分别在两台电脑上利用Linux虚拟机来搭建NAT测试环境。网络测试环境的设计如图4所示,采用C编程,选择用Linux下的libnet库开发终端程序,进行数据包的发送;服务器端利用libpcap库实现网络数据包的捕获与过滤,同时监听两终端的连接。
首先,进行端口的预测验证。终端A先与服务器C建立连接,再用同一端口向另一服务器D发起一次连接,终端A基于第一次连接进行的端口预测与第二次连接实际的映射作比较,如果匹配,则端口预测验证成功。端口预测成功后,终端A就发送数据包,同时在终端B检测数据包的接收情况。实验结果证明了终端A与B成功实现了文本传输。
图4 实验测试网络结构
4 结 语
本文采用的基于端口预测穿透技术成功地实现了对Symmetric NAT的穿透,解决了目前利用中间服务器转发实现穿透Symmetric NAT所带来的难题。虽然,目前大部分企业用户一般选择锥型NAT设备,但对于对安全性要求较高的企业用户,对称型NAT设备的使用是不可避免的。通过本文介绍的方法可以实现对Symmetric NAT的成功穿越,所以,此方法具有很高应用与推广的价值。
[1] 林海斌.基于STUNT协议的TCP NAT穿越设计与实现[D].华南理工大学,2010.
[2] 曹申会.NAT穿越技术研究与实现[D].南京邮电大学,2013.
[3] Rosenberg J, Weinberger J, Huitema C,et al.STUN-Simple Traversal of User Datagram Protocol (UDP) Through Network Address Translators (NATs)[S].RFC 3489.March 2003.
[4] 谢统义,黄保华.对等系统NAT穿越技术研究[J].广西教育学院学报,2014(3):145-147.
[5] 杜经纬,王春红.在P2P网络环境下基于UDP协议穿越NAT的研究[J].吉林师范大学学报:自然科学版,2012(1):93-94.
[6] 蒙元胜.基于UDP/TCP协议的NAT穿越方案研究[D].中山大学,2014.
[7] 孔卫喜,席少龙.P2P中NAT穿越问题的研究[J].计算机技术与发展,2014,24(2):243-245.
[8] Rosenberg J,Mahy R,Huitema C.Traversal using relay NAT(TURN).Internet-Draft.2005.
[9] Midcom W G,Takeda Y.Symmetric NAT Traversal using STUN[J].IETF,RFC3225,2003,35(9):254-289.
[10] 王培东,连树国.基于端口预测的P2PNAT穿越方法的改进[J].通信技术,2009,42(3):140-142.
A NEW METHOD FOR SYMMETRIC NAT TRAVERSAL
Feng Jinzhe Yin Haibing
(CollegeofInformationEngineering,ChinaJiliangUniversity,Hangzhou310018,Zhejiang,China)
NAT(Network Address Translator) not only solves the problem of IP address shortage,but also makes the network host avoid the attacks from outside the networks.But for P2P application,it needs to establish an end-to-end connection,so how to realise NAT traversal becomes a key in P2P technology.Based on the research of current NAT traversal technology,we found that to achieve Symmetrical NAT traversal relying on TURN(Traversal Using Relay NAT) often has the problems of heavy server burden,time delay and packet loss.Therefore,in this paper we present a new NAT traversal method by using port prediction,the method avoids the problems brought by relying TURN to implement traversal of symmetrical NAT,and greatly satisfies the requirements of those enterprises who have high demand on network security and thus use symmetric NAT.
Symmetrical NAT TURN P2P NAT traversal
2015-10-09。浙江省自然科学基金项目(LY15F020022)。冯金哲,硕士生,主研领域:计算机网络通信。殷海兵,教授。
TP393
A
10.3969/j.issn.1000-386x.2017.01.022