关于TCP穿越NAT技术的研究与分析

  • 格式:pdf
  • 大小:192.74 KB
  • 文档页数:3

信息安全与通信保密・2008.4学术研究A c a d e 47马义涛,薛质,王轶骏(上海交通大学信息安全工程学院,上海 200240)【摘 要】论文主要论述了NAT原理和基于TCP协议的NAT穿越技术的原理,主要分析了一种最简单但最健壮且实际有效的穿越NAT技术,也就是TCP打洞技术[6]。

文章在分析目前常用的TCP打洞技术(例如NATBlaster[4])的基础上,提出了一种新的TCP打洞技术。

新技术的穿越成功率比以往技术提高了5%。

【关键词】网络穿越;打洞技术;NAT;P2P[7];STUNT[3]【中图分类号】TP309 【文献标识码】A 【文章编号】1009-8054(2008) 04-0047-03Study and Analysis on TCP Traversal through NAT *MA Yi-tao, XUE Zhi, W ANG Yi-jun(Institute of Information Security Engineering, Shanhai Jiaotong University, Shanghai 200240, China)【Abstract 】The principles of both Network Address Translation(NAT) and NAT Traversal techniques based on TCP protocol are described in this paper. The paper focuses on a simple but robust NAT Traversal technique, which is known as "TCP Hole Punching". In addition, this paper analyzes some defects of the currently used "TCP Hole Punching", i.e.NATBalster [4], and provides some improved methods toward them. The success rate is increased by 5 percent.【Keywords 】TCP traversal; hole punching; network address translator; peer to peer; STUNT关于TCP穿越NAT技术的研究与分析*0 引言P2P技术使得网络上的资源得到充分的利用和最大化的共享,从而P2P应用也得到了快速发展,主要表现在实时通信、协同工作、内容分发和分布式计算等各个领域。

然而,目前普遍使用的NAT技术却给P2P通信带来了一个重要的问题:端到端间的TCP连接。

利用TCP穿越技术可以解决这个问题。

本文将主要论述一种位于不同NAT设备后面的PC间建立TCP连接的方案,也就是“打洞技术”。

在目前常用穿越技术的基础上,本文分析并改进了现有的TCP打洞技术(即NATBlaster),提出了一种新的TCP打洞技术。

经过在多种网络环境下测试,发现新的打洞技术的成功率提高了5%。

1 NAT原理在深入研究TCP打洞技术之前,一定要清楚地了解NAT原理和设备的具体行为特性,因为这些行为特性直接影响着具体的TCP打洞技术的实现。

在所有NAT设备中最常见的是传统NAT设备[1],而此类设备主要分为两种:基本NAT和NAPT。

本文将主要讨论后者,也就是NAPT。

由于内部网络结点的内部IP地址在Internet上是非法的,所以一定要经过网络地址转换后以合法IP的身份来访问Internet。

例如:内网主机A(192.168.47.108)想访问外网服务器S(218.193.187.16),那么A将发送数据包给S:192.168.47.108:23→218.193.187.16:80;当此数据包到达NAPT设备时,NAPT将会修改此数据包的源地址和端口,并在映射表中添加映射关系条目,然后将数据发送出去:202.120.36.181:5000→218.193.187.16:80。

外网服务器发送的回应数据包:218.193.187.16:80→202.120.s e a r c h学术研究36.181:5000;当NAPT收到此包后,检查映射关系表,然后修改数据包并转发:218.193.187.16:80→192.168.47.108:23。

具体的流程请参考图1。

2 TCP穿越NAT原理及其分析要实现TCP穿越NAT或者防火墙,位于NAT或者防火墙设备后的Client PC一定要清楚地了解所处NAT设备的行为特性,这样才能针对此类设备设计不同的打洞技术,从而实现TCP穿越的成功。

所以穿越NAT和防火墙需要三个必要的步骤:(1) 所处NAT设备的行为特性诊断和收集。

(2) 端口预测。

(3) TCP打洞。

本文将基于NATBlaster来讲解穿越NAT原理,并分析其优点和不足,最后给出一种改良的TCP打洞技术。

2.1 NAT设备行为特性的诊断在给出具体的诊断策略之前,文中假设了这样一个典型的网络环境:位于不同NAT设备之后的两台Client PC间的P2P通信。

NAT设备行为特性的诊断和获取,要借助于第三方STUNT服务器:每台NAT后的Client PC通过与STUNT服务器会话,从而可以获得自身及对等体的内部和外部IP/Port对;通过与STUNT服务器的会话测试集,可以诊断出所属NAT设备的行为特性。

2.2 端口预测利用STUNT协议,Client PC可以通过详细的会话测试集得到关于所属NAT设备的映射特性具体值、过滤特性具体值。

根据NAT设备的这些特性,可以来判断Client PC的端口是不是可以预测的。

如果同时从Client PC的两个连续端口分别向STUNT服务器建立两个连接,经过会话分析后发现,被映射的外部端口也是连续的,那么Client PC的端口是可以预测的。

例如:a:p→S:R和a:p+1→S:R经NAT后修改为:A:P→S:R和A:P+1→S:R。

如果从Client PC的同一端口发往同一IP地址的数据包被映射到相同的外部端口,那么也称此端口是可以预测的。

例如:a:p→S:R和a:p→S:Q经NAT后修改为:A:P→S:R和A:P→S:Q。

通过会话测试集测试以后,如果Client PC的端口是可以预测的,那么Client PC经STUNT服务器可以获知对等实体的内部和外部IP/Port对,从而可以比较简单地实现TCP打洞;否则,相应的打洞技术十分复杂而且可靠性和效率不高。

2.3 TCP打洞Client PC获得了所属NAT设备的行为特性后,就可以针对不同特性采取稍微不同的打洞技术来建立端到端直接的TCP连接,进而实现通常的TCP通信。

在此假设ClientPC所属的NAT设备是NB=ADP[3]和EF=ADP[3]类型,因为此类型的NAT设备在网络环境中使用得较多且比较典型。

目前流行的NATBlaster打洞技术的具体打洞时序流程如图2所示。

详细步骤如下:第一步,Client A发送SYN[5]数据包给Client B,但此SYN数据包应具有适当的TTL值,使得此数据包会通过NAT A而不会到达NAT B,从而完成了对NAT A的打洞;另外,Client A还利用libpcap库来侦听数据包获得SYN包的序列号(利用libpcap库来侦听)。

对于Client B完成同样的工作。

第二步,NAT A/B会收到ICMP差错包后简单地丢弃。

第三步,通过STUNT服务器S,Client A和B交换SYN包序列号,以供后续SYNACK使用。

第四步,Client A和B分别向对方发送SYNACK包(利用libnet库),而后又发送确认ACK包,从而TCP三次握手成功,最终在Client A和B间成功建立了直接的TCP连接。

2.4 NATBlaster分析及改进利用NATBlaster技术,可以成功地穿越行为特性良好的NAT设备。

这些良好的行为特性包括:具有可以预测的图1 NAPT数据包转换图2 NATBlaster技术时序信息安全与通信保密・2008.4学术研究A c a d e 49端口,对于错误的数据包NAT设备只是简单的丢弃等。

另外,NATBlaster比较容易实现,有较好的健壮性和适应性。

而对于行为特性不好的NAT设备,通过NATBlaster技术也可以成功地实现网络穿越。

但是,根据NATBlaster的原理可以得知这项技术也有其自身的不足之处:它要求选择适当的TTL值;要求NAT设备忽略ICMP错误;如果NAT设备有改变SYN包的序列号的不良行为特性,那么NATBlaster技术将会失败。

鉴于NATBlaster上述的不足,文中改进了NATBlaster技术并提出了如图3所示的打洞技术,新的打洞技术的具体步骤如下:第一步,Client A发送SYN[5]数据包给Client B,但此SYN数据包应具有适当的TTL值,使得此数据包会通过NAT A而不会到达NAT B,这样就简单地完成了对NAT A的打洞:NAT A将允许来自于Client B的数据包SYN通过。

第二步,NAT A/B会收到ICMP差错包后简单地丢弃。

第三步,Client B首先发送SYN包给Client A,进行TCP连接的三次握手;最终在Client A和B间成功建立直接的TCP连接。

新技术第一步中由于发送的SYN包带有适当的TTL(Time To Live)值,所以NAT A不会收到RST应答包,而仅仅是收到ICMP TTL超时差错包,这样就保证了在NATA上打的洞的正常打开状态,从而保证了NAT穿越的成功。

另外,对于适当的TTL值,通过使用类似Tracerouter[2]的技术可以获得。

在具体的实现中可以通过setsockopt()函数来设置每一次测试的TTL值,不过在TCP连接建立以后一定要把TTL值恢复到默认值,这样才能保证后续的数据包正确地到达目的地。

在NATBlaster技术中,由于发送的SYNACK包带有对上一次对方发送的SYN包的确认,所以其中包括了对方SYN包的序列号,然而在技术设计上没有让SYN包到达对方客户机。

因此必须采取一种策略使得双方Client在发送SYNACK包之前都能够获得对方上次发送的SYN包的序列号。

NATBlaster采用了libpcap库来侦听已发送SYN包的序列号,并通过STUNT服务器交换Client双方的SYN包序列号,而且libpcap库的使用还要求用户的管理员权限级别。