前言

这种方法从安全的角度来说是利用了目前路由器实现对称NAT的方法中存在端口可以预测的漏洞,利用这个漏洞来实现打洞。加上一次发送大量的包,来增加命中的概率。

参考资料

整理翻译自A New Method for Symmetric NAT Traversal in UDP and TCP
NAT的四种类型及类型检测

关键字

NAT穿透,对称NAT,UDP,P2P,状态包预测,TCP,P2P打洞

4中NAT类型

用语定义

1.内部Tuple:指内部主机的私有地址和端口号所构成的二元组,即内部主机所发送报文的源地址、端口所构成的二元组
2.外部Tuple:指内部Tuple经过NAT的源地址/端口转换之后,所获得的外部地址、端口所构成的二元组,即外部主机收到经NAT转换之后的报文时,它所看到的该报文的源地址(通常是NAT设备的地址)和源端口
3.目标Tuple:指外部主机的地址、端口所构成的二元组,即内部主机所发送报文的目标地址、端口所构成的二元组

详细释义

  1. Full Cone NAT:所有来自同一 个内部Tuple X的请求均被NAT转换至同一个外部Tuple Y,而不管这些请求是不是属于同一个应用或者是多个应用的。除此之外,当X-Y的转换关系建立之后,任意外部主机均可随时将Y中的地址和端口作为目标地址 和目标端口,向内部主机发送UDP报文,由于对外部请求的来源无任何限制,因此这种方式虽然足够简单,但却不那么安全.

  1. Restricted Cone NAT: 它是Full Cone的受限版本:所有来自同一个内部Tuple X的请求均被NAT转换至同一个外部Tuple Y,这与Full Cone相同,但不同的是,只有当内部主机曾经发送过报文给外部主机(假设其IP地址为Z)后,外部主机才能以Y中的信息作为目标地址和目标端口,向内部 主机发送UDP请求报文,这意味着,NAT设备只向内转发(目标地址/端口转换)那些来自于当前已知的外部主机的UDP报文,从而保障了外部请求来源的安 全性

  1. Port Restricted Cone NAT:它是Restricted Cone NAT的进一步受限版。只有当内部主机曾经发送过报文给外部主机(假设其IP地址为Z且端口为P)之后,外部主机才能以Y中的信息作为目标地址和目标端 口,向内部主机发送UDP报文,同时,其请求报文的源端口必须为P,这一要求进一步强化了对外部报文请求来源的限制,从而较Restrictd Cone更具安全性

  1. Symmetric NAT:这是一种比所有Cone NAT都要更为灵活的转换方式:在Cone NAT中,内部主机的内部Tuple与外部Tuple的转换映射关系是独立于内部主机所发出的UDP报文中的目标地址及端口的,即与目标Tuple无关; 在Symmetric NAT中,目标Tuple则成为了NAT设备建立转换关系的一个重要考量:只有来自于同一个内部Tuple 、且针对同一目标Tuple的请求才被NAT转换至同一个外部Tuple,否则的话,NAT将为之分配一个新的外部Tuple;打个比方,当内部主机以相 同的内部Tuple对2个不同的目标Tuple发送UDP报文时,此时NAT将会为内部主机分配两个不同的外部Tuple,并且建立起两个不同的内、外部 Tuple转换关系。与此同时,只有接收到了内部主机所发送的数据包的外部主机才能向内部主机返回UDP报文,这里对外部返回报文来源的限制是与Port Restricted Cone一致的。不难看出,如果说Full Cone是要求最宽松NAT UDP转换方式,那么,Symmetric NAT则是要求最严格的NAT方式,其不仅体现在转换关系的建立上,而且还体现在对外部报文来源的限制方面。

已经存在的穿透方案

UPNP,STUN,Teredo等都无法支持对称NAT(第4类NAT)穿透。

新方法

新方法的UDP打洞基于端口预测和限制TTL的值。也适用于其他的NAT类型。
新方法一共有3个阶段。

第一阶段

假设两个通讯的终端分别为echo client和echo server。

F1:echo client跟S1通讯,然后S1获得其经过NAT a的端口号。
F2:S1返回获得的端口号给echo client
F3:echo client给S2发一个包。包括上次S1返回的nat之后的端口号。S2记录下相关的NAT端口信息。

第二阶段

第二阶段是echo server跟S1和S2通信。流程跟echo client类似。

第三阶段

经过之前的通讯,服务器可以获得echo client和echo server两次nat的端口号。比如echo client第一次nat端口为5361,第二次nat端口为5362,那么有理由猜测,第三次的端口为5363.经过测试发现端口的变化多是有一定的规律,递增,递减,跳跃等。

F7: 基于前面两个阶段的通信,可以预测打洞的端口和打洞的模式。发送给echo server.
F8: 基于预测的端口,echo server发送大量的包。这些包包括一个固定的目的端口和低的TTL值。
F9: 同理,服务器将预测的端口发给echo client,跟F7类似。
F10: 基于预测的端口,echo client发送大量固定端口的数据包到预测的端口。之后,echo client 转换到接受模式。

如果预测的端口刚好被大量的包都命中。那么就可以建立通信。

新方法的优势

结论

这种方法从安全的角度来说是利用了目前路由器实现对称NAT的方法中存在端口可以预测的漏洞,利用这个漏洞来实现打洞。加上一次发送大量的包,来增加命中的概率。

转自:http://xdxd.love/2016/10/18/%E5%AF%B9%E7%A7%B0NAT%E7%A9%BF%E9%80%8F%E7%9A%84%E4%B8%80%E7%A7%8D%E6%96%B0%E6%96%B9%E6%B3%95/

发表评论

邮箱地址不会被公开。 必填项已用*标注