0%

NAT 与 NAPT

引言

在 IP 分组通过路由器或防火墙时重写源 IP 地址或/和目的 IP 地址,网络地址转换 NAT(Network Address Translation)技术提供了一种完全将私有网和公共网隔离的技术。它允许用 1个或多个 IP 地址来实现 1 个私有网中的所有主机和公共网中主机的 IP 通信。

NAT 的类型

NAT 可以分为基础 NAT 和 NAPT(APT) 两大类。

基础 NAT

基础 NAT 一般用在当 NAT 拥有很多公网 IP 地址的时候,它将公网 IP 地址与私有网内部主机进行绑定,当私有网主机和公共网主机通信的 IP 包经过 NAT 网关时,将 IP 包中的源 IP(发送时)或目的 IP(接收时)在私有 IP 地址和 NAT 的公网 IP 地址之间进行转换。

注:图片来自于网络。基础 NAT 虽然只对 IP 地址进行转换,但是通过 NAT 网关可以对外部数据进行拦截,提供防火墙的功能,这与直接为主机设置公网 IP 地址还是不一样。

NAPT(PAT)

基础 NAT 中 1 台私有网内部主机要求有一个公网 IP 地址与之对应,这样就导致私有网内部主机数量受到可用公网 IP 数量的限制。显而易见,大多数情况下我们的主机数量远远多于可用的公网 IP 地址数。为了解决这个问题,NAT 进一步扩展为在进行 IP 地址转换的同时也进行 Port (端口)转换,这就是网络地址端口转 NAPT(Network Address Port Translation/Port Address Translation,所以也称为 APT)。NAPT 使得多台私有网主机可以同时利用 1 个公网 IP 地址与公网进行通信。

注:图片来自于网络。

当一个私有网主机通过 NAT 打开一个 “外出” 的 TCP 或 UDP 会话时,NAPT 分配给这个会话一个公网 IP 地址和端口,用来接收公网的响应的数据包,并经过转换通知私有网的主机。这样 NAPT 就在[私有网 IP 地址:私有端口] 和[公网 IP 地址:公网端口]之间建立了一个端口绑定。

端口绑定指定了 NAPT 将在这个会话的生存期内进行地址转换。请考虑这样一个问题,私有网一台主机上的一个应用程序通过一个 [私有网IP地址:私有端口] 同时发出多条会话给不同的外网主机,那么 NAPT 会怎样处理呢?按照 NAPT 的不同处理方式, NAPT 又可以分为 4 种类型:Full Cone NAT(全双工锥形 NAT)、Address Restricted Cone NAT(地址受限制锥形 NAT)、Port Restricted Cone NAT(端口受限锥形 NAT)和 Symmetric NAT(对称形 NAT),其中Full Cone、Address Restricted Cone、Port Restricted Cone 这 3 种类型又统称为 Cone NAT(圆锥形NAT)。

对于 Cone NAT ,从同一个 [私有网 IP 地址:私有端口] 发出的所有“外出”连接会绑定到同一个 [公网 IP 地址:公网端口]。对于 Symmetric NAT 则不同,针对不同外部主机的 “外出” 连接会话使用不同的 [公网 IP 地址:公网端口]。

Full Cone NAT

当内部主机发出一个“外出”的连接会话时,就会在 NAT 网关上打开一个端口,创建一个 “私网 <-> 公网” 的映射,随后 Full Cone NAT 会将传入这个端口的数据全部转发给内部主机。

Address Restricted Cone NAT

当内部主机发出一个“外出”的连接会话时,就会在 NAT 网关上打开一个端口,创建一个 “私网 <-> 公网” 的映射,同时 NAT 会记录下外部主机的 IP 地址,随后 Address Restricted Cone 会将已记录 IP 地址传入这个端口的数据转发给内部主机,其他数据一律丢弃。

Port Restricted Cone NAT

比 Address Restricted Cone 限制更多,Port Restricted Cone NAT 同时记录了外部主机的 IP 地址和端口,随后对传入端口的数据进行外部 IP 地址和端口 “同一性” 检查,丢弃所有未通过检查的数据。

Symmetric NAT

对称 NAT 与 Cone NAT 不同,它对通过一个 [私有网IP地址:私有端口] 发出的针对不同公网主机的“外出”连接会话会打开不同的 NAT 端口。

NAT 穿越

一般都采用 UDP 打洞来穿越 NAT,常用的解决方案有 NATSTUN、TURN、ICE、UPnP,具体可参考这篇文章 《NAT 与 NAT 穿越学习总结》

《NAT 的完全分析及其 UDP 穿透的完全解决方案》 这篇文章对 NAT 及 UDP 打洞进行了详细的分析,非常值得参考。