P2P 网络中的NAT 穿越方案
2013-11-25李筱楠
李筱楠 刘 洋 郑 华
(石家庄铁路职业技术学院 河北石家庄 050041)
1 引言
近年来,基于P2P 技术的网络应用发展迅速,P2P 通信极高的带宽利用率给用户带来了巨大的便利。而目前被大量部署使用在IPV4 网络中的NAT 设备却严重阻碍了P2P 应用的发展。NAT 本身的工作特性,导致处于不同网络环境中的主机无法建立有效的对等连接,主机之间的点对点通信变得很困难,也就意味着大部分P2P 应用将无法运行在部署了NAT 网关的内部网络中。为了保证P2P连接在各种网络环境的有效性,需要有一套行之有效的NAT 穿越方案。
2 NAT 技术
NAT[1](Network Address Translation,网络地址转换)是一种在IP 数据包通过网关时重写其源地址、目的地址的技术。这种技术被广泛应用于局域网中,供多台主机共享一个公网IP 访问Internet时用。NAT 不仅缓解了IPv4 地址紧缺的问题,而且能够有效隐藏并保护内部网络,使内网主机免遭来自Internet 的扫描和攻击。
NAT 的工作原理[2]如图1 所示:内网主机Client 通过NAT 向Internet 主机Server 发送数据,当数据经过网关时,NAT 会自动修改该IP 报文头部的源IP 和源端口,并在本地NAT 映射表中添加一条相对应的映射关系,然后再将修改过的报文发送给Server。Server 回应给Client 的数据同样需要经过网关的修改和转发,但是网关在转发来自Internet 的数据时,会首先检测NAT 映射表中有没有与目标地址相对应的映射关系,如果有,则修改报文头部并转发;如果没有,则将报文丢弃。
NAT 的映射关系具有时效性。如果通信双方采用TCP 连接,当TCP 连接断开时(网关收到Fin包),NAT 就会将该连接的映射关系从映射表中删除;如果双方采用UDP 通信,网关则会根据设置在一定时间后自动将NAT 映射关系删除。
由于NAT 只对内部网络透明,导致通信双方的连接建立过程只能从内向外单方向发起,内网主机能访问Internet,却不能作为服务器向Internet 提供服务。其原因在于:
图1 NAT 工作原理
(1)内网主机的IP 是私有IP,在Internet 上无效,这代表内网主机对于Internet 来说是不可见的。
(2)即使内网主机的公网地址已被其它主机获知,但由于网关的NAT 映射表中没有相应映射关系存在, Internet 向内部网络发起的连接数据依旧会被NAT 丢弃。
因为同样的原因,分属不同局域网的主机若要实现互访就更加困难,P2P 通信在建立连接的阶段就被NAT 所阻断。
3 NAT 穿越方案
目前,大多数的NAT 穿越方案都需要对现有网络设备进行改造或升级,而且运行效率不高,对网络传输速度的影响也比较大。相对较成熟的NAT 穿越方案有以下几种:
3.1 ALG 方案
ALG[3] (Application Level Gate,应用层网关)作为最早的NAT 穿越方案,ALG 是对NAT 技术的一种升级。NAT 只转换IP 报文头部的地址信息,而对报文数据中记录的IP 和端口则不加处理。这就可能会导致一些需要在数据中发送连接消息的应用层协议,如FTP、SIP、H.323 等,其地址信息在经过NAT 转发后变成了错误数据。而ALG 实现了对应用层协议的识别,以及对报文内部IP 地址、端口信息的转换,在ALG 的作用下,各种应用层协议数据可以正确地通过转发。
ALG 方案实现简单,缺点也非常明显。其工作原理使得每次有新应用层协议出现,都需要对所有ALG 设备进行升级,以保证ALG 对该协议的识别和转换。另外,ALG 转换过程中需要分析数据包内容,所以数据不能加密传输,传送必须采用明文,安全性较差。而且,ALG 的处理速度缓慢,可能导致整个网络堵塞。
3.2 MIDCOM 方案
MIDCOM[4](Middle-Box Communications)是由IETF 制定的一种NAT 穿越方案,该方案解决了ALG 可扩展性弱及转发效率低的问题。MIDCOM 由两部分组成:部署于网关的Middle-Box 和部署于可信第三方的MIDCOM Agent。MIDCOM 的基本思想是:通过MIDCOM 协议连接Middle-Box和MIDCOM Agent,应用层协议的识别和地址信息的转换由MIDCOM Agent 完成,Middle-Box 只需要接受MIDCOM Agent 的控制打开或关闭端口即可。
数据的集中化处理增强了MIDCOM 方案的可扩展性,如果有新的协议出现,仅需要对MIDCOM Agent 进行升级即可。另外,MIDCOM Agent 支持对控制报文和媒体流的加密识别,数据传输可以加密,传输安全性高。但是,部署MIDCOM 方案要求改造本地NAT 设备使其支持MIDCOM 协议,以目前的网络覆盖程度来说,为了实施一种NAT 穿越方案大规模而更新网络设备显然并不现实。
3.3 基于客户端的方案
实现NAT穿越的另一途径是从客户端进行:如果P2P连接建立前客户端已经得知自身的公网IP,并通过某种方法预先在网关上建立了一条指向自己的NAT 映射关系;那么通信时客户端就可以将自身公网IP 作为源IP,已建立NAT 映射的端口作为源端口写入报文内容中。报文内容无需再次转换,经过NAT 时也就不会出错了。以这种方式穿越NAT 无需对网络设备进行更新,只需要在Internet中建立一个或多个特殊的服务器,供内网主机获取自身公网IP,相对基于网络设备的方案来说,成本较低。但是部署过程中,所有的客户端到要安装相应的程序,因此普及难度也很大。
目前,基于客户端的NAT 穿越方案已经出现,但是因为各种方案使用的协议无法统一,而且该方式并不是对所有的NAT 系统都有效,所以没有得到普及,其中比较成熟的方案有TURN、STUN 等。
4 通过STUN 穿越NAT
STUN[5](Session Traversal Utilities for NAT,NAT 会话传输应用程序)是一个简单的客户端、服务器协议。在STUN系统中定义了两类不同的实体——位于内部网络的STUN Client和位于Internet中的STUN Server。其穿越过程如下:Client 通过NAT 向Server 发送请求,Server 收到后,将以Client的地址信息为内容产生回馈消息,Client 通过消息内容即可得知自身的公网IP 和NAT 为自己打开的端口号。由于Client 和Server 通信时网关已经为其建立了NAT 映射关系,以后的数据连接直接利用这条记录就可顺利穿越NAT。
4.1 STUN 实现P2P 连接
在P2P 网络中,两台主机ClientA 和ClientB 可以通过STUN 穿越NAT 建立直接连接,其过程如下:
(1)ClientA 向STUN Server 发送消息,请求STUN Server 帮助建立与ClientB 的连接。
(2)STUN Server 收到请求后,将ClientB 的Transport Address(包含客户端的内网和公网IP、端口)发给ClientA,同时将ClientA 的Transport Address 发给ClientB。
(3)ClientA 收到ClientB 的Transport Address 信息后,开始向Transport Address 中的两个IP(ClientB 的公网IP 和内网IP)发送数据包,并自动锁定相应较快的那个作为通信IP。
(4)ClientB 收到STUN Server 发来的Transport Address 信息后,也会试图向ClientA 的发送数据,以便双方建立连接。
ClientA 和ClientB 发送数据的时间没有先后要求,只要双方都能够和STUN Server 正常通信,一般都能建立P2P 连接,但是在不同的网络拓扑结构中,连接建立流程也有所不同。
4.2 穿越单NAT 建立连接
如果客户端属于相同局域网,位于同一NAT 之后,其拓扑如图2 所示,其连接过程如下:
(1)ClientA 登录STUN Server。NAT 为这次会话分配的端口是5678,Server 记录ClientA 的公网地址是222.30.160.1:5678,内部地址是:192.168.18.35:1234。
(2)ClientB 登录STUN Server。NAT 为这次会话分配的端口是5679,Server 记录ClientB 的公网地址是222.30.160.1:5679,内部地址是:192.168.18.37:1234。
图2 客户端位于单个NAT 之后
(3)ClientA 通过STUN Server 向ClientB 发起连接,Server 告知通信双方,对方的公网地址和内部地址。
(4)ClientA 和ClientB 分别向对方的公网地址和内部地址发送数据包。对于发向公网地址的数据包,由于ClientA 和ClientB 位于同一NAT 后,只有在NAT 支持hairpin 转换,也就是同一IP 不同端口之间的数据转发时,数据包才能到达;对于发向内部地址的数据,由于ClientA 和ClientB 属于同一局域网,那么数据也会到达,并且更快。因此,ClientA 和ClientB 将会选择后一种方式进行后续的数据发送。
4.2 穿越多NAT 建立连接
如果客户端分属不同局域网,位于多个NAT 之后,其拓扑如图3 所示,其连接过程如下:
图3 客户端位于多个NAT 之后
(1)ClientA 登录STUN Server。NATA 为这次会话分配的端口是5678,Server 记录ClientA 的公网地址是222.30.160.1:5678,内部地址是:192.168.18.35:1234。
(2)ClientB 登录STUN Server。NATB 为这次会话分配的端口是5678,Server 记录ClientB 的公网地址是124.236.200.98:5678,内部地址是:10.10.10.10:1234。
(3)ClientA 通过STUN Server 向ClientB 发起连接,Server 告知通信双方,对方的Transport Address。
(4)ClientA 和ClientB 分别向对方的Transport Address 发送数据包。由于ClientA 和ClientB 属于不同局域网,发往内部地址的数据无法到达,ClientA 和ClientB 只能通过公网地址建立连接。
(5)ClientA 向124.236.200.98:5678 发送数据,但由于NAT 映射关系的时效性,数据经过NATB时会可能会被丢弃,连接暂时无法建立,这时ClientA 只能等待。
(6)直到ClientB 向222.30.160.1︰5678 发送数据后,NATB 中才能建立映射关系,这时ClientA再向ClientB 发送数据,就不会被丢弃了。
(7)ClientA 和ClientB 之间通过公网地址建立P2P 连接。
如果ClientA 和ClientB 所在的网络环境更加复杂,使用STUN 建立P2P 连接的成功率,以及最后的连接效果可能会有所下降,但是与基于硬件的NAT 穿越方式相比,利用STUN 穿越NAT 无疑是一种更加方便有效的手段。
5 结语
本文提出了一种利用STUN 协议穿越NAT 建立P2P 连接的方案,在不需要更新网络设备和修改现有NAT 规则的前提下,实现了大多数网络环境中的NAT 穿越,与以往的NAT 穿越方案相比,其效率以及穿越成功率都有提升。虽然目前IPV6 网络已经逐渐普及,但是在未来很长时间内,IPV4网络还会继续存在,NAT 依旧有其无可替代的作用,因此,本文提出的NAT 穿越方法对于未来的网络应用也有一定的借鉴价值。
[1]K. Egevang, P Francis The IP Network Address Translator (NAT) RFC 1631 Network Working Group May 1994
[2]W. Richard Stevens TCP/IP 协议详解(卷 I): 范建华,晋光辉,张涛等译.北京机械工业出版社,2000.24~243
[3]P.Srisuresh, M.Holdrege IP Network Address Translator (NAT) Terminology and Considerations RFC2663 Network Working Group August 1999
[4]Bryan Ford. NatCheck: Hosted by the MIDCOM-P2P project on SourceForge.
[5]J. Rosenberg, R. Mahy Session Traversal Utilities for NAT (STUN) RFC5389 Network Working Group October 2008