网络地址转换(NAT)
网络地址转换(Network Address Translation,NAT)是一种将不同网络的地址转换为同一网络的地址,从而实现不同网络间数据传输的技术。
NAT的由来
每一连接到Internet的设备都需要一个唯一的ID来表示,这个ID就是IP地址。在IPv4中,采用32位数字来表示IP地址,理论上有2^32(约42亿)个可能的地址,然而,随着互联网的迅猛发展,这个地址空间迅速耗尽。为了应对地址短缺问题,人们为IP地址使用定义了一些规范rfc1918。
简单来说就是为IP地址划分了3块空间提供给私有网络(公司、组织、个人)使用,我们只需向运营商申请少量的公共IP地址。当设备要访问互联网时,为私有IP和公共IP做一个映射,就能到达设备访问互联网的要求。
rfc1918 划分了以下3类私有IP地址空间,我们可以根据自己网络规模的大小自由选择以下任意网段的IP地址:
- A类: 10.0.0.0 - 10.255.255.255 (10/8 prefix)
- B类: 172.16.0.0 - 172.31.255.255 (172.16/12 prefix)
- C类: 192.168.0.0 - 192.168.255.255 (192.168/16 prefix)
NAT的工作原理
通常我们的路由器都包含NAT功能,即路由器存在多个网络接口,提供给私有/公共网络使用。当数据包由私有网络进入公共网络,路由器会将数据包中的IP地址转换为公共网络中的地址,当数据包由公共网络进入私有网络,路由器会将数据包中的IP地址转换为私有网络中的地址。
下面是一个最基本的NAT案例:
- PC的IP地址为192.168.1.8
- Router的私有网络IP地址为192.168.1.1 ,公共网络IP地址为221.10.10.10
- Server的IP地址为221.22.22.22

- PC 通过Router向 Server 发送数据包,Destination IP地址为221.22.22.22。
- Router 接受 PC 数据包,进行NAT(将Source IP地址转换为公共网络中的地址221.10.10.10)并将数据发送到Server。
- Server 接受 Router 数据包,根据数据包中的Source IP地址,将数据包返回给Router。
- Router 收到 Server 数据包,进行NAT操(将Destination IP地址转换为私有网络中的地址192.168.1.8)并将数据包发送到IP为192.168.1.
NAT 分类
静态网络地址转换(Static NAT)
在连接私网和公网的路由器上配置静态 NAT,每个私网地址都有一个固定的公网地址,即私网地址和公网地址是一一对应的。

动态网络地址转换 (Dynamic NAT)
为避免地址浪费,动态 NAT 提出了地址池,地址池存放了所有可以使用的公共地址。当私有网络中的设备需要访问公共网络时,会动态从池中获取一个公网IP,如果池中没有可用的公网IP就丢弃当前数据包。当设备不需要连接公共网络的时候,可以将公共地址放回池中供其它设备使用。

网络地址端口转换 (Network Address Port Translation,NAPT)
网络地址端口转换(Network Address Port Translation,NAPT): 也被称为PAT(Port Address Translation)。NAPT通过使用不同的端口号来支持多个私有IP地址映射到一个公共IP地址。它是一种多对一的映射方式,通过修改端口号来区分不同的内部主机。
在NAPT中,又分4种子类型
全锥NAT(Full Cone NAT)
将一个内部地址$\text{addr}_{o} =\{\text{ip}_{o},\text{port}_{o}\}$ 映射到外部地址$ \text{addr}_{t} =\{\text{ip}_{t},\text{port}_{t}\}$ ,所有$ \text{addr}_{o}$ 的数据将由$ \text{addr}_{t}$ 发送到外部,所有进入到$ \text{addr}_{t}$ 的数据都转发到$ \text{addr}_{o}$ 。全锥NAT在NAPT中属于最宽松的类型,它没有任何其它限制。

Client_1向Server_1发送了一个数据包,Nat Table 中会记录$ \text{addr}_{t}$ 和$ \text{addr}_{o}$ 的映射关系,一旦关系建立,Client_1就可以通过$ \text{addr}_{t}$ 和外部的任何主机进行相互通信。
地址受限NAT(Address Restricted Cone NAT)
在全锥NAT的基础上加上Destiantion IP地址限制。当$ \text{addr}_{t}$ 接受到外部数据包时,如果数据包中的Source IP 和 Nat Table 中的Destiantion IP 一致,则转发给$ \text{addr}_{o}$ ,否则丢弃。

- 数据包4:Source IP 和 Nat Table 中的Destiantion IP 不一致,被丢弃
端口受限NAT(Port Restricted Cone NAT)
在地址受限NAT的基础上进一步的限制了端口。当$ \text{addr}_{t}$ 接受到外部数据包时,如果数据包中的Source IP 和 Nat Table 中的Destiantion IP ,且Source Port 和 Nat Table 中的Destiantion Port 一致,则转发给$ \text{addr}_{o}$ ,否则丢弃。

- 数据包3:Source IP 和 Nat Table 中的Destiantion IP 一致 但是Source Port 和 Nat Table 中的Destiantion Port 不一致,被丢弃
- 数据包4:Source IP 和 Nat Table 中的Destiantion IP 不一致 且Source Port 和 Nat Table 中的Destiantion Port 不一致,被丢弃
对称NAT(Symmetric NAT)
在端口受限NAT的基础上继续进行限制。
NAT穿透
在了解了NAT的工作原理之后,我们再来看看NAT的具体实现。在实际场景中,NAT一共有4总实现方式: