用地址库判定特殊地址
地址库提供了成组的判定属性:是否私有、是否全局可路由、是否回环、是否链路本地、是否组播、是否保留。写脚本时用这些属性比自己维护一张地址表可靠得多。但有一个陷阱必须记住:私有属性的语义是“非全球地址的集合”,它把文档示例段与保留段也算在内。
私有与全局不是互补关系
很多人以为私有为假就代表是公网地址,这个推断不成立:运营商级转换使用的共享地址段既不是私有、也不是全局,因为标准上它不可全球路由,但也没有被划入私有集合。判断公网属性应当用全局属性,而不是对私有属性取反。
基本信息
| 私有属性 | 非全球地址集合,包含文档示例段与保留段 |
|---|---|
| 全局属性 | 可全球路由,更接近“公网地址”的语义 |
| 回环属性 | 回环专用段 |
| 链路本地属性 | 自动配置失败时使用的那一段 |
| 实测环境 | 本机地址库版本已实测上述取值 |
典型使用场景
- 资产清点:批量判定清单里的地址是否可全球路由,筛出误配的公网地址
- 访问控制生成:把非全局地址汇总成过滤清单,用于边界防护规则
- 日志分析:对日志里的来源地址做分类,快速区分内网流量与外部流量
- 上线前校验:检查配置里的地址是否落在保留或文档示例段,避免踩坑
- 教学演示:用一行代码展示同一个地址在两组属性上的取值差异,直观且不易忘
- 脚本加固:把判定逻辑写成函数并加注释,避免团队成员各写一套口径
典型判定(本环境实测)
典型判定(本环境实测)
import ipaddress as ip
ip.ip_address('100.64.0.1').is_private # False 共享地址不属于私有集合
ip.ip_address('100.64.0.1').is_global # False 但也不是全局地址
ip.ip_network('192.0.2.0/24').is_private # True 文档示例段也算非全球
ip.ip_network('198.18.0.0/15').is_private # True
ip.ip_address('8.8.8.8').is_global # True属性取值对照
| 地址 | 私有属性 | 全局属性 | 说明 |
|---|---|---|---|
| 100.64.0.1 | 假 | 假 | 共享地址,两者都不是 |
| 192.0.2.1 | 真 | 假 | 文档示例段 |
| 198.18.0.1 | 真 | 假 | 测试保留段 |
| 8.8.8.8 | 假 | 真 | 真实公网地址 |
| 240.0.0.1 | 真 | 假 | 保留段 |
不要用私有属性做私有网段判断:它会把文档示例段与保留段一并算进来;应当显式比对三个私有网段,需要判断非私有时也要单独写明范围。
各语言地址库的属性口径不完全一致,跨团队协作时建议把判定规则写成配置或常量集中维护,避免同一份清单在不同脚本里得到不同结论。