NAT 在边界上把私有地址换成公网地址,回程再换回来。 严格说今天用的是 NAPT:它不只换地址,还换端口。
4.3.8 讲过私有地址,这一节讲它们怎么和公网对接。 5.6.2 会讲那张转换表,这一节先把定义和范围理清。
一、三段私有地址
RFC 1918 规定了三段「谁都能用、但不能上公网」的地址:
| 地址段 | 地址数 | 典型用途 |
|---|---|---|
| 10.0.0.0/8 | 16777216 | 大企业、云内网 |
| 172.16.0.0/12 | 1048576 | 中型网络 |
| 192.168.0.0/16 | 65536 | 家庭、小办公室 |
第三行是你家里在用的: 「192.168.1.1」这个网关地址,全世界有几亿台设备在用—— 它们各自在自己的局域网里当网关,互不干扰。 这就是「私有地址可以重复使用」的含义:它只在「一个组织内部」唯一,不要求全球唯一。 而 NAT 的作用就是「让这种重复不冲突」。
二、NAT 和 NAPT 的区别
两个词经常混用,但严格说不一样:
| 类型 | 改什么 | 一个公网 IP 能带几台 |
|---|---|---|
| NAT | 只改 IP 地址 | 一台 |
| NAPT | 改 IP 加端口 | 很多台 |
第二行才是今天实际在用的:因为它靠端口号区分「同一个公网地址后面的不同内网设备」。 没有端口,回程的包就不知道该给谁。 所以「NAT」这个词在今天其实是个「简称」:大家说 NAT,指的是 NAPT。 真正的「纯 NAT」(一对一)只在「地址迁移」等少数场景用。
三、它在哪一层做
NAT 是「网络层加传输层」的操作:改 IP 地址要用网络层的字段,改端口要用传输层的字段。 所以它是「跨层」的,这也是它「违反端到端原则」的根源。
| 改什么 | 在哪个头里 | 后果 |
|---|---|---|
| 源/目的 IP | IP 头 | 地址不再等于身份 |
| 源/目的端口 | TCP/UDP 头 | 必须懂上层协议 |
第二行的后果最麻烦: 要改端口,就得知道「这个包是不是 TCP/UDP、头有多长」——于是 NAT 设备被迫理解上层协议。 遇到 ICMP(没有端口)、FTP(地址写在载荷里)就会出问题。 所以 NAT 不是「一个简单的地址转换」:它把「网络应该透明」这个前提破坏掉了, 后面所有的麻烦(5.6.4)都是从这里长出来的。
四、动手 Demo:NAT 到底改了什么
先把三段私有地址列出来,再看一次出方向和回方向的转换。 注意「源地址换了、端口也换了」:这就是 NAPT。
rows = [('出去', '192.168.3.152:51000', '203.0.113.7:40001'),
('回来', '203.0.113.7:40001', '192.168.3.152:51000')]
for a, b, c in rows:
print(a, b, '->', c)
实跑输出:
--------------------------------------------------------------------
NAT 到底改了什么
--------------------------------------------------------------------
**NAT 做的事只有一件**:**在包的边界上,把「私有地址」换成「公网地址」。**
**回程再换回来。**
私有地址段 地址数 典型用途
-----------------------------------------------------------
**10.0.0.0/8** **16777216** **大企业**
**172.16.0.0/12** **1048576** **中型网络**
**192.168.0.0/16** **65536** **家庭和小办公室**
**这三段是 RFC 1918 规定的「谁都可以用、但不能上公网」的地址。**
**所以「全世界有无数台 192.168.1.1」**——**它们各自在自己的局域网里当网关,互不干扰。**
**转换过程看一眼就懂**:
方向 源 目的
-----------------------------------------------------------------
**出去** **192.168.3.152:51000** **203.0.113.7:40001**
**回来** **203.0.113.7:40001** **192.168.3.152:51000**
**源地址被换了,端口也被换了**——**所以严格说这不是 NAT,是 NAPT(网络地址端口转换)。**
**只是大家习惯统称 NAT。**
**为什么要换端口**:**因为一个公网地址要供很多台内网设备用**,
**只换地址的话,回程就分不清该给谁了。**
**端口就是「门牌号后面的房间号」。**
「端口也换了」这件事很多教材不提,但它很关键: 如果只换 IP 不换端口,一个公网地址就只能带一台内网设备—— 那就完全解决不了「地址不够」的问题。 「回程」那一行是「表」在起作用: NAT 设备记住「40001 这个端口对应 192.168.3.152 的 51000」,回程的包一进来就查表改回去。 所以 NAT 是「有状态」的——设备一重启,表就没了,所有连接都断。 「203.0.113.7」这个地址是文档专用段(TEST-NET-3):写例子时用它,不会和真实地址撞车。 这一点和 2001:db8::/32 是一个道理。
30 秒实验
- 算一下:10.0.0.0/8 有多少个地址?是 192.168.0.0/16 的几倍?
- 想一下:为什么「纯 NAT」解决不了地址不够?
- 想一下:NAT 设备重启后为什么所有连接都断?
常见误区
- 以为「NAT 就是换个 IP」。 还换端口,否则一个公网地址只能带一台设备。
- 以为「私有地址是随便定的」。 RFC 1918 规定了三段,乱用会撞车。
- 以为「NAT 不影响上层」。 它必须懂 TCP/UDP,否则改不了端口。
自测三问(点开对答案)
1. 三段私有地址是哪三段? —— **10.0.0.0/8、172.16.0.0/12、192.168.0.0/16。** 2. NAT 和 NAPT 的区别是什么? —— **NAT 只改 IP,NAPT 改 IP 加端口**;今天用的是 NAPT。 3. NAT 为什么是「有状态」的? —— **它要维护一张转换表**,回程靠查表改回去;设备重启表就丢了。下一节看那张表怎么工作、能装多少会话。
- ☐ (本节完,下一节 5.6.2 NAT的工作机制)