标签归档:NAT

NAT:网络地址转换

之前的文章IP 与路由(一)中提到当前日益突显的 IPv4 地址耗尽问题,NAT 技术的广泛运用一定程度上缓解了该问题。NAT 是一种通过修改 IP 数据报头部信息来将一个 IP 地址空间映射到另一个 IP 地址空间的技术,这种映射操作通常由网络中的防火墙完成,包括硬件防火墙和软件防火墙。

NAT 的一个最广泛的应用场合是将一个局域网接入 Internet。在一个局域网中,通常每台主机都配置有私网地址,局域网中的各主机通过私网 IP 地址相互通讯。当局域网中的主机有访问 Internet 的需求时,需要先向 ISP 申请公网 IP 地址,再通过 NAT 设备将局域网中所有发往 Internet 的流量的源地址转换成这个公网 IP 地址。NAT 设备还会为局域网中所有主机与 Internet 的连接维护一个会话,保证从 Internet 返回的 IP 分组能正确地转发到局域网中对应的主机上。日常所见的家庭小型网络往往属于上述接入方式。

运用 NAT 技术可以达到使局域网中多台主机共享一个公网 IP 地址的目的,节约了 IP 地址。另一方面,NAT 向 Internet 隐藏了 NAT 背后局域网的地址空间、网络结构等细节;同时,由于 NAT 的存在,来自 Internet 的请求不能直接到达局域网,这使局域网中的主机免受来自 Internet 的探测、攻击和入侵。

基本 NAT

基本 NAT 是一种最简单的 NAT 形式。基本 NAT 配置有多个外网 IP 地址,在出站时,每个内网 IP 地址都会动态分配并映射到一个独立的外网 IP 地址。也就是说,基本 NAT 是一种只映射 IP 地址的 NAT,因此这种 NAT 又称为一对一 NAT。基本 NAT 需要维护一个会话表,将内网的 IP 地址与会话分配的外网 IP 地址一一对应起来。

在一个内网 IP 数据报穿过基本 NAT 去往外网时,NAT 会根据映射将这个 IP 数据报中的源 IP 地址字段修改为它对应的外网 IP 地址,并调整 IP 地址头部的校验和字段以及上层协议(TCP、UDP 等)中的校验和字段,然后将其交付给路由器。当基本 NAT 收到一个来自外网的 IP 数据报时,会将这个数据报头部中的目标 IP 地址字段修改为映射中对应的内网 IP 地址,同样调整校验和之后将数据报发往内网。

基本 NAT 只转换 IP 地址,不转换上层协议中的端口号等字段。

一对多 NAT

基本 NAT 只是简单地转换 IP 数据报中的 IP 地址,并不能起到复用外网 IP 地址的作用。当只从 ISP 处分配到一个外网 IP 地址,而内网中又有多台主机需要接入外网时,就需要使用一对多 NAT。一对多 NAT 通过转换上层协议的端口号来达到复用外网 IP 地址的目的,这种 NAT 方式也称为网络地址端口转换(Network Address Port Translation, NAPT)。日常所见的家庭小型网络等就是通过这种方式接入互联网的。

常见的运输层协议——例如 TCP 和 UDP 等——的数据报头部都有源端口号和目标端口号等字段,端口号用于区分同一台主机上不同的服务、进程等。NAPT 利用这一点,同时修改出站 IP 数据报头部中的源 IP 地址和上层协议的源端口号,为每一个出站会话动态分配一个未占用的端口号,并建立映射。NAPT 也需要维护一个会话表,将内网 IP 地址、上层协议号、上层协议源端口等与外网 IP 地址、上层协议号、外网上层协议端口等信息一一对应。

在一个内网 IP 数据报穿过 NAPT 运往外网时,NAPT 先在映射表中检查是否有与该 IP 数据报的源 IP 地址、上层协议号和上层协议端口号完全匹配的项目,如果有,则将它 IP 头部的 IP 地址信息修改为外网 IP 地址,将上层协议的端口号修改为映射表中记载的端口号;如果映射表中没有匹配的项目,那么先分配一个暂未使用的端口号,并写入映射表,然后再修改 IP 数据报头部的 IP 地址及上层协议的端口号。与基本 NAT 一样,在修改了这些字段之后还需要视情况调整 IP 数据报头部及上层协议头部的校验和字段。做完这些处理后,IP 数据报将被交付给路由器。

当 NAPT 收到来自外网的 IP 数据报时,通常需要根据 IP 数据报的目的 IP 地址、上层协议号和目的端口号等信息反向查询映射表,对 IP 数据报的 IP 地址等字段进行相应的转换然后发往内网。来自外网不匹配映射表的 IP 数据报将会被丢弃处理。

下图展示了一个典型的通过 NAPT 接入 Internet 的局域网。

napt图 1 一个通过 NAPT 接入 Internet 的局域网

NAPT 的映射表将内网的地址-端口与地址转换后对应的外网地址-端口建立了一种联系,并根据这种联系将外网主机返回的 IP 数据报转发给内网的主机。在实践中,有几种不同的 NAT 实现对来自外网的 IP 数据报的检查方式略有不同,这最终表现在对来自外网的 IP 数据报的处理行为有所不同,下文将详细讨论这几种情况。

 NAT 的几种过滤行为

以 UDP 数据报为例,当一个内网端点通过 NAT 建立一个出站会话时,NAT 会在内网地址-内网端口(记作 X:x)与目标的地址-端口(记作 Y:y)的映射之间指派一些过滤规则[1]。这意味着可能并不是所有来自外网的数据报都能被 NAT 映射到内网,其中有一些可能会被过滤掉。

1. 端点无关过滤

这种 NAT 只检查来自外网的数据报中的目标地址和端口,将无法在映射表中找到对应的内网地址-端口的数据报过滤掉,而不管这个数据报的源地址 Z 和源端口 z(记作 Z:z)是什么。这意味着这种 NAT 会将任何来自外网且能找到映射关系的数据报进行相应的转换并送往内网。

2. 地址相关过滤

同样,这种 NAT 也会将无法在映射表中找到对应内网地址-端口的数据报过滤掉。另外,这种 NAT 还会检查来自外网的数据报的源地址 Z,如果映射表中对应的主机 X:x 之前从未向 Z 发送过任何数据报,这个数据报也会被过滤掉。也就是说,一个来自外网 Z:any 的数据报能被 NAT 转换并发往 X:x 的条件是 X:x 曾经向 Z 主机的任一端口发送过数据报。

3. 地址端口相关过滤

这种 NAT 的过滤规则更加严格。除了不能在映射表中找到对应关系的数据报会被过滤之外,NAT 还会同时检查来自外网的数据报的源地址 Z 和源端口 z(Z:z),只要映射表中对应的主机 X:x 从未向 Z:z 发送过任何数据报,这个数据报就会被过滤掉。这种 NAT 的过滤执行的是最严格的检查,只有会话建立时内网主机指定的目标地址和端口发出的响应才能被转换并送回内网。

ICMP 报文的处理

ICMP 在网络测试、网络差错消息通知等方面有重要的应用,NAT 也应当支持 ICMP 报文。TCP、UDP 等运输层协议的头部中都有端口(Port)字段,可以在 NAPT 中发挥作用。而 ICMP 作为基于 IP 的网络层协议,它的头部中并没有端口字段,因此 NAT 对 ICMP 报文的处理略有不同于 TCP 和 UDP。

1. ICMP Echo Reply 报文

ICMP Echo Reply 应用于 Ping 程序。当在内网中向外网的主机应用 Ping 程序的时候,内网发出的 ICMP Echo 报文会穿过 NAT 送往外网主机,外网主机响应的 ICMP Reply 报文需要穿过 NAT 送达对应的发送者。

尽管 ICMP 不像 TCP、UDP 等协议一样头部中有端口号字段,但 ICMP Echo Reply 的消息中有一个 Identification 字段,这个字段的作用类似于 TCP/UDP 的端口号,用于区分同一个主机上正在运行着的不同 Ping 会话。因此,在对 ICMP Echo Reply 报文进行 NAT 处理时,可以直接将报文中的 Identification 字段当作端口号处理,为每个 NAT 会话分配一个新的 Identification——就像对待 TCP/UDP 的端口号一样——然后转换 IP 地址和 Identification,将转换过的报文送向外网。当 NAT 收到来自外网的 ICMP Reply 时,根据报文中的目的 IP 地址和 Identification 在映射表中查找对应的内网主机信息,然后完成相应的地址转换送往内网。

2. ICMP 差错报文

当一个 IP 报文在网络中发生了某些差错(如目标不可达、TTL 超时、分片问题等)时,处理该报文的主机会向发送者递交一个 ICMP 差错报文以通知发送者,这个从外网传回的差错通知报文也必须能通过 NAT 并正确地送达对应的内网主机。

与 ICMP Echo Reply 不同,ICMP 差错报文是由外网主机先发起的,而且这种报文中也没有 Identification 之类的信息,因此无法像对 ICMP Echo Reply 一样处理 ICMP 差错报文。好在 ICMP 差错报文会在数据区将出差错的 IP 数据报的头部以及首 8 字节的 data 载荷传送回来,NAT 在收到这种报文时可以将出差错的原始数据报头部的协议号、源地址和源端口号取出来,并在映射表中查询,找到对应的内网主机记录后完成转换和发送。

其他话题

一方面 NAT 技术的运用对外隐藏内网的细节,隔绝了来自外网访问和连接,在 NAT 的保护下的内网主机比直接暴露在外网的主机更安全;另一方面这种特性也使内网的主机不能直接对外提供服务,并对 P2P 应用造成了很大的影响,基于 P2P 的程序无法直接在两台内网主机之间建立连接。在 NAT 技术广泛运用的背景下,发展出了针对 NAT 环境下 P2P 程序之间建立连接的 NAT 穿透技术。NAT 穿透技术通常是在一台处于外网的第三方服务器的帮助下,巧妙地使一对 NAT 背后的主机穿透 NAT 相互建立连接。有关 NAT 穿透技术的话题将在后续文章中详细讨论。

如需转载本文,请注明出处。

参考文献
[1] F. Audet Ed., Nortel Networks, et al. Network Address Translation (NAT) Behavioral Requirements for Unicast UDP, RFC 4787, Jan 2007; tools.ietf.org/html/rfc4787
[2] P. Srisuresh, Kazeon Systems, et al. NAT Behavioral Requirements for ICMP, RFC 5508, Apr 2009; tools.ietf.org/html/rfc5508
[3] P. Srisuresh, M. Holdrege, et al. IP Network Address Translator (NAT) Terminology and Considerations, RFC 2663, Aug 1999; tools.ietf.org/html/rfc2663
[4] P. Srisuresh, Jasmine Networks, et al. Traditional IP Network Address Translator (Traditional NAT), RFC 3022, Jan 2001; tools.ietf.org/html/rfc3022
[5] Wikipedia. Network address translation. https://en.wikipedia.org/wiki/Network_address_translation