Skip to content

NAT 网络地址转换

2026 大纲 四(三)2 IPv4 地址与 NAT 中的 NAT 部分。同条目的 IPv4 地址、掩码、子网划分与 CIDR 在《IP 编址与子网划分》。

一、专用地址:重复用为什么不打架

上一篇把 32 位地址空间怎么切、怎么合讲完了,但地址终归不够用。NAT 是在 IPv6 落地之前应急用的那一招,它的起点是一块被单独划出来的地址——专用地址

专用地址不是"不唯一的地址",而是作用域被限定在本机构内的地址;在机构内部它依然必须唯一。

那全世界这么多机构都用 192.168.1.1,为什么不冲突? 靠的是一条硬规定:互联网中的所有路由器,对目的地址是专用地址的数据报一律不转发。既然这些地址根本出不了本机构的边界,重复也就无从冲突。

RFC 1918 划了三块:

地址块范围地址数相当于
10.0.0.0/810.0.0.0 ~ 10.255.255.255224 = 167772161 个 A 类网络
172.16.0.0/12172.16.0.0 ~ 172.31.255.255220 = 104857616 个连续的 B 类网络
192.168.0.0/16192.168.0.0 ~ 192.168.255.255216 = 65536256 个连续的 C 类网络

中间那块最容易记错:是 172.16 到 172.31,不是 172.16 到 172.255。用前缀长度验算就不会错——/12 意味着第二字节只有高 4 位固定,16=00010000,低 4 位可变 ⇒ 1631,正好对应 220/216=16 个 B 类网络。

采用专用地址互连而成的网络叫专用网(也叫专用互联网、本地互联网)。

二、地址与端口怎么被换掉

NAT 软件装在专用网连接互联网的边界路由器上,这台路由器至少要有一个全球 IP 地址。

设内网 192.168.0.0/16,NAT 路由器的全球地址 172.38.1.5,主机 A(192.168.0.3)访问公网主机 B(213.18.2.4):

阶段源地址目的地址谁在改
① A → NAT(内网侧)192.168.0.3213.18.2.4
② NAT → B(公网侧)172.38.1.5213.18.2.4NAT 改源地址
③ B → NAT(公网侧)213.18.2.4172.38.1.5B 只知道 172.38.1.5
④ NAT → A(内网侧)213.18.2.4192.168.0.3NAT 改目的地址

出方向改源地址、入方向改目的地址——听起来像两条规则,其实是一条:要隐藏的始终是内网侧地址,它在两个方向上恰好出现在不同的字段里

B 完全不知道 A 的专用地址;即使知道也用不了——公网路由器不转发目的地址是专用地址的数据报。

基本 NAT 到底省了多少

这一点常被高估。NAT 路由器有 n 个全球 IP 地址时,专用网内最多可以同时有 n 台主机接入互联网。没有让"同时上网的机器数"超过全球地址数,省下的只是"不上网的机器不必一直占着一个地址"——靠的是轮流使用

要突破这条限制,得再引入一个能区分的维度。

NAPT:端口号就是那个维度

多台内网主机共用同一个全球地址之后,回程报文的目的 IP 全都相同、丧失了区分能力NAPT(网络地址与端口转换)在替换 IP 的同时也替换运输层端口号,回程只要看目的端口就能唯一还原。

不使用端口号的那种叫传统的 NAT。许多资料并不严格区分,一律简称 NAT——平时说的"NAT"绝大多数指的就是 NAPT。

图里最关键的是中间那一竖列:两台内网主机用了同一个源端口 5000,出去之后变成 40001 / 40002 两个不同的外部端口;回程两个报文的目的 IP 完全相同,全靠端口号才分得开。

两台主机撞同一个源端口怎么办? 这根本不算问题——端口号仅在本主机内有意义,两台机器各自选中 5000 纯属巧合、完全合法。NAT 不保留原端口号,它重新分配一个在本 NAT 上唯一的外部端口。

并发上限因此变成端口数:一个全球 IP 上可用的外部端口约 1024~65535,共 64512 条映射(按同一协议、同一公网地址计)。但这只是理论上限——打开一个网页可能就开十几条连接,而且连接结束后表项还要保留一段时间才回收。

一张完整的 NAPT 转换表怎么填(想把出入两个方向逐行对上时展开)

场景(自造数据):内网 192.168.1.0/24,NAT 全球地址 203.0.113.7。三条连接同时发起——H1(192.168.1.11)用 TCP 源端口 5000 访问 93.184.216.34:80;H2(192.168.1.12)用 TCP 源端口 5000 访问同一服务器;H1 用 UDP 源端口 5001 访问 8.8.8.8:53。NAT 依次分配外部端口 40001、40002、40003。

出方向(改"源 IP : 源端口"):

方向原先的 IP 与端口转换后的 IP 与端口协议
专用网 → 互联网192.168.1.11 : 5000203.0.113.7 : 40001TCP
专用网 → 互联网192.168.1.12 : 5000203.0.113.7 : 40002TCP
专用网 → 互联网192.168.1.11 : 5001203.0.113.7 : 40003UDP

前两行是全表的要害:内网侧端口相同(都是 5000),外网侧端口不同。撞车就是在这里被化解的——NAT 不保留原端口号,它重新分配,只保证外部端口在本 NAT 上唯一。

入方向是出方向的镜像,改的是"目的 IP : 目的端口":

方向原先的 IP 与端口转换后的 IP 与端口协议
互联网 → 专用网203.0.113.7 : 40001192.168.1.11 : 5000TCP
互联网 → 专用网203.0.113.7 : 40002192.168.1.12 : 5000TCP
互联网 → 专用网203.0.113.7 : 40003192.168.1.11 : 5001UDP

两个 Web 响应怎么还原:服务器收到的两个请求源地址都是 203.0.113.7,它无从知道背后有两台机器,照常回两个响应。

响应到达 NAT 时的目的 IP:端口查表命中还原为
给 H1 的203.0.113.7 : 40001第 1 行192.168.1.11 : 5000
给 H2 的203.0.113.7 : 40002第 2 行192.168.1.12 : 5000

两个响应的目的 IP 完全相同,靠目的端口区分——这就是"再引入一个能区分的维度"的实证。

三、四笔代价

NAT 不是白拿的,它有四笔明确的代价,而且每一笔都能从机制本身推出来

第一笔:外部无法主动连入。 转换表项只在内网主机发起时才创建。外来的数据报到达 NAT 时查不到表项,NAT 根本不知道该把目的地址换成内网哪台主机,只能丢弃。所以专用网内的主机不能直接充当服务器——P2P、VoIP、在线游戏直连都因此受影响。这是机制的必然,不是实现上的缺陷。

绕开它的办法统称穿透技术UPnP(内网应用向路由器自动申请一条端口映射)、STUN(借外部服务器问出自己在公网上的地址与端口)、中继 TURN(第三方转发,双方都只做内网主动发起)。共同点是都在设法绕开"必须由内网发起"这条约束。

第二笔:要重算两个检验和。 一个是 IP 首部检验和——首部变了,必须重算。另一个容易被漏:TCP/UDP 检验和。运输层计算检验和时要加一个伪首部,而伪首部的头两个字段正是源 IP 与目的 IP——改了地址就改变了运输层检验和的正确值,不重算的话接收方一验就丢。NAPT 还改了端口号,更要重算。

第三笔:破坏了层次结构。 普通路由器转发时不改源/目的 IP,NAT 一定要改;普通路由器工作在网络层,NAPT 还要读写运输层的端口号。这是明确的层次僭越,也确实受过批评——但 NAT 已经成为互联网的重要构件。要能说清"违反在哪",而不是简单判它不成立。

层次僭越还带来一个连带问题:对没有端口号的协议不友好ICMP 就没有端口号,两台内网主机同时 ping 同一个地址时 NAT 无从区分,实现只能拿标识符之类的字段打补丁,不是通用机制。

第四笔:路由器从无状态变成有状态。 普通路由器转发完就忘,重启不影响任何通信;NAT 一旦重启或者转换表溢出,所有进行中的连接全部中断

最后厘清两处常见的混淆。NAT 不是防火墙:隐藏内网结构、挡住外部主动连入只是它的副作用,客观上确实有安全效果,但它本身不是安全设备,没有任何访问控制策略NAT 也不是 VPN:NAT 让专用网主机访问互联网,VPN 让分散的几个专用网通过公网互连并保密(把内部数据报加密后再封装成外部数据报)。

NAT 是止痛药,IPv6 才是手术——NAT 只能延缓地址耗尽,真正把地址空间从 232 扩到 2128 的是 IPv6

本节小结

  1. 专用地址是作用域被限定在本机构内的地址,全世界重复使用不冲突靠的是"互联网上的路由器对目的地址是专用地址的数据报一律不转发"这条硬规定;三块中 172.16.0.0/12 覆盖的是 172.16 ~ 172.31
  2. 基本 NAT 出方向改源地址、入方向改目的地址,但 n 个全球地址仍只能支撑 n 台主机同时上网;NAPT 引入端口号作为第二个区分维度才实现多对一,两台内网主机撞同一源端口不成问题——外部端口由 NAT 重新分配。
  3. 代价有四笔:外部无法主动连入是机制的必然(无表项即无从还原,故内网主机不能直接充当服务器)、必须重算 IP 首部与 TCP/UDP 两个检验和(伪首部含 IP 地址)、网络层设备读写运输层端口破坏了层次结构且对无端口协议不友好、路由器从无状态变成有状态。NAT 是止痛药,IPv6 才是手术。

考点速记

NAT 在真题里被考过的形式有四种,四种问的都是同一件事:这个报文经过 NAT 之后,哪几个字段变了、变成了什么。

① 转发后的源 IP 是哪个接口的地址(cn-2023-38)。H(192.168.0.3)向 Internet 发分组,经 NAT 路由器 R2 转发后源 IP 是什么。图上 R1 那一侧标着 192.168.0.34/30,要先把 R2 的对外接口算出来:/30 的块大小是 4,34 落在 32~35 这一块,其中 .32 是网络地址、.35 是广播地址,剩下 .33 和 .34 给链路两端——R1 是 .34,那么 R2 的对外接口就是 .33。答 A:192.168.0.33

这道题真正考的是"NAT 换成的是哪一个地址":不是 R2 的内网口 192.168.0.1(选项 C),更不是主机自己的 .3(选项 D),而是 R2 朝外那一侧的接口地址

② 换了个拓扑再问一次(cn-2016-38)。H3(192.168.3.251)访问 Web 服务器 S(130.18.10.1),问 R2 转发出去后的源 IP 与目的 IP。同样先定位 R2 的对外接口:R1–R2 链路用 201.1.3.8/30,R1 是 .9,R2 的 L0 口就是 .10。源 IP 换成 201.1.3.10目的 IP 不变仍是 130.18.10.1,答 D。选项 B 把目的 IP 也换掉了,C 把源写成了网络地址 201.1.3.8——网络地址不是任何接口的地址

③ 运输层首部的哪些字段会被改(cn-2025-37)。H(192.168.1.5/24)经 NAT 向 Internet 发一个 UDP 报文段,问 UDP 首部里哪些字段会被修改。四个候选是源端口号、目的端口号、总长度、校验和,答 B:仅 Ⅰ、Ⅳ

这道题正是第三节那两笔代价的直接考查源端口号要改,因为 NAPT 靠它区分内网主机;校验和要改,因为 UDP 检验和覆盖的伪首部里含源 IP 与目的 IP,源 IP 一换,原来的检验和就不对了。目的端口号是服务器的,NAT 不动;总长度取决于数据多少,NAT 只改字段值不改长度。只记住"NAT 改地址和端口"是答不对这道题的——必须知道伪首部里有 IP 地址。

④ 让内网服务器能被访问,要配什么(cn-2020-47,9 分)。这道题把 NAT 反过来用了一次。两个局域网都用 192.168.1.0/24,主机 IP 甚至重复(S1 侧的 Web 服务器和 S2 侧的 H2 都是 .2)——这恰恰说明"私网地址重用"是 NAT 隔离带来的。

第 (1) 问要让 H2、H3 能访问 Web 服务器,答案是在 R2 上配一条静态 NAT(端口转发)表项:外网 203.10.2.2 : 80 ↔ 内网 192.168.1.2 : 80。这是"外部无法主动连入"那条限制的标准解法——手工建一条常驻表项,替代"由内网发起才创建"。

第 (2) 问追踪 P 在三段路径上的源/目的地址,是本题最值得画的一步:H2 发出时是「192.168.1.2 → 203.10.2.2」(它只知道对方的公网入口);经 R3 做源地址转换后变成「203.10.2.6 → 203.10.2.2」;经 R2 做目的地址转换后变成「203.10.2.6 → 192.168.1.2」。两台 NAT 路由器各改一头——R3 改源(让回程找得到路),R2 改目的(把公网入口还原成真实的内网服务器)。

本篇练习区里还会出现另外十七道题,它们考的是 IP 编址与子网划分(定长/变长划分、网络地址与广播地址、路由聚合、掩码与网关配置),机制讲在 IP 编址与子网划分

易错NAT 换成的是路由器"朝外那一侧"的接口地址,不是内网口,也不是链路的网络地址。

易错只改源 IP,目的 IP 不变。 出方向改源、入方向改目的——因为要隐藏的始终是内网侧地址。

易错NAT 必须重算 TCP/UDP 检验和,因为伪首部里含源 IP 与目的 IP。这是"UDP 首部哪些字段会变"那道题的答题依据。

易错基本 NAT 的 n 个全球地址只能支撑 n 台主机同时上网。 多对一是 NAPT 靠端口号做到的,不是基本 NAT。

易错两台内网主机撞同一个源端口完全合法,端口号只在本主机内有意义;NAT 不保留原端口,重新分配。

易错内网主机不能直接充当服务器,因为转换表项只在内网发起时创建。要对外提供服务必须手工配端口转发。

易错172.16.0.0/12 覆盖的是 172.16 ~ 172.31,不是 172.255。

易错NAT 不是防火墙,它没有访问控制策略,安全效果只是副作用。

教材出处
  • 谢希仁《计算机网络》(第 8 版):专用地址,见印刷版 p186(4.8.1 虚拟专用网 VPN)——"RFC 1918 指明了一些专用地址。这些地址只能用于一个机构的内部通信,而不能用于和互联网上的主机通信。换言之,专用地址只能用作本地地址而不能用作全球地址。在互联网中的所有路由器,对目的地址是专用地址的数据报一律不进行转发";三个地址块为"10.0.0.0/8……172.16.0.0/12……192.168.0.0/16","上面的三个地址块分别相当于原来的一个 A 类网络、16 个连续的 B 类网络和 256 个连续的 C 类网络"。同页说明"全世界可能有很多的专用互连网络具有相同的 IP 地址,但这并不会引起麻烦,因为这些专用地址仅在本机构内部使用。专用 IP 地址也叫作可重用地址"。
  • 同书 p186–p188:VPN 与 NAT 的分工——VPN 是"利用公用的互联网作为本机构各专用网之间的通信载体","路由器 R1 收到内部数据报后……就把整个的内部数据报进行加密,然后重新加上数据报的首部,封装成为在互联网上发送的外部数据报"。
  • 同书 p188(4.8.2 网络地址转换):NAT 的原理——"网络地址转换 NAT 方法是在 1994 年提出的。这种方法需要在专用网连接到互联网的路由器上安装 NAT 软件。装有 NAT 软件的路由器叫作 NAT 路由器,它至少有一个有效的外部全球 IP 地址";转换过程以 A(192.168.0.3)经 NAT(172.38.1.5)访问 B(213.18.2.4)为例逐步给出,并指出"B 并不知道 A 的专用地址 192.168.0.3。实际上,即使知道了,也不能使用,因为互联网上的路由器不能转发目的地址是任何专用地址的 IP 数据报"。
  • 同书 p188–p189基本 NAT 的容量上限——"当 NAT 路由器具有 n 个全球 IP 地址时,专用网内最多可以同时有 n 台主机接入到互联网。这样就可以使专用网内较多数量的主机,轮流使用 NAT 路由器有限数量的全球 IP 地址"。
  • 同书 p189外部无法主动发起的论证——"通过 NAT 路由器的通信必须由专用网内的主机发起。设想如果有专用网上外面的主机要发起通信,当 IP 数据报到达 NAT 路由器时,NAT 路由器就不知道应当把目的 IP 地址转换成专用网内的哪一个本地 IP 地址。这就表明,专用网内部的主机不能直接充当服务器用"。同页表 4-9 给出 NAPT 地址转换表的四行样例(两台内网主机各用 TCP 端口 30000、被转换为 40001 与 40002),并说明"另一台主机 192.168.0.4 也选择了同样的 TCP 端口号 30000。这纯属巧合(端口号仅在本主机中才有意义)。现在 NAPT 把专用网内不同的源 IP 地址都转换为同样的全球 IP 地址。但对源主机所采用的 TCP 端口号(不管相同或不同),则转换为不同的新的端口号"。本篇折叠块中的表即照此结构自造数据重排。
  • 同书 p189层次问题——"从层次的角度看,NAPT 的机制有些特殊。普通路由器在转发 IP 数据报时,对于源 IP 地址或目的 IP 地址都是不改变的。但 NAT 路由器在转发 IP 数据报时,一定要更换其 IP 地址。其次,普通路由器在转发分组时是工作在网络层的。但 NAPT 路由器还要查看和转换运输层的端口号,而这本来应当属于运输层的范畴。也正因为这样,NAPT 曾遭受了一些人的批评……但不管怎样,NAT(包括 NAPT)已成为互联网的一个重要构件";同页还给出"使用端口号的 NAT 也叫作网络地址与端口号转换 NAPT,而不使用端口号的 NAT 就叫作传统的 NAT。但在许多文献中并没有这样区分"。
  • 同书 p218(5.2.2 UDP 的首部格式):伪首部含 IP 地址——"在计算检验和时,要在 UDP 用户数据报之前增加 12 个字节的伪首部……伪首部既不向下传送也不向上递交,而仅仅是为了计算检验和",图 5-5 给出的伪首部四个字段依次是源 IP 地址(4 字节)、目的 IP 地址(4 字节)、0 与协议号、UDP 长度。同书 p228 说明 TCP"在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。伪首部的格式与图 5-5 中 UDP 用户数据报的伪首部一样。但应把伪首部第 4 个字段中的 17 改为 6"。这两处合起来即本篇"NAT 必须重算运输层检验和"的依据。

相关知识

IP 编址与子网划分IPv6 基础UDP 协议TCP 报文段格式路由器与三层转发

真题练习