原文地址:https://www.zhihu.com/question/31332694

§ NAT转换 - 图1私有 IP 地址有 3 个范围段

私网地址的范围:

  • A 类地址:10.0.0.0~10.255.255.255
  • B 类地址:172.16.0.0~172.31.255.255
  • C 类地址:192.168.0.0~192.168.255.255

公有 IP 地址有 5 个范围段

  • A 类:地址范围 1.0.0.0 - 127.255.255.255,主要分配给主机数量多、局域网数量少的大型网络;
  • B 类:地址范围为 128.0.0.0 - 191.255.255.255,一般为国际大公司及政府机构使用;
  • C 类:地址范围为 192.0.0.0 - 223.255.255.255,为一般小型公司校园网研究机构;
  • D 类:地址范围由 224.0.0.0 - 239.255.255.255。
  • E 类:地址范围为 240.0.0.0 - 255.255.255.255,暂时预留。

NAT 实现地址转换

NAT 解决了 IPv4 地址不够用的问题,另外 NAT 屏蔽了私网用户真实地址,提高了私网用户的安全性。

典型的 NAT 组网模型,网络通常是被划分为私网和公网两部分,各自使用独立的地址空间。私网使用私有地址 10.0.0.0/24 ,而公网使用公网地址。为了让主机 A 和 B 访问互联网上的服务器 Server ,需要在网络边界部署一台 NAT 设备用于执行地址转换。NAT 设备通常是路由器防火墙

§ NAT转换 - 图2

基本 NAT

基本 NAT 是最简单的一种地址转换方式,它只对数据包的 IP 层参数进行转换,它可分为静态 NAT 和动态 NAT 。

§ NAT转换 - 图3

  • 静态 NAT 是公网 IP 地址和私有 IP 地址有一对一的关系,一个公网 IP 地址对应一个私有 IP 地址,建立和维护一张静态地址映射表。
  • 动态 NAT 是公网 IP 地址和私有 IP 地址有一对多的关系,同一个公网 IP 地址分配给不同的私网用户使用,使用时间必须错开。它包含一个公有 IP 地址池和一张动态地址映射表。

动态 NAT 例子

私网主机 A( 10.0.0.1 )需要访问公网的服务器 Server( 61.144.249.229 ),在路由器 RT 上配置 NAT ,地址池为 219.134.180.11 ~ 219.134.180.20 ,地址转换过程如下:

§ NAT转换 - 图4

A 向 Server 发送报文

§ NAT转换 - 图5 步骤 1:A 向 Server 发送报文,网关是 10.0.0.254 ,源地址是 10.0.0.1 ,目的地址是 61.144.249.229 。

§ NAT转换 - 图6

§ NAT转换 - 图7 步骤 2:RT 收到 IP 报文后,查找路由表,将 IP 报文转发至出接口,由于出接口上配置了 NAT ,因此 RT 需要将源地址 10.0.0.1 转换为公网地址。

§ NAT转换 - 图8

§ NAT转换 - 图9 步骤 3:RT 从地址池中查找第一个可用的公网地址 219.134.180.11 ,用这个地址替换数据包的源地址,转换后的数据包源地址为 219.134.180.11 ,目的地址不变。同时 RT 在自己的 NAT 表中添加一个表项,记录私有地址 10.0.0.1 到 公网地址 219.134.180.11 的映射。RT 再将报文转发给目的地址 61.144.249.229 。

§ NAT转换 - 图10

Server 收到报文后做相应处理

§ NAT转换 - 图11 步骤 1:Server 发送回应报文,报文的源地址是 61.144.249.229 ,目的地址是 219.134.180.11 。

§ NAT转换 - 图12

§ NAT转换 - 图13 步骤 2:RT 收到报文,发现报文的目的地址 219.134.180.11 在 NAT 地址池内,于是检查 NAT 表,找到对应表项后,使用私有地址 10.0.0.1 替换公网地址 219.134.180.11,转换后的报文源地址不变,目的地址为 10.0.0.1 。RT 在将报文转发给 A 。

§ NAT转换 - 图14

§ NAT转换 - 图15 步骤 3:A 收到报文,地址转换过程结束

§ NAT转换 - 图16

B 向 Server 发送报文

如果 B 也要访问 Server ,则 RT 会从地址池中分配另一个可用公网地址 219.134.180.12 ,并在 NAT 表中添加一个相应的表项,记录 B 的私有地址 10.0.0.2 到公网地址 219.134.180.12 的映射关系。

§ NAT转换 - 图17

其他部分和 A 是一样的

NAPT 配合端口实现地址转换

NAPT 对应关系

在基础 NAT 中,私有地址和公网地址存在一对一地址转换的对应关系,即一个公网地址同时只能分配给一个私有地址。它只解决了公网和私网的通信问题,并没有解决公网地址不足的问题。

§ NAT转换 - 图18

NAPT( Network Address Port Translation )对数据包的 IP 地址、协议类型、传输层端口号同时进行转换,可以明显提高公网 IP 地址的利用率。

§ NAT转换 - 图19

NAPT 例子

A 向 Sever 发送报文

私网主机 A( 10.0.0.1 )需要访问公网的服务器 Server 的 WWW 服务( 61.144.249.229 ),在路由器 RT 上配置 NAPT ,地址池为 219.134.180.11 ~ 219.134.180.20 ,地址转换过程如下:

§ NAT转换 - 图20 步骤 1:A 向 Server 发送报文,网关是 RT( 10.0.0.254 ),源地址和端口是 10.0.0.1:1024 ,目的地址和端口是 61.144.249.229:80 。

§ NAT转换 - 图21

§ NAT转换 - 图22 步骤 2:RT 收到 IP 报文后,查找路由表,将 IP 报文转发至出接口,由于出接口上配置了 NAPT ,因此 RT 需要将源地址 10.0.0.1:1024 转换为公网地址和端口。

§ NAT转换 - 图23 步骤 3:RT 从地址池中查找第一个可用的公网地址 219.134.180.11 ,用这个地址替换数据包的源地址,并查找这个公网地址的一个可用端口,例如 2001 ,用这个端口替换源端口。转换后的数据包源地址为 219.134.180.11:2001 ,目的地址和端口不变。同时 RT 在自己的 NAT 表中添加一个表项,记录私有地址 10.0.0.1:1024 到 公网地址 219.134.180.11:2001 的映射。RT 再将报文转发给目的地址 61.144.249.229 。

§ NAT转换 - 图24

Server 收到报文后做响应处理

§ NAT转换 - 图25 步骤 1:Server 发送回应报文,报文的源地址是 61.144.249.229:80 ,目的地址是 219.134.180.11:2001 。

§ NAT转换 - 图26

§ NAT转换 - 图27 步骤 2:RT收到报文,发现报文的目的地址在 NAT 地址池内,于是检查 NAT 表,找到对应表项后,使用私有地址和端口 10.0.0.1:1024 替换公网地址 219.134.180.11:2001,转换后的报文源地址和端口不变,目的地址和端口为 10.0.0.1:1024 。RT 再将报文转发给 A 。

§ NAT转换 - 图28

§ NAT转换 - 图29 步骤 3:A收到报文,地址转换过程结束。

B 向 Server 发送报文

如果 B也要访问 Server ,则 RT 会从地址池中分配同一个公网地址 219.134.180.11 ,但分配另一个端口 3001 ,并在 NAT 表中添加一个相应的表项,记录 B 的私有地址 10.0.0.2:1024 到公网地址 219.134.180.12:3001 的映射关系。

§ NAT转换 - 图30

Easy IP

在标准的 NAPT 配置中需要创建公网地址池,也就是必须先知道公网 IP 地址的范围。而在拨号接入的上网方式中,公网 IP 地址是由运营商动态分配的,无法事先确定,标准的 NAPT 无法做地址转换。要解决这个问题,就要使用 Easy IP 。

Easy IP 又称为基于接口的地址转换。在地址转换时,Easy IP 的工作原理与 NAPT 相同,对数据包的 IP 地址、协议类型、传输层端口号同时进行转换。但 Easy IP 直接使用公网接口的 IP 地址作为转换后的源地址。Easy IP 适用于拨号接入互联网,动态获取公网 IP 地址的场合

§ NAT转换 - 图31

Easy IP 无需配置地址池,只需要配置一个 ACL(访问控制列表),用来指定需要进行 NAT 转换的私有 IP 地址范围。

NAT Sever

从基本 NAT 和 NAPT 的工作原理可知,NAT 表项由私网主机主动向公网主机发起访问而生成,公网主机无法主动向私网主机发起连接。因此 NAT 隐藏了内部网络结构,具有屏蔽主机的作用。但是在实际应用中,内网网络可能需要对外提供服务,例如 Web 服务,常规的 NAT 就无法满足需求了。

为了满足公网用户访问私网内部服务器的需求,需要使用 NAT Server 功能,将私网地址和端口静态映射成公网地址和端口,供公网用户访问。

§ NAT转换 - 图32

举个栗子

A 的私网地址为 10.0.0.1 ,端口 8080 提供 Web 服务,在对公网提供 Web 服务时,要求端口号为 80 。在 NAT 设备上启动 NAT Server 功能,将私网 IP 地址和端口 10.0.0.1:8080 映射成公网 IP 地址和端口 219.134.180.11:80 ,这样公网主机 C 就可以通过 219.134.180.11:80 访问 A 的 Web 服务。

NAT ALG

基本 NAT 和 NAPT 只能识别并修改 IP 报文中的 IP 地址和端口号信息,无法修改报文内携带的信息,因此对于一些 IP 报文内携带网络信息的协议,例如 FTP 、DNS 、SIP 、H.323 等,是无法正确转换的。

ALG 能够识别应用层协议内的网络信息,在转换 IP 地址和端口号时,也会对应用层数据中的网络信息进行正确的转换。

举个栗子:ALG 处理 FTP 的 Active 模式

FTP 是一种基于 TCP 的协议,用于在客户端和服务器间传输文件。FTP 协议工作时建立 2 个通道:Control 通道和 Data 通道。Control 用于传输 FTP 控制信息,Data 通道用于传输文件数据。

私网 A( 10.0.0.1 )访问公网 Server( 61.144.249.229 )的 FTP 服务,在 RT 上配置 NAPT,地址池为 219.134.180.11 ~ 219.134.180.20 ,地址转换过程如下:

§ NAT转换 - 图33

§ NAT转换 - 图34 步骤 1:A发送到 Server 的 FTP Control 通道建立请求,报文源地址和端口为 10.0.0.1:1024 ,目的地址和端口为 61.144.249.229:21 ,携带数据是 “ IP = 10.0.0.1 port=5001 ”,即告诉 Server 自己使用 TCP 端口 5001 传输 Data。

§ NAT转换 - 图35

§ NAT转换 - 图36 步骤 2:RT 收到报文,建立 10.0.0.1:1024 到 219.134.180.11:2001 的映射关系,转换源 IP 地址和 TCP 端口。根据目的端口 21 ,RT 识别出这是一个 FTP 报文,因此还要检查应用层数据,发现原始数据为 “ IP = 10.0.0.1 port=5001 ”,于是为 Data 通道 10.0.0.1:5001 建立第二个映射关系:10.0.0.1:5001 到 219.134.180.11:2002 ,转换后的报文源地址和端口为 219.134.180.11:2001 ,目的地址和端口不变,携带数据为 “ IP = 219.134.180.11 port=2002 ”。

§ NAT转换 - 图37

§ NAT转换 - 图38 步骤 3:Server 收到报文,向 A 回应 command okay 报文,FTP Control 通道建立成功。同时 Server 根据应用层数据确定 A 的 Data 通道网络参数为 219.134.180.11:2002 。

§ NAT转换 - 图39 步骤 4:A 需要从 FTP 服务器下载文件,于是发起文件请求报文。Server 收到请求后,发起 Data 通道建立请求,IP 报文的源地址和端口为 61.144.249.229:20 ,目的地址和端口为 219.134.180.11:2002,并携带 FTP 数据。

§ NAT转换 - 图40