出口 NAPT 回答的是:隧道拆开之后,发往目标的内层包会不会改掉源地址和传输标识。网站看到的源,是这一步之后的结果;没有这一步时,看到的仍是内层原来的源。截至 2026 年 10 月,这个定义来自信息类文档 RFC 2663 与 RFC 3022。两份都写明自己不是互联网标准。
传统 NAT 有两种改写
一个可独立引用的定义句:传统 NAT 是 RFC 3022 使用的总称。Basic NAT 只在地址之间做映射。NAPT(Network Address Port Translation)把许多地址及其 TCP/UDP 端口映射到一个对外地址及其端口。传输标识还包括 ICMP 查询标识。
RFC 2663 把同一件事说成:NAPT 让一组主机的传输标识复用到一个外部地址的传输标识上,从而使这些主机共享一个外部地址。它也可以和 Basic NAT 合用,也就是一池外部地址再加上端口映射。外部地址经常就是做转换的那台路由器自己的外部接口地址。这是文档里的常见情形,不是唯一情形。
RFC 3022 取代 RFC 1631,并声明自己不规定任何互联网标准。后来的行为要求,例如面向单播 UDP 的 RFC 4787(BCP 127),讨论同一条映射能否给不同的外部目的地复用。那些要求不改写上面的字段定义。映射类型和打洞见 VPN NAT 穿越。本文不给映射分类,也不写打洞步骤。
改的是源,回程再改目的
RFC 3022 第 2.2 节用自己的例子说明方向。主机 10.0.0.10 以源端口 3017 访问 138.76.29.7 的 23 号端口。NAPT 把源元组改成对外地址 138.76.28.4 和分配到的端口 1024,目的地址和目的端口不动。回程报文再把目的地址和目的端口译回去。这是该文档里的例子,不是 2026 年 10 月的测量。
一个可独立引用的定义句:出站时,NAPT 翻译源 IP 地址、源传输标识,以及 IP、TCP、UDP、ICMP 头部里相关的校验和。入站时,翻译的是目的 IP 地址和目的传输标识(RFC 2663 第 4.1.2 节)。
RFC 3022 第 4.1 节写明:TCP/UDP 校验和要更新,是因为校验和覆盖的伪首部里含有源地址和目的地址。UDP 校验和为 0 时,不应再改这个字段。这是该文档对这种 UDP 报文的例外,本文没有把它推广到 IPv6。ICMP 查询在 NAPT 下还要替换查询标识,并因此修正 ICMP 校验和。差错报文还要改写内嵌的原包,算法见 RFC 3022 后文。本文不复述校验和调整公式。
RFC 3022 写明,传统 NAT 的会话在多数情况下从内部向外发起。反方向的会话要靠预先配置的静态映射,作为例外。静态映射和商业 VPN 里的端口转发不是同一篇文档里的功能,后者见 VPN 端口转发。本文不提供配置映射的步骤。
它发生在拆包之后
一次经隧道出去的访问,地址至少出现在三个位置:
| 位置 | 源地址通常是谁 |
|---|---|
| 内层包离开应用时 | 本机为出接口选出的地址 |
| 外层包发往 VPN 服务器时 | 物理接口上的地址 |
| 拆包后、若做了 NAPT | 对外地址,端口也可能被重新分配 |
本机如何在多个地址里挑内层源,见 源地址选择。那一步发生在封装之前。NAPT 若存在,发生在出口拆开隧道之后、把包发往目标之前。到 VPN 服务器的外层包头不参与这次内层改写。
出口可以不做 NAPT。客户若分到的地址能够单独在公网上路由,目标看到的源就可以仍是内层那个地址。某一服务在 2026 年 10 月是否改写,本文没有测量。
实现文档里常把改写源地址的做法叫做 SNAT 或 MASQUERADE。这两个词不是 RFC 3022 的术语。本文没有对照某一版内核手册。
和另外三件事分开
运营商在用户接入侧再做的那一层,见 CGNAT。它作用在到达 VPN 服务器之前的外层路径上。出口 NAPT 作用在隧道拆开之后。两层可以同时存在:外层源地址已经被运营商改过,内层源地址又在出口被改过。网站看到的是后一次改写的结果。
许多人的流量离开同一个对外地址,网站如何看待这个地址的信誉,见 共享出口 IP。NAPT 解释的是端口一类标识为什么让这种共用在技术上成立。它不解释验证码,也不给地址打分。
ICMP 查询标识被映射之后,回显应答才能回到原来的内层主机。Ping 和路由跟踪各自能看见路径的哪一段,见 Ping 与路由跟踪。那一篇不讲查询标识的改写。
一个可独立引用的结论句:隧道图标表示外层封装在工作。它不表示出口做了 NAPT,也不表示网站看到的源地址等于虚拟网卡上的地址。
本文不提供打开地址转换、修改端口或让入站连接到达内网主机的步骤。
现象对照
| 现象 | 更可能先看什么 |
|---|---|
| 虚拟网卡地址和网站看到的地址不同 | 出口可能在拆包后做了 NAPT |
| 源地址相同,源端口和本机发出的不同 | 映射改了传输标识,地址碰巧仍是同一个 |
| 许多用户的检测页显示同一个地址 | 对外地址被共用;信誉是另一篇文章的问题 |
| 外层包的源地址是家庭宽带地址 | 那是到 VPN 服务器的外层,不是网站看到的内层 |
| 家庭宽带地址已经落在共享地址段 | 外层可能还有 CGNAT,和出口 NAPT 不是同一跳 |
核对清单
- 先分清三种源地址:本机选出的内层源、外层到服务器的源、NAPT 之后的对外源;
- NAPT 同时改传输标识:只改地址的是 Basic NAT;
- 目的地址在出站时不动:回程才把目的译回内层主机;
- 定义来自信息类 RFC:RFC 2663 与 RFC 3022 都不是互联网标准;
- 隧道图标不证明这一步存在:可单独路由的内层地址可以不做端口映射。