网络地址转换(NAT)

Jan 30, 2024 · 1 min read

网络地址转换(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

network-address-translation

  1. PC 通过Router向 Server 发送数据包,Destination IP地址为221.22.22.22。
  2. Router 接受 PC 数据包,进行NAT(将Source IP地址转换为公共网络中的地址221.10.10.10)并将数据发送到Server。
  3. Server 接受 Router 数据包,根据数据包中的Source IP地址,将数据包返回给Router。
  4. Router 收到 Server 数据包,进行NAT操(将Destination IP地址转换为私有网络中的地址192.168.1.8)并将数据包发送到IP为192.168.1.

NAT 分类

静态网络地址转换(Static NAT)

在连接私网和公网的路由器上配置静态 NAT,每个私网地址都有一个固定的公网地址,即私网地址和公网地址是一一对应的。

static-nat

动态网络地址转换 (Dynamic NAT)

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

dynamic-nat

网络地址端口转换 (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中属于最宽松的类型,它没有任何其它限制。

Alt text

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}$ ,否则丢弃。

Alt text

  • 数据包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}$ ,否则丢弃。

Alt text

  • 数据包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穿透

在了解了NAT的工作原理之后,我们再来看看NAT的具体实现。在实际场景中,NAT一共有4总实现方式:

Bang
Authors
Professor of Artificial Intelligence
My research interests include distributed robotics, mobile computing and programmable matter.