Skip to content

NAT的四种类型

完全锥形NAT

类似于静态NAT。

同一个内网的<IP,Port>发送出来的请求会被映射到同一个外网<IP,Port>。

外部设备可以通过访问映射之后的<IP,Port>访问内网的<IP,Port>。

Full Cone NAT

如上图,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:1234156.0.23.17:1400157.1.2.3:81001
Any156.0.23.17:1400110.0.0.2:1234

当外部设备访问156.0.23.17:14001时,会被NAT转发到10.0.0.2:1234。

地址受限锥形NAT

(Address-)Restricted Cone NAT

与完全锥形NAT不同的是,地址受限锥形NAT维护的表会新增:

源地址NAT目的地址
10.0.0.2:1234156.0.23.17:14001157.1.22.33:10201
157.1.22.33:Any156.0.23.17:1400110.0.0.2:1234
10.0.0.2:1234156.0.23.17:1400117.1.152.23:6401
17.1.152.23:Any156.0.23.17:1400110.0.0.2:1234

当57.1.2.3:81001主动发送请求给NAT时,NAT在表中查不到57.1.2.3:81001这个地址要映射的目的地址,所以也就无法转发。

端口受限锥形NAT

Port-Restricted Cone NAT

与完全锥形NAT不同的是,地址受限锥形NAT维护的表会新增:

源地址NAT目的地址
10.0.0.2:1234156.0.23.17:14001157.1.22.33:10201
157.1.22.33:10201156.0.23.17:1400110.0.0.2:1234
10.0.0.2:1234156.0.23.17:1400117.1.152.23:6401
17.1.152.23:6401156.0.23.17:1400110.0.0.2:1234

如上图,17.1.152.23:1321尝试连接156.0.23.17:14001时,NAT在表中无法找到对应的映射,所以也就无法连接。

对称NAT

Symmetric 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:1234156.0.23.17:14001157.1.22.33:10201
157.1.22.33:10201156.0.23.17:1400110.0.0.2:1234
10.0.0.2:1234156.0.23.17:1400217.1.152.23:6401
17.1.152.23:6401156.0.23.17:1400210.0.0.2:1234

NAT 穿透

NAT机制在绝大多数家庭和公司网络中实施,它完全防止了位于NAT后方的设备运行服务器软件的可能性。NAT Traversal,也称为打孔,是在NAT表中打开入站端口的过程。

STUN和TURN协议可以帮助打孔。

PyNAT是一种使用STUN服务器的工具,可以检测主机处于哪一种NAT下。安装和运行:

bash
# 安装
pip3 install pynat

# 运行
pynat

看到类似于此的输出:

bash
$ pynat
Network type: Restricted-port NAT
Internal address: 192.168.1.2:54320
External address: 203.0.113.9:54320