APP下载

NAT穿越技术研究

2020-07-27陈恒勋闫永航孟丹夏伦

现代信息科技 2020年6期

陈恒勋 闫永航 孟丹 夏伦

摘  要:NAT是一种在IP数据包通过路由器或防火墙时重写源IP地址或目的IP地址的技术,作为一种解决IPv4地址短缺的方案而流行起来,但却阻碍了以P2P网络为基础的应用的发展。为解决这一问题,各种NAT穿越技术应运而生,文章基于不同场景视角阐述四种主流的NAT穿越方案,包括UDP打洞技术、STUN协议、TURN协议和ICE框架,并说明了各方案的研究进展。

关键词:NAT穿越;UDP打洞;STUN;TURN;ICE

中图分类号:TP393      文献标识码:A 文章编号:2096-4706(2020)06-0094-05

Abstract:Network Address Translation (NAT) is a technology that rewrites a source IP address or a destination IP address when an IP data packet passes through a router or firewall. NAT is popular as a solution to the shortage of IPv4 addresses,but it has hindered the development of applications based on P2P networks. In order to solve this problem,various NAT traversal technologies have emerged at the historic moment. This paper describes four mainstream NAT traversal solutions based on different scenarios,including UDP hole punching technology,STUN protocol,TURN protocol and ICE framework,and then describes the research progress of each scheme.

Keywords:NAT traversal;UDP hole punching;STUN;TURN;ICE

0  引  言

1994年,网络地址转换(Network Address Translation,NAT)[1]作为一种解决IPv4地址短缺的方案流行起来,在许多国家广泛使用。时至今日,NAT成为了家庭和中小型办公室路由器上的一个标准实现。虽然NAT提供了许多益处,但仍存在许多缺点,其最大的缺点就是使用了NAT设备私有网络中的主机连接问题。在传统的P2P网络中,端到端通信的两台主机之间的地位是平等的,参与通信的两台主机均可主动发起连接[2]。但NAT设备却使得外网的主机无法主动访问私有网络中的主机,从而破坏了这种通信平等,这一问题严重地阻碍了P2P应用的发展[3]。

为了解决上述问题,NAT穿越技术应运而生,其中UDP打洞、TCP打洞及STUN技术可有效穿越非对称型的NAT设备,而TURN技术通过服务器中继转发可以解决上述方法无法解决的对称型NAT穿越问题。尽管有许多穿越NAT的技术,但没有一种是完美的,所以后来又出现了ICE这类框架,使各种NAT穿越技术可以实现统一,最大程度地保障了NAT穿越的可行性。本文以河南大学计算机网络课程为基础,对NAT穿越技术展开研究,首先阐述NAT的基本概念和类型,之后描述各种实现NAT穿越的解决方案。

1  NAT类型

根据NAT设备内部地址映射的表现不同,可将NAT分为四类,即完全锥型(Full Cone)、限制锥型(Restricted Cone)、端口限制型(Port Restricted Cone)和对称型(Sym- metric)[4]。

(1)完全锥型:将来自相同内部IP地址和端口的所有请求都映射到同一个外部IP地址和端口。任何外部主机都可以通过向映射后的外部地址发送数据包实现与内部主机通信。

(2)限制锥型:将来自同一内部IP地址和端口的所有的请求都映射到同一个外部IP地址和端口。但与完全锥型NAT不同,假设外部主机拥有IP地址X,只有当内部主机先前与IP地址X发送过数据包,内部主机才能接收到外部主机发送的数据包。

(3)端口限制型:与限制锥型NAT相似,但是增加了对端口的限制。详细来说,假设一个外部主机发送的数据包拥有IP地址X源端口号Y,则只有当内部主机先前与(IP:X,Port:Y)发送过数据包,内部主机才能接收到外部主机发送的数据包。

(4)对称型:来自相同IP地址和端口且传送至同一目的IP地址和端口的所有请求都映射为同一个外部IP地址和端口。如果主机通过相同的IP地址和端口向不同的目的地发送数据包,那么将产生不同的映射。而且只有先前收到内部主机数据包的外部主机才能向内部主机成功发送数据包。

2  NAT穿越方案

2.1  UDP打洞

UDP打洞技术的核心在于将请求对等方时的映射添加至地址映射表,以保证后续的数据包可达。这种穿越方案需要具有公网IP地址的第三方服务器进行协助。我们假定主机A与主机B进行通信,两主机均已与第三方服務器建立连接,第三方服务器已获得此连接请求中双方主机的映射地址与端口,下面按照四种情况分别给出穿越策略[5,6]。

(1)情况1:主机A(或B)具有公网IP,另一主机处于私网中。假设主机A具有公网IP,此时主机A想要向主机B发送数据包,因为主机B位于NAT后且先前主机B未与主机A发送过消息,所以此数据包会被丢弃。这时主机A只能向第三方服务器请求打洞。第三方服务器指示主机B向主机A发送打洞消息,因为主机A位于公网,所以主机A可以正确接收消息,当主机A接收到打洞消息后,按此消息中的源地址与源端口号回复应答消息,因为主机B发送打洞消息时,地址映射表中已经具有主机A的表项,所以主机B也能正确接收应答消息。这种打洞方式也称为反向连接。

(2)情况2:主机A(或B)在完全锥型或限制锥型NAT后,另一主机在任意类型NAT后。两主机均位于NAT后,若此前未互通消息,则任一主机发消息均会被丢弃。如图1所示,假设NATA是完全锥型或限制锥型,此时主机A想与主机B通信,主机A首先向服务器请求主机B映射后的公网地址,并向此公网地址定时发送打洞消息,此时主机A的地址映射表中就包含了请求主机B的表项,然后主机A请求服务器协助打洞,服务器将主机A映射后的公网地址发送给主机B并指示主机B向主机A发送打洞消息,此时主机B的地址映射表中也有了请求主机A的表项,主机A和主机B均可接收到对方的打洞消息,通信线路建立。

(3)情况3:主机A、B均在端口限制型NAT后。采用情况2的方法,由于两主机地址映射后的端口未发生改变,所以打洞依然可以成功。

(4)情况4:主机A(或B)在端口限制型或对称型NAT后,另一主机在对称型NAT后。文献[7]给出了一种基于UDP打洞的通信实现。由于位于对称型NAT后的主机的映射端口会随着数据包中目标地址与目标端口的改变而发生变化,UDP打洞方法不适用于对称型NAT。周敏等[8]将UDP打洞与HTTP代理相结合实现了对称型NAT和UDP报文受阻的穿越,保证了即使只允许HTTP传输的NAT也可实现穿越。刘继明等[9]根据对称型NAT的特性,采用端口预测机制实现了对称性NAT的穿越,端口预测机制仅适用于增量型的NAT分配策略,当NAT随机分配端口时,此机制不能正常工作。邱耀群等[10]对对称性NAT采用小范围端口预测机制,在实验结果中使小范围随机型NAT达到了100%的成功率。

2.2  STUN

STUN[11]是一个轻量级的NAT穿越协议,它提供了一个标准的NAT类型检测方法并允许主机得知自己被NAT分配的映射地址和端口,它可以在两主机间具有任意数量的NAT时正常工作,解决了两个重要问题:

(1)获得主机映射后地址与端口。STUN Client向STUN Server发送Binding Request,Binding Request是STUN定义的一种消息类型,当此请求到达STUN Server时,它可能经过了一个或多个NAT,因为当Binding Request经过NAT时,NAT会更改数据包中的源地址和源端口号,结果Server接收到的数据包中的源地址和源端口号就是最靠近Server的NAT分配的公网IP和端口号。STUN Server将此传输地址拷贝至Binding Response的XOR-MAPPED-ADDRESS属性中,并发送至STUN Client。之后STUN Client就可以得知其最外层NAT分配的映射公网地址与端口。

(2)检测NAT类型:

前提条件:STUN Server具有两个公网IP,假设为(IP1,Port1)(IP2,Port2)。

以下为NAT类型检测的流程:

步骤1:选择STUN Server的(IP1,Port1),经过(1)中的交互后STUN Client获得映射后地址与端口,将此地址和端口与发送此数据包时的本地地址与端口比较。如果不匹配,说明STUN Client在NAT后,否则,STUN Client具有公网地址。

步骤2:STUN Client向(IP2,Port2)再次发送Binding Request,如果应答中的地址与端口与步骤1中的地址与端口不匹配,则Client位于对称型NAT后,否则继续步骤3。

步骤3:STUN Client向(IP1,Port1)发送Binding Request并携带改变IP和端口的Flag,STUN Server根据Flag用(IP2,Port2)向源地址发送Binding Response,若STUN Client接收到此应答消息,则Client位于完全锥型NAT后,否则继续步骤4。

步骤4:STUN Client向(IP1,Port1)发送Binding Request并仅携带改变端口的Flag,STUN Server根据Flag用(IP2,Port2)向源地址发送Binding Response,若STUN Client接收到此应答消息,则Client位于限制锥型NAT后,否则位于端口限制型NAT后。

解决上述两个问题后,就可根据UDP打洞策略扩展STUN协议,实现NAT穿越。STUN在穿越环节需要大量信息交换,所以造成了有效数据的传输滞后,文献[12]将数据库技术应用于STUN中,数据库存储公私网映射条目,简化了STUN的交互过程,提高了15%的有效数据传输率。文献[13]将UPnP与STUN结合,通过运用UPnP服务增加了NAT穿越的成功率。

2.3  TURN

TURN是一种使用中继手段实现NAT穿越的方案。它允许主机使用中继手段与对等方交换数据包,允许一个客户端使用一个中继地址与多个对等方通信。TURN协议可以实现所有类型的NAT穿越,包括对称型NAT穿越,但它实现穿越的代价是增加服务器的带宽负担。

如图2的网络拓扑,TURN的交互流程[14]大致如下:

Client可以使用主机传输地址发送TURN消息至TURN Server,消息经过NAT时,源地址与端口会被映射为服务器反射传输地址。在实现中继的过程中,Client首先使用TURN命令在Server上创建一个Allocation,Allocation是一个数据结构,其中包含了Server为Client与Peers实现通信而分配的中继传输地址,Peers可以使用此传输地址中继数据至Client。一个中继传输地址对应一个唯一的Allocation。

当Allocation建立后,Client可以使用TURN消息发送数据至Server并指示发送至哪一个Peer,Server根据指示中继此数据至相应的Peer。而Peer可以将数据发送至一个与Allocation对应的中继传输地址,Server收到数据后将数据包装成TURN消息,中继至相应的Client。这就实现了一次对等主机间的交互。每一个Allocation只属于一个Client,且只包含一个中继传输地址。因此,当数据包到达Server的中繼传输地址时,Server可以识别出数据包对应的Client。

文献[15]在TURN协议上增加了对IPv6的支持,实现了IPv4至IPv6、IPv6至IPv4和IPv6至IPv6的中继方案。文献[16]在原标准中加入了TCP Allocation,为Client分配TCP端口提供了一种解决方案。文献[17]将自动发现机制加入至原有的标准中,避免了手动配置的必要,增强了TURN的可移植性。

2.4  ICE

当前已经有许多协议可以实现NAT穿越,如ALGs、STUN、TURN等,但是这些方案都具有一定的局限性,在应用的实现中更是呈现出零零散散的状态。于是,ICE作为一种NAT穿越的整合框架被定义出来。

ICE[18]是一个使用SDP offer/answer模型[19]建立的基于UDP的多媒体会话的NAT穿越协议。ICE使用STUN协议及其扩展TURN协议,其背后的基本思想是:每一个Agent,即主机,都具有不同类型的候选传输地址,用来使用这些地址同其他Agent进行通信。这些候选传输地址可能是以下几种:

(1)直接与网络接口相联系的传输地址。

(2)位于NAT公共侧的服务器反射传输地址。

(3)TURN Server分配的中继传输地址。

ICE的工作流程如下:

(1)收集候选地址。为执行ICE,Agent需要识别自己所有的Candidate。这些Candidate的关系如图3所示。首先,Host Candidate与本地网络接口相联系,十分容易确定,需要注意的是Host Candidate可能有多个。其次,Agent可以通过STUN或TURN获得其他的Candidate,这些Candidate包括Server Reflexive Candidate和Relayed Transport Candidate。当TURN Server被使用时,这两种Candidate均可通过TURN Server获得,但如果仅仅使用了STUN Server,则只能从中获得Server Reflexive Candidate。在图3中,X:x为Host Candi-date,Y:y为Server Reflexive Candidate,而Z:z是TURN Server分配给Agent的Relayed Transport Candidate。

(2)连接性检测。一旦Agent获得它所有的Candidate,它就对其以从高到低的优先级进行排序,并将这些Candidate放入SDP offer中发送给要进行通信的另一方Agent。当另一方收到此Offer,也会进行相同的处理,将自身的Candidate列表作为应答送回。最终两Agent均具有自身及对方的所有Candidate。他们将两列表中的Candidate两两组合形成一个Check List。列表中的每一个Check都是一次STUN Request/Response交互,其中STUN Request从Local Candidate发往Remote Candidate。

连接性检测的基本准则十分简单:

(1)使用特定算法对 进行优先级排序;

(2)根据优先级顺序在每一Candidate Pairs间发送Check消息;

(3)从其他Agent接收Check确认。

实际上,Candidate Pairs的一次检测过程即是一个四次握手的交互过程,如图4所示。

(3)断定ICE。在连接性检测过程中会出现连接成功的Candidate Pair,ICE安排两Agent之一来确认用来进行后续媒体通信的合法Candidate Pair,此Agent称为Controlling Agent。确认最终Candidate Pair有两种策略,即Regular Nomination和Aggressive Nomination。前者是在Controlling Agent找到合法的Pair后再发送一个额外的STUN Request,并在请求中添加完成标志以告知另一Agent。而后者则要求Controlling Agent的每一个STUN Request都带有完成标志,第一次检测成功后,Controlling Agent就无需再发送额外的请求,这种方式更加快速,但缺乏灵活性。在找到合法的Candidate Pair后通信双方就可以顺利地进行后续的媒体通信。

文献[20]使用NAT类型对连通性检测过程进行制约,避免了多余的地址对检测,缩短了连通性检测时间。文献[21]则调整了检测过程,将收集-检测过程分类多次执行,尽可能减少对候选地址的收集,减少了连通性检测时间,提高了NAT穿透效率。

3  结  论

本文总结提炼一些主流可行的NAT穿越技术,首先说明NAT产生的背景以及其对P2P网络通信带来的问题,之后详细地阐述的NAT的不同类型,剖析了不同类型NAT所具有的特性,最后详细描述了四种NAT穿越方案,即UDP打洞、STUN协议、TURN协议和ICE框架,并说明了各方案近期的研究进展。其中UDP打洞简单易实现,但欠缺安全性且不能穿透对称型NAT;STUN协议灵活易扩展,且可以实现多级NAT穿越,但不可实现对称型NAT穿越;TURN协议可以实现任何类型的NAT穿越但会增加服务器的带宽负担;ICE整合了多种NAT穿越协议,安全可靠、局限性小但是实现相对复杂。本文为具有P2P通信需求的应用程序提供了一系列灵活有效的方案實现NAT穿越,在实际应用中可根据所处的网络环境,选择合适的解决方案以满足项目需求。

参考文献:

[1] SRISURESH P,EGEVANG K. Traditional IP Network Address Translator (Traditional NAT) [M]. RFC Editor,2001:1-2.

[2] 贺文华,刘浩,贺劲松.P2P网络现状与发展研究 [J].软件工程,2019,22(4):1-5.

[3] 曹申会.NAT穿越技术的研究与实现 [D].南京:南京邮电大学,2013:8-11.

[4] ROSENBERG J,WEINBERGER J,HUITEMA C,et al.STUN-Simple traversal of user datagram protocol (UDP) through network address translators (NATs) [J]. Ietf Rfc,2003:5-6.

[5] 姚秋红.基于P2P的网络视频会议系统的研究和开发 [D].上海:上海交通大学,2010:38-40.

[6] FORD B,SRISURESH P,KEGEL D. Peer-to-Peer Communication Across Network Address Translators [C]. USENIX Annual Technical Conference,Anaheim,CA,2005:13.

[7] 李自薦,赵顺,刘宏,等.P2P网络通信中NAT穿越技术的研究及实现 [J].数字技术与应用,2015(8):34-35.

[8] 周敏,余慕春,黄维丰.综合UDP打洞与Http代理的SIP穿越NAT方案 [J].计算机技术与发展,2014,24(8):147-151+156.

[9] 刘继明,马乐,李波.一种基于NAT穿越的优化STUN算法 [J].西安邮电大学学报,2019,24(3):19-24.

[10] 邱耀群,金光,江先亮,等.对称型NAT穿越技术的研究 [J].移动通信,2015,39(7):57-60+65.

[11] ROSENBERG J,MAHY R,MATTHEWS P,et al.Session traversal utilities for NAT (STUN):RFC 5389 [S].IETF,2008:5-8.

[12] 杨金花.STUN技术通信问题的研究 [J].电子设计工程,2015,23(6):92-94+98.

[13] 任浩,王劲林,鲁逸峰.UPnP和STUN相结合的NAT穿越技术研究 [J].计算机工程与应用,2009,45(2):99-101.

[14] MAHY R,MATTHEWS P,ROSENBERG J.Traversal Using Relays around NAT (TURN):Relay Extensions to Session Traversal Utilities for NAT (STUN):RFC 5766 [S].IETF,2010:5-11.

[15] CAMARILLO G,NOVO O,PERREAULT S.Traversal using relays around NAT (TURN) extension for IPv6:RFC 6156 [S].IETF,2011:4-10.

[16] PERREAULT S,ROSENBERG J.Traversal using relays around NAT (TURN) extensions for TCP allocations:RFC 6062 [S].IETF,2010:6-11.

[17] PATIL P,REDDY T,WING D,.Traversal using relays around NAT (TURN) server auto discovery:RFC 8155 [S].IETF,2017:4-9.

[18] ROSENBERG J.Interactive connectivity establishment (ICE):A protocol for network address translator (NAT) traversal for Offer/Answer protocols:RFC 5245 [S].IETF,2010:6-16.

[19] ROSENBERG J,SCHULZRINNE H.An Offer/Answer model with the session description protocol (SDP):RFC 3264 [S].IETF,2002:3-5.

[20] 王梦杰,何加铭.基于ICE的SIP穿越NAT方法的研究 [J].移动通信,2015,39(2):45-50.

[21] 刘继明,王逸凡,吕芳,等.一种优化连接速率的ICE算法实现 [J].西安邮电大学学报,2017,22(6):92-97.

作者简介:陈恒勋(1998-),男,汉族,河南商丘人,本科在读,研究方向:移动Adhoc网络;通讯作者:闫永航(1981-),男,汉族,河南周口人,副教授,研究生导师,博士,研究方向:互联网体系结构、移动Ad hoc网络、网络安全、物联网、区块链;孟丹(1995-),女,汉族,河南商丘人,硕士研究生,研究方向:网络体系结构;夏伦(1996-),男,汉族,河南信阳人,硕士研究生,研究方向:网络体系结构。