网络地址转换

网络地址转换（Network Address Translation，缩写：NAT），又称IP动态伪装（IP Masquerade），是一种在IP封包通过路由器或防火墙时重写来源或目的IP地址或端口的技术。这种技术普遍应用于有多台主机，但只通过一个公有IP地址访问互联网的私有网络中。

NAT技术部署方便，且得到了广泛应用。然而，NAT也让主机之间的通信变得复杂，导致了通信效率的降低。

## 概述

<image>

<image>

1990年代中期，NAT是作为一种解决IPv4地址短缺以避免保留IP地址困难的方案而流行起来的。网络地址转换在很多国家广泛使用。所以NAT就成了家庭和小型办公室网络连接上的路由器的一个标准特征，因为对他们来说，申请独立的IP地址的代价要高于所带来的效益。

在一个典型的配置中，一个本地网络使用一个专有网络的指定子网（比如192.168.x.x或10.x.x.x）和连在这个网络上的一个路由器。这个路由器占有这个网络地址空间的一个专有地址（比如192.168.0.1），同时它还通过一个或多个因特网服务提供商提供的公有的IP地址（叫做“过载”NAT）连接到因特网上。当信息由本地网络向因特网传递时，源地址从专有地址转换为公用地址。由路由器跟踪每个连接上的基本数据，主要是目的地址和端口。当有回复返回路由器时，它通过输出阶段记录的连接跟踪数据来决定该转发给内部网的哪个主机；如果有多个公用地址可用，当数据包返回时，TCP或UDP客户机的端口号可以用来分解数据包。对于因特网上的通信，路由器本身充当源和目的。

流行在网络上的一种看法认为，IPv6的广泛采用将使得NAT不再需要，因为NAT只是一个处理IPv4的地址空间不足的方法。

### 缺点

在一个具有NAT功能的路由器下的主机并没有建立真正的对外IP地址，并且不能参与一些因特网协议。一些需要初始化从外部网络建立的TCP连接和无状态协议（比如UDP）无法实现。除非NAT路由器管理者预先设置了规则，否则送来的数据包将不能到达正确的目的地址。一些协议有时可以在应用层网关（见下）的辅助下，在参与NAT的主机之间容纳一个NAT的实例，比如FTP。NAT也会使安全协议变得复杂，比如IPsec。

端对端连接是被IAB委员会支持的核心因特网协议之一，因此有些人据此认为NAT是对公用因特网的一个破坏。一些因特网服务提供商（ISP）只向他们的客户提供本地IP地址，所以他们必须通过NAT来访问ISP网络以外的服务，并且这些公司能不能算得上真正的提供了因特网服务的话题也被谈起。

## 类型

### 基本网络地址转换（Basic NAT）

这一种也可称作NAT或“静态NAT”，在中提供了信息。它在技术上比较简单，仅支持地址转换，不支持端口映射。Basic NAT要求对每一个当前连接都要对应一个公网IP地址，因此要维护一个公网的地址池。宽带（broadband）路由器通常使用这种方式来允许一台指定的设备去管理所有的外部链接，甚至当路由器本身只有一个可用外部IP时也如此，这台路由器有时也被标记为DMZ主机。由于改变了IP源地址，在重新封装数据包时候必须重新计算校验和，网络层以上的只要涉及到IP地址的头部校验和都要重新计算。

Basic NAT要维护一个无端口号NAT表，结构如下。

内网IP｜外网IP

192.168.1.55｜219.152.168.222

192.168.1.59｜219.152.168.223

192.168.1.155｜219.152.168.224

### 网络地址端口转换（NAPT）

这种方式支持传输层协议（例如TCP、UDP等）的端口映射，并允许多台主机共享一个公网IP地址。

支持端口转换的NAT又可以分为两类：源地址转换和目的地址转换。前一种情形下发起连接的计算机的IP地址将会被重写，使得内网主机发出的数据包能够到达外网主机。后一种情况下被连接计算机的IP地址将被重写，使得外网主机发出的数据包能够到达内网主机。实际上，以上两种方式通常会一起被使用以支持双向通信。

NAPT维护一个带有IP以及端口号的NAT表，结构如下。

内网IP｜外网IP

192.168.1.55:5566｜219.152.168.222:9200

192.168.1.59:80｜219.152.168.222:9201

192.168.1.59:4465｜219.152.168.222:9202

### 受到NAT影响的应用程序

一些高层协议（比如FTP、Quake、SIP）在IP包的有效数据内发送网络层（第三层）信息。比如，主动模式的FTP使用单独的端口分别来控制命令传输和数据传输。当请求一个文件传输时，主机在发送请求的同时也通知对方自己想要在哪个端口接受数据。但是，如果主机是在一个简单的NAT防火墙后发送的请求，那么由于端口的映射，将会使对方接收到的信息无效。

一个应用层闸道（Application Layer Gateway，ALG）可以修正这个问题。运行在NAT防火墙设备上的ALG软件模块可以更新任何由地址转换而导致无效的信息。显然，ALG需要明白它所要修正的上层协议，所以每个有这种问题的协议都需要有一个单独的ALG。

但是，除FTP外的大多数传统的客户机－服务器协议不需要发送网络层（第三层）信息，也就不需要ALG。

这个问题的另一个可能的解决方法是使用像STUN这样的技术，但是这只针对建立在UDP上的高层协议，并且需要它内建这种技术。这种技术对于对称NAT也是无效的。还有一种可能的方案是UPnP，但它需要和NAT设备配合起来使用。

## 转换和过滤方式

以下类型是基于RFC 3489所定义：

完全圆锥型NAT（Full cone NAT，也叫NAT1）、一旦内部地址（iAddr:iPort）映射到外部地址（eAddr:ePort），所有发自iAddr:iPort的封包都经由eAddr:ePort向外发送。、任意外部主机都能经由发送封包给eAddr:ePort到达iAddr:iPort。｜

<image>

受限圆锥型NAT（Restricted cone NAT，也叫NAT2）、一旦内部地址（iAddr:iPort）映射到外部地址（eAddr:ePort），所有发自iAddr:iPort的封包都经由eAddr:ePort向外发送。、唯iAddr:iPort曾经发送封包到外部主机（nAddr:any），外部主机才能经由发送封包给eAddr:ePort到达iAddr:iPort。（注：any指外部主机源端口不受限制。）｜

<image>

端口受限圆锥型NAT（Port-Restricted cone NAT，也叫NAT3）类似受限制锥形NAT，但是还有端口限制。、一旦内部地址（iAddr:iPort）映射到外部地址（eAddr:ePort），所有发自iAddr:iPort的封包都经由eAddr:ePort向外发送。、在受限圆锥型NAT基础上增加了外部主机源端口必须是固定的。｜

<image>

对称NAT（Symmetric NAT，也叫NAT4）、每一个来自相同内部IP与端口，到一个特定目的地IP和端口的请求，都映射到一个独特的外部IP和端口。、:同一内部IP与端口发到不同的目的地和端口的信息包，都使用不同的映射。、只有曾经收到过内部主机数据的外部主机，才能够把封包发回。｜

<image>

## 其他用途

- 负载均衡：目的地址转换NAT可以重定向一些服务器的连接到其他随机选定的服务器。
- 失效终结：目的地址转换NAT可以用来提供高可靠性的服务。如果一个系统有一台通过路由器访问的关键服务器，一旦路由器检测到该服务器当机，它可以使用目的地址转换NAT透明的把连接转移到一个备份服务器上。
- 透明代理：NAT可以把连接到因特网的HTTP连接重定向到一个指定的HTTP代理服务器以缓存数据和过滤请求。一些因特网服务提供商就使用这种技术来减少带宽的使用而不用让他们的客户配置他们的浏览器支持代理连接。
- P2P 联机：在纯 IPv4 网络中，进行点对点联机，例如 VoIP 应用，游戏机联机，或者 Tailscale 等异地组网（不同于内网穿透，内网穿透对应端口转发，例如 FRP，需要 1 台具有全球唯一单播地址的服务器）工具（基于 WireGuard）等网络尝试打通 STUN 直连时，需要考虑双方的 NAT 类型。例如针对端口受限锥型到端口受限锥型，通常能够成功建立 对等网络，因为二者都属于 EIM 锥型家族（RFC 5780 定义），即 Easy-NAT。而针对对称型和端口受限锥型，会比对称型到全锥型 困难很多，这和对称型的特征有关，部分 ISP 在外部端口或 IP 变化时会使用递增端口，而部分 ISP 会使用随机端口，甚至有可能需要利用 生日攻击来进行 NAT 穿透。RFC 5780 本身为对 RFC 3489 的改进，但现实中的网络地址转换，比映射规则和过滤规则还要复杂得多。在开源社区有部分针对 RFC 5780 和 3489 规则开发的 NAT 类型和特征测试器，供专业网络工程人员使用。