私有地址出了围墙就是废纸(3.13 结论),所以路由器必须在边界上当场改名换姓:出站时把包头的源地址换成自己的全局地址,同时在表里记下"谁换成了谁";回程时按那张表把目标地址换回去。这台路由器做的事就是 NAT——本节把它翻译的每一个动作拆开看。
3.13 讲的是"两种地址怎么衔接",NAT 是那节的配角;本节是它的放大镜版——只讲 NAT 自己:怎么改、改哪几个字段、有几种做法、付什么代价。
一、NAT 要解决的问题
一句话:地址不够用,但大家都得能上网。
- IPv4 一共约 43 亿个地址(3.12 收过这笔账),全球联网设备早就超过这个数
- 私有地址(3.13 的三段)可以让全世界重复使用,代价是它们不能在互联网上被路由——运营商看到
192.168.1.101只会当它是废纸 - 于是需要一台设备守在边界上,把私有地址临时"顶替"成全局地址
NAT 最早出现在 1994 年(RFC 1631),当时只当成临时应急方案——结果成了 IPv4 能活到今天的关键。所以它是"工程上的续命术",不是网络设计之初的本意(第四部分会讲它的代价)。
内网里两台设备互相通信,不经过 NAT——因为地址在同一个网段里都有意义(收 3.8:同段靠交换机直接送)。只有跨过私有/全局这条线时,才需要翻译。
二、翻译的完整过程
出站:改源地址 + 记一笔
内网设备 192.168.1.101 想访问网站服务器 198.51.100.7:443:
| 步骤 | 发生了什么 |
|---|---|
| 1 | 设备发出包:源 192.168.1.101:50000 → 目标 198.51.100.7:443 |
| 2 | 包到达路由器,路由器一看源地址是私有段——这个地址上不了互联网 |
| 3 | 把源 IP 换成 WAN 口的全局地址 203.0.113.5,同时把源端口换成一个自己指定的新端口 40000 |
| 4 | 在 NAT 会话表里记一笔:192.168.1.101:50000 ↔ 203.0.113.5:40000 |
| 5 | 把包转发出去;IP 首部校验和必须重算(改了首部就得重算,收 3.7) |
为什么连端口也要换? 因为不同设备的源端口可能撞车(两台电脑恰好都用了 50000)。如果不换端口,路由器就无法从回包的目的端口判断该给谁——所以它干脆给每条会话分发一个自己管理的新端口。这正是 NAPT 的本质(3.3 的"IP 找楼、端口找房",在边界上的实战)。
回程:查表还原
服务器回包,目标写的是 203.0.113.5:40000(它压根不知道内网的存在):
- 包到达路由器,拿目的端口
40000去查 NAT 表 - 命中记录 → 把目标 IP 和端口换回
192.168.1.101:50000 - 转发给内网设备
- 设备收到后毫无察觉——它以为自己一直在和服务器直接对话
这一条最容易记混:出站改源地址,回程改目标地址。因为对路由器来说,"是谁发出来的"和"该交给谁"是同一个身份的两个方向——表里那一行就是把这个身份的两副面孔绑在一起。
表项的寿命:会老化
NAT 表不是永久表,每条记录都有超时时间,长时间没有流量就自动删除:
| 协议 | 常见老化时间 |
|---|---|
| TCP | 几分钟到几小时(看设备,常见的默认值在 300 秒 ~ 2 小时之间) |
| UDP | 明显更短,常见 30 秒 ~ 3 分钟 |
这条能解释两个日常现象: - 挂了很久的网页,点一下要重新加载——TCP 连接和 NAT 表项一起超时了 - UDP 打洞要发"保活包"——因为 UDP 表项几十秒就没了,不续命洞就塌了
三、NAT 的三种形态
(对应上面那张对照图)区别就在"谁跟谁配对":
| 类型 | 配对方式 | 典型用途 |
|---|---|---|
| 静态 NAT | 一对一,人工写死 | 内网有台服务器要对外提供服务时,给它一个固定的公网号 |
| 动态 NAT | 多对多,从地址池里临时借 | 手上有几个公网号,谁先出网就借给谁,用完还回去 |
| NAPT / PAT | 多对一,靠端口区分 | 家用和小办公室路由器实际在用的就是这种,几十台设备共用一个公网号 |
术语别混: - NAT = 广义的"地址转换"(三种都算 NAT) - NAPT(Network Address Port Translation)= 端口也一起换,也叫 PAT、IP 伪装
家用路由器在设置页里写"NAT"、写"端口映射",实际干的是 NAPT——因为只有一个公网 IP。
3.13 说的端口转发,本质上就是跳过"自动记表"这一步,人工先把表项写好:公网:8080 ↔ 192.168.1.200:80,长期有效。所以它才允许外网主动连进来——表里已经有那条记录了。
四、NAT 的代价:换来的是"够用",付出的是"不透明"
代价一:端到端原则被打破
互联网最初的设计是任何两台设备都能直接对话(收 1.4:网络的网络,谁也不该被拦在外面)。NAT 在中间插了一道"必须有记录才放行"的关卡,"外 → 内"的主动连接就断了。
代价二:有些协议会卡在墙外
| 协议 | 撞墙原因 |
|---|---|
| FTP 主动模式 | 服务器要回头主动连客户端,被 NAT 拦下(改用被动模式可绕开) |
| SIP / IP 电话 | 地址信息写在数据里(应用层),NAT 只改 IP 头,改不到内容里的那串地址 |
| P2P / 游戏联机 | 双方都在内网,谁也没法主动连谁 → 需要 NAT 打洞(UPnP、STUN/TURN,3.13 提过) |
为了救这类协议,专门的设备/软件会做 ALG(应用层网关):把数据里的地址也翻一遍。但 ALG 规则复杂、易出错,现在已经不流行——主流方案是让协议自己去适应 NAT。
代价三:地址藏在应用层,NAT 看不见
NAT 只能操作它看得懂的包头(IP 头、TCP/UDP 头)。如果某个协议把 IP 地址放进了数据部分,NAT 是两眼一抹黑的——这就是代价二的根因。
代价四:校验和要重算
改了 IP 头 → IP 首部校验和必须重算;改了端口 → TCP/UDP 校验和也要重算(TCP 校验和会把源/目的地址、端口一起算进去)。所以路由器在这里并不是"顺手改两个字",而是要重算两处校验和——这是台台路由器都在做的开销。
代价五:排查变难
同一个内网地址,在不同时刻可能对应不同的公网端口。查日志时"这两个会话到底是不是同一台设备"常常对不上——这也是为什么企业排障时更希望有真实地址。
五、那 IPv6 呢?——NAT 的"退休方案"
IPv6 有 128 位地址,多到能给地球上每一粒沙子都发一个。地址不再短缺 → 端到端原则可以恢复,理论上不再需要 NAT。
但要记两条现实: 1. 现实中仍有 NAT66(少见),多是出于管理习惯而非地址短缺 2. 没有 NAT ≠ 没有防火墙——IPv6 时代边界上照样要有防护设备
一句话记住定位:NAT 是 IPv4 地址不够用的续命方案,不是网络该有的样子。 它做得很好,但它是"补丁"。
六、动手 Demo28:给 NAT 做一次体检
-
看翻译发生在哪一跳
tracert -4 www.baidu.com第一跳通常是192.168.1.1(自家路由器)——NAT 就在这一跳发生。出了第二跳地址就进入运营商段,再也看不到私有地址(收 3.7 Demo21)。 -
看自己刚出去的端口
netstat -an | findstr ESTABLISHED本机侧显示的全是私有地址 + 一个高位端口(49152~65535这一段是系统分配的"临时端口")。那个端口就是 NAT 表里"内网侧"的那一列。 -
看路由器怎么管这件事 进路由器管理页,找 NAT / 端口转发 / 虚拟服务器 / 连接数 这几栏:
- 端口转发 / 虚拟服务器:手工写死表项(静态配对)
- NAT 会话数 / 连接数:能看到现在有多少条会话在这台路由器里活着
- UPnP:开着的话,应用能自己申请开洞(游戏、下载工具爱用)
-
DMZ:把某台内网设备完全暴露到公网——最危险的一个开关,非必要别开
-
30 秒实验:看表项老化
打开几个网页,跑一遍
netstat -an | findstr ESTABLISHED,记下条数和几个端口号。然后什么都不做,静置 5~10 分钟,再跑一遍——条数会变少,之前记下的端口有几个已经消失了。 消失的那几条就是"TCP 连接 + NAT 表项一起超时"的结果。
这也顺便解释了为什么有些网站在你离开一会儿后需要重新登录——不是网站把你踢了,是连接从根上断了。
-
(可选)从外面敲自己家的门
用手机流量(不要连 Wi-Fi)访问自家公网 IP 的某个端口,比如
http://你的公网IP:8080——打不开。因为 NAT 表里没有这条记录,路由器直接把包丢了(3.13 的"出站容易入站难")。这就是那句"外面默认进不来"的实物证据。
- 私有地址为什么不能直接上互联网?NAT 是怎么绕过这个限制的?
- 出站和回程,NAT 分别改包的哪个字段?
- 为什么 NAT 连端口也要换?
- 内网两台电脑互相发消息,会不会经过 NAT?为什么?
- NAT 表项会不会一直留着?这对 UDP 打洞意味着什么?
- 三种 NAT 的区别是什么?家用路由器用的是哪种?
- 端口转发和"自动的 NAT"是什么关系?
- NAT 改了包头,为什么必须重算校验和?要重算几处?
- IPv6 普及之后还需要 NAT 吗?
答案: ① 因为私有地址不在互联网上被路由,运营商不认。NAT 在边界上把私有地址临时"顶替"成全局地址,回程再换回来,让内网设备借用一个公网号出门。 ② 出站改源地址(+源端口),回程改目标地址(+目标端口)——改的是同一个身份的两副面孔。 ③ 因为不同设备的源端口可能撞车,且多台设备要共用一个公网地址。换端口后,路由器才能靠"目的端口"这个唯一编号判断回包该给谁。 ④ 不会。同网段通信靠交换机直接送(3.8),地址在网内都有意义;只有跨过私有/全局边界才需要翻译。 ⑤ 不会,有超时老化:TCP 几分钟到几小时,UDP 明显更短(几十秒到几分钟)。所以 UDP 打洞必须定期发保活包续命。 ⑥ 静态 NAT 一对一固定配对(服务器对外服务);动态 NAT 多对多从池里临时借;NAPT 多对一靠端口区分。家用路由器用的是 NAPT(端口复用/IP 伪装)。 ⑦ 端口转发 = 手工预写一条固定的 NAT/NAPT 表项。因为表里已有记录,外网主动连进来就不再被丢——这正是它能让外部访问内网的原因。 ⑧ IP 首部校验和是给头部算的,改了源/目标地址就必须重算;TCP/UDP 的校验和把地址和端口也纳入计算,所以改端口还得再重算一次。共两处。 ⑨ 理论上不再需要(地址够用,端到端可恢复),现实中仍有极少数的 NAT66,但防火墙该有还是有。记住 NAT 是 IPv4 的续命补丁,不是设计本意。
常见误区:
- ❌ "NAT 就是路由器" → 路由器是一个设备角色,NAT 只是它的一项功能;NAT 也可以由专门的设备或软件来承担
- ❌ "NAT 只改源地址" → 出站改源、回程改目标,两个方向改的不是同一个字段
- ❌ "内网设备知道自己的地址被换了" → 完全不知道。NAT 对通信两端都是透明的:服务器只看到路由器,设备只看到服务器
- ❌ "NAT 表一旦建立就永久有效" → 有超时老化,UDP 尤其短。这也是"挂久了要重连"的原因
- ❌ "改了地址,TCP 校验和不用管" → 必须重算,而且IP 头和 TCP 头两处都要重算
- ❌ "有 NAT 什么协议都能穿" → FTP 主动模式、SIP、P2P 都可能卡住,需要 ALG 或打洞(3.13 的 UPnP 就是干这个的)
- ❌ "NAT 是安全设备" → 它的"挡"是副产物(3.13 讲过)。DMZ 一开、端口转发一加,内网就暴露了——安全性跟 NAT 无关
- ❌ "IPv6 来了 NAT 立刻消失" → 理论上不需要,现实中仍有少数 NAT66;而且没有 NAT 不等于没有防护
七、下一步学什么
- ☑ 3.15 数据是否成功传输给接收方(ICMP) —— ✅ 已完成 → 数据是否成功传输给接收方(ICMP):本节说"改了包头就得重算校验和",那万一包在半路送不到,又是谁回来通知发件人?答案就是它
- ☐ 3.16(按教材顺序) —— 报个标题接着走:按教材脉络,接下来大概率是 DNS 与域名(把名字换成地址)、IPv6 的地址写法,或 第三章小结。等你报标题。
相关笔记
- 数据是否成功传输给接收方(ICMP) —— 本节讲 NAT 怎么改包;下节讲包在半路出事时,是谁回来通知发件人
- 互联网中使用的地址与私有网络中使用的地址(全局地址、私有地址) —— 上节讲"两种地址怎么衔接",本节是 NAT 本身的放大镜版
- 为驱动应用程序而做准备的网络分层(传输层与应用层) —— "IP 找楼、端口找房":NAPT 靠端口区分设备,就是这条规矩在边界上的实战
- 数据的发送和接收(IP、IP数据包、路由) —— 本节那句"改了首部就要重算校验和",出处在这节的 IP 首部字段表
- 连接网络的过程(IP地址的设置) —— IPv4 地址耗尽这笔账,是 NAT 存在的根本原因
- 通信的对象(IP地址) —— 同网段不经 NAT,靠的是"网络部分相同就交换机直接送"这条规矩
- 网络的网络(互联网) —— 端到端原则与逐跳接力:NAT 打破的正是"任何两台设备都能直接对话"这个原始设想
- 用于构建网络的设备(网络设备) —— 路由器的 WAN 口 / LAN 口两张脸,本节解释了它凭什么能"改名换姓"