NAT以及内网穿透

NAT

NAT分两种类型:NAT和NAPT。

NAT(Network Address Translation)网络地址转换

NAT属接入广域网(WAN)技术,是一种将私有(保留)地址转化为合法IP地址的转换技术,它被广泛应用于各种类型Internet接入方式和各种类型的网络中。原因很简单,NAT不仅完美地解决了lP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。NAT(Network Address Translation,网络地址转换)是将IP数据包头中的IP地址转换为另一个IP 地址的过程。在实际应用中,NAT 主要用于实现私有网络访问公共网络的功能。这种通过使用少量的公有IP 地址代表较多的私有IP地址的方式,将有助于减缓可用IP 地址空间的枯竭。

NAPT(Network Address Port Translation)网络地址端口转换

NAPT是人们比较熟悉的一种转换方式。NAPT普遍应用于接入设备中,它可以将中小型的网络隐藏在一个合法的IP地址后面。NAPT与动态地址NAT不同,它将内部连接映射到外部网络中的一个单独的IP地址上,同时在该地址上加上一个由NAT设备选定的TCP端口号。NAPT是一种较流行的NAT的变体通过转换TCP或UDP协议端口号以及地址来提供并发性。除了一对源和目的IP地址以外,这个表还包括一对源和目的协议端口号,以及NAT盒使用的一个协议端口号。NAPT的主要优势在于,能够使用一个全球有效IP地址获得通用性。主要缺点在于其通信仅限于TCP或UDP。只要所有通信都采用TCP或UDP,NAPT就允许一台内部计算机访问多台外部计算机,并允许多台内部主机访问同一台外部计算机,相互之间不会发生冲突。

NAPT的四种类型

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

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

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

  4. 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方式,其不仅体现在转换关系的建立上,而且还体现在对外部报文来源的限制方面。

内网穿透

内网穿透是一个比较大的研究问题,这里只是根据自己的理解对其进行简答的原理描述而已。

内网穿透的实现方法根据不同A、B双方不同的NAPT类型而不同,一般如果两侧的NAT类型都是Cone NAT类型,那么就可以实现双向的通讯。如果两侧都是Symmetric NAT,或是一侧是Symmetric NAT另一侧是Port Restricted Cone,那么将不能实现双向通讯。

由于内网机器可以访问外网的机器,而外网的机器不能访问内网的机器,之所以不能访问,那是因为在内网端的NAT上没有对应的内网机器IP端口转换记录,所以NAT找不到对应的内部机器,所以直接的把数据包给丢掉。所以,如果想要实现内网穿透,那么就必须要先知道内网机器在NAT上的所对应的公网IP:Port信息,而且必须让NAT产生这条信息。那么怎么才可以使得内网的NAT产生该信息,而且另一端能获得这条转换后的公网IP:Port信息呢?此时需要第三方公网服务器S的支持。

内网机器A发送一条信息给公网服务器S,公网服务器得到了A经过NAT转换后的公网IP:port信息,并记录下来,另一侧的内网机器B同样发送信息给公网服务器S,S得到了B的转换后的公网IP:Port信息,此时在A的NAT和B的NAT都分别产生了A和B的内网IP:Port转换为公网IP:Port的映射信息,在S把对方的转换后的公网IP:Port信息分别告诉给A、B后,就可以根据不同的NAT类型来实现内网的穿透了。

  1. Full Cone NAT类型的最容易,因为不会对外网的请求来源进行限制,所以可以直接进行双向通讯了。

  2. Restricted Cone NAT类型和Port Restricted Cone NAT类型需要有一侧发起第一次注定失败的请求,例如:B发起对A的请求,此时在B的NAT上就会有B对A的请求记录,但是在A的NAT上面并没有对应的A请求B的记录,所以B发起的请求会被A的NAT给丢弃,但是此时的B已经对A打好洞了,所以如果此时A发起请求,或是数据给B(A侧打洞),那么由于B的NAT有对应的B请求过A的记录,所以数据包能以顺利的到达B。那么在数据顺利到达B后,由于A给B发送了数据(不管成功或失败),才是在A的NAT上也有对应的A请求过B的记录,所以此时如果有新的B的数据包发给A,那么A的NAT就会直接的根据映射将数据包转给A,实现了B与A的通信。

  3. Symmetric NAT,由于该类型的NAT的映射对象不是内网的IP:Port,而是外网的IP:Port信息,所以对不同的外网IP:Port请求会得到不同的IP:port转换,请求服务器S会得到一条IP:Port转换,请求对侧也会得到一条不同的IP:Port转换,又由于ymmetric NAT对外部返回报文来源的限制是与Port Restricted Cone一致的,所以这种类型不能实现双方的通讯。

对于内网穿透,网上一般都是UDP实现的,而且该技术已经很成熟了,对于TCP的实现,有说可以实现的,有说不可以实现的,由于自己没有具体的写代码实现过,不过感觉根据UDP的实现思路,TCP应该也是可以实现内网穿透的!