私有地址是「谁都能用,但不能出现在公网上」的三段,一共 1789 万个。 它让 IPv4 多撑了二十年,代价是「端到端被破坏」。
4.3.7 讲「怎么切地址」,这一节讲「哪些地址不用申请」。 NAT 是它的搭档,两者一起构成「IPv4 续命方案」。
一、三段私有地址
RFC 1918 规定的三段:
| 私有段 | 地址数 | 谁能用 |
|---|---|---|
| 10.0.0.0/8 | 16777216 | 大企业、云内网 |
| 172.16.0.0/12 | 1048576 | 中型网络 |
| 192.168.0.0/16 | 65536 | 家庭、小办公 |
第二段那个 /12 是最容易被记错的: 它不是 172.16.0.0/16,而是 /12——覆盖 172.16 到 172.31 这十六个 /16。 所以它的地址数是 16 乘 65536 得 1048576,不是 65536。 三段加起来 17891328 个,占 IPv4 全部地址的 0.4%: 这个比例很小,但因为「可以重复使用」,实际效果是「一个地址顶很多个」。 全球有几百万个网络都在用 192.168.1.0/24,它们互不冲突,因为「不出门」。
二、NAT 救了多少
NAT 的做法是「出口改写源地址和端口」:
| 位置 | 源地址 | 源端口 |
|---|---|---|
| 内网发出 | 192.168.3.152 | 54321 |
| 出口改写 | 203.0.113.7 | 40001 |
| 回来时 | 反查表还原 | 还原 |
第二行是关键:它把「很多内网地址」压成「一个公网地址 + 不同的端口」。 所以一个公网 IP 理论上能带 6 万多个并发连接—— 这就是「一个办公室只用一个公网地址」能成立的原因。 算一下如果没有 NAT:一万人的公司要一万个公网地址,而全球 IPv4 只有 43 亿个, 「人均一个」都做不到。 所以 NAT 不是「权宜之计」,它是 IPv4 活到今天的主要原因。 顺带说清「NAT 和代理的区别」:NAT 是在 IP 层改头部字段,连接还是那条; 代理是「重新建一条连接」,应用层根本不知道。 所以「NAT 对应用透明」而「代理需要应用配合」。
三、代价是端到端被破坏
「端到端」的意思是「任何一台主机都能直接连任何一台」:NAT 之后这句话不成立了, 因为外面根本不知道「内网那台机器」的地址。 受影响的应用有一长串:
| 应用 | 问题 | 绕法 |
|---|---|---|
| P2P 下载 | 对方连不进来 | 打洞、中继 |
| VoIP 通话 | 收不到呼叫 | STUN、TURN |
| 家庭监控 | 外面看不到 | 端口映射、云中转 |
这一整列「绕法」都是为 NAT 付的税: STUN 是「问服务器我的公网地址是什么」,TURN 是「实在打不通就都走服务器中转」。 所以「视频通话为什么有时连不上」——因为两端的 NAT 都是「对称型」,打洞失败。 IPv6 的一个核心动机就是「恢复端到端」:地址够多,每台设备都能有全局地址,不需要 NAT。 但现实是「IPv6 也常常配防火墙」,所以「端到端」这个理想并没有完全回来—— 不过至少「不用改写头部」了,协议栈干净很多。
四、动手 Demo:私有地址到底有多少个
算三段私有地址的总量,看它占 IPv4 的多少,再想一下 NAT 省了多少。 注意第二段:172.16.0.0/12 不是 /16。
import ipaddress
total = 0
for cidr in ('10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16'):
n = ipaddress.ip_network(cidr).num_addresses
total += n
print('%-16s %8d 个' % (cidr, n))
print('合计 %d 个,占 %.2f%%' % (total, 100.0 * total / 2 ** 32))
实跑输出:
--------------------------------------------------------------------
私有地址到底有多少个
--------------------------------------------------------------------
**私有地址是「谁都能用,但不能出现在公网上」的三段。**
**它们的存在让 IPv4 多撑了二十年。**
私有段 地址数 约
---------------------------------------------
10.0.0.0/8 16777216 1677.72 万个
172.16.0.0/12 1048576 104.86 万个
192.168.0.0/16 65536 6.55 万个
**三段加起来 0.18 亿个**,占 IPv4 全部地址的 **0.4%**。
**注意第二段是 /12 不是 /16**:**172.16 到 172.31 这十六个 /16 都算私有**,
**所以它的地址数是 16 乘 65536 得 1048576。**
**这个细节经常被记成「172.16.0.0/16」,那是不对的。**
**为什么它能救命**:
**企业内网用私有地址,出口只用一个公网地址做 NAT。**
**于是一万个员工的网络,只消耗一个公网地址。**
**算一下「如果不做 NAT」**:**一万人的公司要一万个公网地址**,
**而全球 IPv4 只有 43 亿个**——**「人均一个」都做不到。**
**所以 NAT 不是「权宜之计」,它是 IPv4 能活到今天的主要原因。**
**它的代价是「端到端被破坏」**:
**外面主动连不进来,P2P、VoIP、家庭监控全都需要「打洞」或者端口映射。**
0.4% 这个比例看起来「微不足道」,但效果完全不同:因为「私有地址可以全球重复使用」, 所以「1789 万个地址」的容量相当于「每次 NAT 后面都能挂几万台」。 换句话说,它的价值不在「数量」,在「可重复」。 「NAT 表项」是个实际的容量限制:家用路由器一般几千到几万条,企业级几十万条。 所以「全公司都在下载」时,NAT 表会被填满,表现是「新连接建不起来」,而老连接还好用—— 这个症状很容易被误判成「带宽不够」。 最后说一个「私有地址和 VPN 的配合」:公司内网用 10.0.0.0/8,员工在家用 192.168.1.0/24, 两边都可能是「私有地址」,所以 VPN 要「把两段地址隔开」。 这就是「家里网段和公司网段冲突,VPN 连上就断网」的经典故障—— 解决办法是把家里的网段改成 192.168.99.0/24 之类。
30 秒实验
- 算一下:三段私有地址一共多少个?占 IPv4 多少?
- 想一下:一个公网 IP 最多能带多少个 NAT 连接?
- 想一下:为什么「家里和公司网段相同」会让 VPN 断网?
常见误区
- 以为「172.16.0.0/16 是私有段」。 是 /12,覆盖 172.16 到 172.31。
- 以为「私有地址不能重复使用」。 恰恰相反,全球有几百万个网络都在用 192.168.1.0/24。
- 以为「NAT 和代理是一回事」。 NAT 改头部、连接不变;代理是重新建连接。
自测三问(点开对答案)
1. 三段私有地址分别是什么? —— **10.0.0.0/8、172.16.0.0/12、192.168.0.0/16**,合计约 1789 万个。 2. 为什么私有地址「价值不在数量」? —— **它可以全球重复使用**,所以「一个地址顶很多个」。 3. NAT 的代价是什么? —— **端到端被破坏**:外面主动连不进来,P2P、VoIP 都要打洞。下一节看全局地址由谁分配,以及它什么时候分完的。
- ☐ (本节完,下一节 4.3.9 全局地址由谁决定)