各种 NAT 类型的解释 (RFC 3489,RFC 4787)

RFC 3489

RFC 3489 的标题名称为 STUN - Simple Traversal of User Datagram Protocol (UDP) Through Network Address Translators (NATs),即为所谓的 STUN 协议。STUN 协议则是为了解决 P2P 通信中的 NAT 穿透问题而提出的。

这个协议中定义了四种 NAT 类型,也是我们熟知的 NAT1-NAT4 的由来。

NAT1 / Full Cone NAT / 完全锥型 NAT

完全锥型 NAT 是最简单的一种 NAT 类型,它的特点是:

内网里同一个 IP 和 Port,都会被映射为同一个公网 IP 和 Port,而且任何外部主机都可以通过向映射后的公网 IP 和 Port 发送数据,这些数据会直接转发到内网 IP 和 Port 上。

所有从同一个私网 IP 地址和端口(IP1:Port1)发送过来的请求都会被映射成同一个公网 IP 地址和端口(IP:Port)。并且,任何外部主机通过向映射的公网 IP 地址和端口发送报文,都可以实现和内部主机进行通信。

这是一种比较宽松的策略,只要建立了私网 IP 地址和端口与公网 IP 地址和端口的映射关系,所有的 Internet 上的主机都可以访问该 NAT 之后的主机。

NAT2 / Restricted Cone NAT / 限制锥型 NAT

NAT2 则比 NAT1 多了个条件,不再是任何外部主机发送到公网 IP 和 Port 都会被转发到内网,而是内网主机主动联系过这个 IP,这个 IP 才能向内网主机发送数据。(这个 IP 的任何端口都可以发送数据到内网)

所有从同一个私网 IP 地址和端口(IP1:Port1)发送过来的请求都会被映射成同一个公网 IP 和端口号(IP:Port)。与完全锥型 NAT 不同的是,当且仅当内部主机之前已经向公网主机发送过报文,此时公网主机才能向私网主机发送报文。

NAT3 / Port Restricted Cone NAT / 端口限制锥型 NAT

NAT3 比 NAT2 更加严格,不仅要求内网主机联系过这个 IP,同时也要求端口号也联系过。也就是说,只有内网主机主动联系过这个 IP 和 Port,这个 IP 和 Port 才能向内网主机发送数据。(同 IP 下其他的 Port 发送的 UDP 数据会被丢弃)

与限制锥型 NAT 很相似,只不过它包括端口号。也就是说,一台公网主机(IP2:Port2)想给私网主机发送报文,必须是这台私网主机先前已经给这个 IP 地址和端口发送过报文。

NAT4 / Symmetric NAT / 对称型 NAT

NAT4 是最严格的一种 NAT 类型,NAT1 的要求(内网里同一个 IP 和 Port,都会被映射为同一个公网 IP 和 Port)不再遵守了。如果联系不同的 IP 和 Port,那么映射的公网 IP 和 Port 也会不同。(IP 和 Port 任何一个有变化,都会映射到不同的公网 IP 和 Port),同时他还有 NAT3 的限制,只有内网主机主动联系过这个 IP 和 Port,这个 IP 和 Port 才能向内网主机发送数据。

也就是说,我主动联系过你后,你才能联系我;同时其他人不可以用这个 IP 和 Port 联系我。

所有从同一个私网 IP 地址和端口发送到一个特定的目的 IP 地址和端口的请求,都会被映射到同一个 IP 地址和端口。如果同一台主机使用相同的源地址和端口号发送报文,但是发往不同的目的地,NAT 将会使用不同的映射。此外,只有收到数据的公网主机才可以反过来向私网主机发送报文。

这和端口限制锥型 NAT 不同,端口限制锥型 NAT 是所有请求映射到相同的公网 IP 地址和端口,而对称 NAT 是不同的请求有不同的映射。

图片说明

RFC 4787

RFC 4787 的标题名称为 Network Address Translation (NAT) Behavioral Requirements for Unicast UDP。这里面更加详细的规定了 NAT 的行为。(RFC 5780 则介绍了如何测试得出结果)

我们其实可以发现,RFC 3489 里面的每种 NAT 类型,其实都有两个行为,一个是映射(Mapping),一个是过滤(Filtering)。

映射 / Mapping指的是内网 IP 和 Port 如何变为公网的 IP 和 Port。即数据包如何出去的问题。

过滤 / Filtering指的是什么样的外部 IP 和 Port 可以通过已经映射的公网 IP 和 Port。即数据包能不能进来的问题。

映射 / Mapping 分类

1. Endpoint-Independent Mapping / 端点独立映射

内网 IP 和 Port 如何变为公网的 IP 和 Port,只考虑内网 IP 和 Port。也就是说只要内网的 (IP,Port) 相同,那么就会映射为同一个公网 IP 和 Port。

2. Address-Dependent Mapping / 地址依赖映射

这次不只需要内网的 (IP,Port) 相同,还要求尝试连接的外部 IP 相同,才会映射为同一个公网 IP 和 Port。

即 (innerIP,innerPort,connectToIP)三者相同,才会映射为同一个公网 IP 和 Port。

3. Address and Port-Dependent Mapping / 地址和端口依赖映射

这次不只需要内网的 (IP,Port) 相同,还要求尝试连接的外部 IP 和 Port 相同,才会映射为同一个公网 IP 和 Port。

即 (innerIP,innerPort,connectToIP,connectToPort)四者相同,才会映射为同一个公网 IP 和 Port。

过滤 / Filtering 分类

1. Endpoint-Independent Filtering / 端点独立过滤

只要已经映射的公网 IP 和 Port,就可以通过任何外部 IP 和 Port 访问。

2. Address-Dependent Filtering / 地址依赖过滤

已经映射的公网 IP 和 Port,内部有主机主动联系过的公网 IP,就可以通过这个外部 IP 和 Port 访问。(这个 IP 的任何 Port 都可以连接,但必须是要内网连接过的 IP 才行。这个过滤行为和 NAT2 相同)

3. Address and Port-Dependent Filtering / 地址和端口依赖过滤

已经映射的公网 IP 和 Port,内部有主机主动联系过的公网 IP 和 Port,就可以通过这个外部 IP 和 Port 访问。(只有联系过的 IP 和 Port 才可以通过过滤,不被拦截。这个过滤行为和 NAT3 相同)

组合

三种映射行为,三种过滤行为,可以组合出 9 中不同的 NAT 类型,如下图所示。

其中 NAT1 是端点独立映射,端点独立过滤

NAT2 是端点独立映射,地址依赖过滤

NAT3 是端点独立映射,地址和端口依赖过滤

NAT4 是地址和端口依赖映射,地址和端口依赖过滤

参考资料


各种 NAT 类型的解释 (RFC 3489,RFC 4787)
https://nacldragon.top/2023/NAT-Type/
作者
NaCl
发布于
2023年10月27日
许可协议