NAT的四种类型
完全锥形NAT
类似于静态NAT。
同一个内网的<IP,Port>发送出来的请求会被映射到同一个外网<IP,Port>。
外部设备可以通过访问映射之后的<IP,Port>访问内网的<IP,Port>。
如上图,NAT会维护一个映射表,当内网地址端口10.0.0.2:1234向外发送请求时,会被NAT映射为外网地址和端口156.0.23.17:14001后继续向外发送。
外网地址也可以访问156.0.23.17:14001直接连接10.0.0.2:1234。
可以认为,在内网10.0.0.2:1234通过NAT向外访问之后,NAT维护的一个表中新增了如下两个字段:
源地址 | NAT | 目的地址 |
---|---|---|
10.0.0.2:1234 | 156.0.23.17:14001 | 57.1.2.3:81001 |
Any | 156.0.23.17:14001 | 10.0.0.2:1234 |
当外部设备访问156.0.23.17:14001时,会被NAT转发到10.0.0.2:1234。
地址受限锥形NAT
与完全锥形NAT不同的是,地址受限锥形NAT维护的表会新增:
源地址 | NAT | 目的地址 |
---|---|---|
10.0.0.2:1234 | 156.0.23.17:14001 | 157.1.22.33:10201 |
157.1.22.33:Any | 156.0.23.17:14001 | 10.0.0.2:1234 |
10.0.0.2:1234 | 156.0.23.17:14001 | 17.1.152.23:6401 |
17.1.152.23:Any | 156.0.23.17:14001 | 10.0.0.2:1234 |
当57.1.2.3:81001主动发送请求给NAT时,NAT在表中查不到57.1.2.3:81001这个地址要映射的目的地址,所以也就无法转发。
端口受限锥形NAT
与完全锥形NAT不同的是,地址受限锥形NAT维护的表会新增:
源地址 | NAT | 目的地址 |
---|---|---|
10.0.0.2:1234 | 156.0.23.17:14001 | 157.1.22.33:10201 |
157.1.22.33:10201 | 156.0.23.17:14001 | 10.0.0.2:1234 |
10.0.0.2:1234 | 156.0.23.17:14001 | 17.1.152.23:6401 |
17.1.152.23:6401 | 156.0.23.17:14001 | 10.0.0.2:1234 |
如上图,17.1.152.23:1321尝试连接156.0.23.17:14001时,NAT在表中无法找到对应的映射,所以也就无法连接。
对称NAT
前3种NAT都是将内网的<IP,Port>映射为NAT的<IP,Port>,不论要连接的外网的<IP,Port>是哪个,比如10.0.0.2:1234总是会被映射为156.0.23.17.14001。
而对称NAT只要四元组<内网IP,内网Port,外网IP,外网Port>不同,则会映射出来一个新的。
打个比方,对于四元组<10.0.0.2, 1234, 157.1.22.23, 10201>,NAT会映射一个地址156.0.23.17:14001。
对于四元组<10.0.0.2, 1234, 17.1.152.23, 6401>,NAT会映射为另外一个地址156.0.23.17:14002。
将上述例子中的两个四元组写入表格:
源地址 | NAT | 目的地址 |
---|---|---|
10.0.0.2:1234 | 156.0.23.17:14001 | 157.1.22.33:10201 |
157.1.22.33:10201 | 156.0.23.17:14001 | 10.0.0.2:1234 |
10.0.0.2:1234 | 156.0.23.17:14002 | 17.1.152.23:6401 |
17.1.152.23:6401 | 156.0.23.17:14002 | 10.0.0.2:1234 |
NAT 穿透
NAT机制在绝大多数家庭和公司网络中实施,它完全防止了位于NAT后方的设备运行服务器软件的可能性。NAT Traversal,也称为打孔,是在NAT表中打开入站端口的过程。
STUN和TURN协议可以帮助打孔。
PyNAT是一种使用STUN服务器的工具,可以检测主机处于哪一种NAT下。安装和运行:
# 安装
pip3 install pynat
# 运行
pynat
看到类似于此的输出:
$ pynat
Network type: Restricted-port NAT
Internal address: 192.168.1.2:54320
External address: 203.0.113.9:54320