NAT+穿洞基础知识梳理

参考:https://www.cnblogs.com/shilxfly/p/6589255.html

https://blog.csdn.net/phoenix06/article/details/70139756

https://www.cnblogs.com/wangle1001986/p/6083871.html

 

1 NAT 产生背景

互联网中主要依靠IP进行寻址,IPv4地址使用32个比特位进行标记,一般使用点分十进制形式书写。有类IP分类如表1-1所示:

                                               表 1-1 有类IP分类

网络类型
特征地址位
起始地址
结束地址
默认子网掩码
A 0 1.0.0.0 126.255.255.255 255.0.0.0
B 10 128.0.0.0 191.255.255.255 255.255.0.0
C 110 192.0.0.0 233.255.255.255 255.255.255.0
D 1110 224.0.0.0 239.255.255.255 ----
E 1111 240.0.0.0 255.255.255.255 ----

注:a 由于历史原因0.0.0.0被保留

       b 127.0.0.0 - 127.255.255.255 被用作特殊用途,如127.0.0.1 用于本地回环地址lo

互联网中的IP地址分配以及TCP/UDP公共服务端口号有专门的机构进行统筹和分配——IANA(Internet Assigned Numbers Authority)。

在互联网初期,IP地址分配策略使得IP地址浪费严重,因此当互联网以超乎想象的速度发展,终端接入网络的速度爆炸式增长时,IPv4地址资源很快便被耗尽。2011年2月3日,IANA对外宣布,IPv4地址空间最后5个地址块被分配完;童年4月15日,亚太区委员会宣布,除了个别保留地址外,本区域所有的IPv4地址基本被耗尽。

不过,早期网络通信协议和标准的组织已经意识到了IPv4地址马上被耗尽的危机,因此制定了长期措施和短期措施。长期措施:制定下一代互联网协议IPv6(Internet Protocol Version 6);短期措施:NAT(Network Address Translation, 网络地址转换)和CIDR(Classless Inter-Domain Routing, 无类别域间路由)。

NAT的功能是:将一个IP地址转换为另一个IP地址。通常一个局域网由于申请不到足够的IP地址,或者为了编址方便,在局域网内部采用私有IP地址为设备编址,当设备访问外部网络时,再通过NAT将私有地址翻译成合法的共有地址。

P地址范围
网络类型
网络个数
10.0.0.0 ~ 10.255.255.255 A 1
172.16.0.0 ~ 172.31.255.255 B 16
192.168.0.0 ~ 192.168.255.255 C 256

公网IP地址可以在Internet上使用,且全球唯一,而私有IP地址则是用来在局域网中使用。私有地址范围如表1-2所示。

                                  表1-2 私有地址范围


2 NAT 模型

 NAT是IETF标准,它通过将局域网内的主机IP地址映射为Internet上有效的公网IP地址,从而实现了网络地址的复用。使用NAT技术,局域网内的多台PC可以共享单个、全局路由的IP地址,减少了所需的IP地址的数量。

        NAT主要可以分为两类:基本NAT和NAPT ( Network Address Port Translation )。

        基本NAT一般是用于NAT拥有多个公网IP的情形下,将公网IP地址与内网主机进行静态绑定,基本上这种类型的NAT设备已经很少了。或许根本我们就没机会见到。

       NAPT(Network Address/Port Translators):其实这种才是我们常说的 NAT。NAPT将内部连接映射到外部网络中的一个单独IP地址上,同时在该地址上加上一个由NAT设备选定的端口号。

根据映射方式不同,NAPT可以分为圆锥型NAT和对称性NAT,其中圆锥型NAT包括完全圆锥型NAT、地址限制圆锥型NAT和端口限制圆锥型NAT。

1.1完全圆锥型NAT( Full Cone NAT )

完全圆锥型NAT,将从一个内部IP地址和端口来的所有请求,都映射到相同的外部IP地址和端口。并且,任何外部主机通过向映射的外部地址发送报文,都可以实现和内部主机进行通信。这是一种比较宽松的策略,只要建立了内部网络的IP地址和端口与公网IP地址和端口的映射关系,所有的Internet上的主机都可以访问该NAT之后的主机。

1.2地址限制圆锥型NAT( Address Restricted Cone NAT )

地址限制圆锥型NAT也是将从相同的内部IP地址和端口来的所有请求映射到相同的公网IP地址和端口。但是与完全圆锥型NAT不同,当且仅当内部主机之前已经向公网主机发送过报文,此时公网主机才能向内网主机发送报文。

1.3端口限制圆锥型NAT( Port Restricted Cone NAT )

类似与地址限制圆锥型NAT,但是更严格。端口受限圆锥型NAT增加了端口号的限制,当前仅当内网主机之前已经向公网主机发送了报文,公网主机才能和此内网主机通信。

1.4对称型NAT( Symmetric NAT)

对称型NAT把从同一内网地址和端口到相同目的地址和端口的所有请求,都映射到同一个公网地址和端口。如果同一个内网主机,用相同的内网地址和端口向另外一个目的地址发送报文,则会用不同的映射。这和端口限制型NAT不同,端口限制型NAT是所有请求映射到相同的公网IP地址和端口,而对称型NAT是不同的请求有不同的映射。

3 打洞

连接不同的外部Server,NAT打开的端口会变化。也就是内部机器A连接外网机器B时,NAT会打开一个端口;连接外网机器C时,NAT又会打开另外一个端口。
当双方都是Port Restricted Cone NAT的时候,则需要利用UDP打洞原理进行“先打洞,然后才能直接通信”。

对于Cone NAT要采用UDP打洞,需要一个公网机器Server C来充当“介绍人”。处于NAT之后的内网的A、B先分别和C通信,打开各自的NAT端口,C这个时候知道A、B的公网IP和端口。现在A和B想直接连接,比如A给B直接发包,除非B是Full Cone,否则不能通信。反之亦然。

为什么会这样?因为对于处于NAT之后的A、B。如果想A要与外界的D通信,则首先必须要A发包到D,然后A经过NAT设备NA,NA把A的内网地址和端口转换为NA的外网地址和端口。和D通信之后,D才能经过NA和A通信。也就是说,只能A和外界主动通信,外界不能主动和处于NA之后的A通信,这种包会被NA直接丢弃的。这也就是前面所说的Port Restricted Cone 的情形!

Java代码  收藏代码
  1. A(192.168.8.100:5000) -> NA(202.100.100.100:8000) -> D(292.88.88.88:2000)  


但是我们可以这样:

  1. A --- NA --- Server C --- NB --- B  
  2. 其中: A、B 为主机;  
  3. NA、NB 为NAT设备;  
  4. Server C为外网的机器;  


如果A想与B通信,那么其过程如下:
(1)A首先连接 C,C得到A的外网NA的地址和端口;
(2)B也要连接C,C得到B的外网NB的地址和端口;
(3)A告诉C说我要和B通讯;
(4)C通过NB发信息给B,让B知道A的外网NA的地址和端口;
(5)B向NA发数据包(肯定会被NA丢弃,因为NA上并没有 A->NB 的合法session),但是NB上就建立了有B->NA的合法session了;
(6)B发数据包给C,让 C 通知 A,我已经把洞打好了;
(7)A接收到通知后,向 B 的外网NB发数据包,这样就不会被NB丢弃掉了。因为对于NB来说,它看到的是A的外网NA的地址,而通过第5步,B已经让NA成为NB的合法通信对象了。所以,当NA发数据包给NB时,NB就会接收并转发给B。

注意: 路由器和防火墙的UDP打洞的端口有个时间限制的,在一定时间内如果没有数据通讯会自动关闭。

 

四、NAT穿越技术

前面解释了NAT的弊端,为了解决IP端到端应用在NAT环境下遇到的问题,网络协议的设计者们创造了各种武器来进行应对。但遗憾的是,这里每一种方法都不完美,还需要在内部主机、应用程序或者NAT网关上增加额外的处理。

应用层网关(ALG)

前面我们已经介绍到了,NAT实现了对UDP或TCP报文头中的的IP地址及端口转换功能,但对应用层数据载荷中的字段无能为力(也就是净载中的数据无法修改),在许多应用层协议中,比如多媒体协议(H.323、SIP等)、FTP、SQLNET等,TCP/UDP载荷中带有地址或者端口信息,这些内容不能被NAT进行有效的转换,就可能导致问题。也就是说,NAT只是将数据包的包头的ip地址和端口号进行了转换,但是没有对包内数据中的ip地址和端口号进行转换于是我们开始设想能不能使用一种行之有效的方法保证包头的ip和端口号与包中数据里的Ip地址和端口号都转化为公网的ip地址和端口号。

ALG的实际应用

对于ALG的实现机制还是不清楚,如果有懂的大佬,推荐下书籍 
下面我们举个FTP传输的例子来简单介绍一下ALG的实际应用 
这里写图片描述 
图中私网侧的主机要访问公网的FTP服务器。 
NAT设备上配置了私网地址192.168.1.2到公网地址8.8.8.11的映射,实现地址的NAT转换,以支持私网主机对公网的访问。组网中,若没有ALG对报文载荷的处理,私网主机发送的PORT报文到达服务器端后,服务器无法根据私网地址进行寻址,也就无法建立正确的数据连接。整个通信过程包括如下四个阶段:

(1) 私网主机和公网FTP服务器之间通过TCP三次握手成功建立控制连接。

(2) 控制连接建立后,私网主机向FTP服务器发送PORT报文,报文中携带私网主机指定的数据连接的目的地址和端口,用于通知服务器使用该地址和端口和自己进行数据连接。

(3) PORT报文在经过支持ALG特性的NAT设备时,报文载荷中的私网地址和端口会被转换成对应的公网地址和端口。即设备将收到的PORT报文载荷中的私网地址192.168.1.2转换成公网地址8.8.8.11,端口1084转换成12487。

(4) 公网的FTP服务器收到PORT报文后,解析其内容,并向私网主机发起数据连接,该数据连接的目的地址为8.8.8.11,目的端口为12487(注意:一般情况下,该报文源端口为20,但由于FTP协议没有严格规定,有的服务器发出的数据连接源端口为大于1024的随机端口,如本例采用的是wftpd服务器,采用的源端口为3004)。由于该目的地址是一个公网地址,因此后续的数据连接就能够成功建立,从而实现私网主机对公网服务器的访问。

 

posted @ 2018-07-13 15:15  yoyo008  阅读(587)  评论(0编辑  收藏  举报