私有与保留 IP 地址段
这些地址块永远不会出现在公共互联网上,还有一些看起来像公网地址,其实并不是。
简要说明
IPv4 中有三个地址块保留给私有网络,一个保留给运营商级 NAT,另有几个小地址块分别用于环回、链路本地通信、文档示例和组播。它们都无法从公共互联网访问,而这正是它们的用处所在。
| 地址块 | 地址数量 | RFC | 常见场景 |
|---|---|---|---|
| 10.0.0.0/8 | 16,777,216 | 1918 | 办公网络、VPN、云 VPC |
| 172.16.0.0/12 | 1,048,576 | 1918 | Docker 默认网桥为 172.17.0.0/16,就在此块内 |
| 192.168.0.0/16 | 65,536 | 1918 | 家用路由器,常见的 192.168.1.x |
| 100.64.0.0/10 | 4,194,304 | 6598 | ISP 与用户之间的运营商级 NAT |
| 127.0.0.0/8 | 16,777,216 | 1122 | 环回;127.0.0.1 即 localhost |
| 169.254.0.0/16 | 65,536 | 3927 | DHCP 失败时自动分配 |
| 192.0.2.0/24、198.51.100.0/24、203.0.113.0/24 | 768 | 5737 | 文档示例;从不路由 |
| 224.0.0.0/4 | 268,435,456 | 5771 | 组播组 |
| 240.0.0.0/4 | 268,435,456 | 1112 | 保留供未来使用 |
RFC 1918 为何存在
IPv4 约有 43 亿个地址,这些地址在 2010 年代于注册机构层面耗尽。RFC 1918 让每个组织都能在路由器后面重复使用同样的三个地址块,由路由器把私有地址转换为公网地址,从而推迟了耗尽。带有私有源地址或目的地址的数据包会被互联网路由器丢弃,因此同一个 192.168.1.10 可以存在于数百万个家庭网络中而不冲突。
代价是,私有地址只能标识其所在网络内的设备。Web 服务器无法通过私有地址区分两位访客,因为它根本看不到这些地址:它看到的是路由器的公网地址。
三个私有地址块不能互换
它们的区别只在于大小,而大小决定了使用习惯:
- 10.0.0.0/8 是一个巨大的地址块。单个 /8 提供 1670 万个地址,足以让大型企业或云服务商划分成子网。它也是最容易在两家公司合并时发生冲突的地址段,前提是两家公司内部都使用了 10.0.0.0/8。
- 172.16.0.0/12 覆盖 172.16.0.0 到 172.31.255.255,而不是整个 172 段。172.32.0.1 是公网地址。这是常见的混淆来源,也是 172.17.0.1 上的 Docker 网桥属于私有地址、而 172.32.0.1 不属于的原因。
- 192.168.0.0/16 最小,也最熟悉。家用路由器出厂时使用 192.168.1.1 或 192.168.0.1,这个块对家庭来说足够大,又小到可以记住。
运营商级 NAT 不属于 RFC 1918
100.64.0.0/10 于 2012 年被保留,用于 ISP 在无法为每位用户分配公网 IPv4 地址时部署的 NAT 层。它的行为类似私有地址空间,但不属于三个 RFC 1918 地址块之一。这一区别在日志中很重要:100.64.x.x 的源地址意味着请求经过了 ISP 的 NAT,因此该地址不能用来识别用户,对它做地理位置查询返回的是 ISP,而不是用户。
环回与链路本地
127.0.0.0/8 是环回地址块。发往其中任何地址的流量都不会离开本机。127.0.0.1 是惯用名称;127.0.0.53 被一些本地 DNS 解析器使用。仅绑定到 127.0.0.1 的服务无法从其他主机访问,这是安全特性,不是缺陷。
169.254.0.0/16 是链路本地地址。当设备无法从 DHCP 获取地址时,它会从此块中选择一个地址并在本地链路上通告。该地址仅在该链路上有效。在机器上看到 169.254.x.x 是一个诊断信号:DHCP 请求没有得到响应。
文档地址块
192.0.2.0/24、198.51.100.0/24 和 203.0.113.0/24 的存在,是为了让示例、截图和测试可以使用看起来真实、但不指向任何人服务器的地址。它们从不被路由。IPv6 中对应的概念是 2001:db8::/32。如果某个教程使用了属于真实公司的、看起来像公网的地址,那它是个糟糕的教程。
IPv6 私有地址空间
IPv6 没有与 RFC 1918 历史相同的对应物,但有两个保持本地的地址范围:
- fc00::/7 是唯一本地地址,定义于 RFC 4193。其中 fd00::/8 这一半是应当随机生成的;fc00::/8 这一半是保留的。它是最接近私有地址空间的东西,且无法在公共互联网上路由。
- fe80::/10 是链路本地地址。每个 IPv6 接口都会自动配置一个,路由器不会转发它。邻居发现协议运行在其上。
第三个范围 ::ffff:0:0/96 完全不是私有地址:它是用 IPv6 表示法书写的 IPv4 地址。值得认识它,以免被误认为是原生 IPv6 地址。
实际检查地址段
查询页面会显示你的连接所呈现的公网地址。如果该地址落在上述某个私有或保留地址块中,页面会说明这一点并跳过位置查询,因为不存在可查找的公共位置。如需快速手动检查,请记住:私有地址以 10. 开头,或以 172.16 到 172.31 开头,或以 192.168 开头;链路本地地址以 169.254 开头;环回地址以 127 开头。
一点提醒。日志中的私有地址并不能告诉你它是哪台设备。同一个 192.168.1.10 会出现在数百万个网络中。要将其与某个人关联起来,需要路由器的 NAT 表,而网站没有这张表,也不应索要它。