首页/网络/IP 与子网速查/用 Python ipaddress 判定特殊地址
私网与特殊地址45 条

用 Python ipaddress 判定特殊地址

ipaddress 模块内置特殊地址属性:is_private / is_global / is_loopback / is_link_local / is_multicast / is_reserved;is_private 的语义是“非全球地址”,与 RFC1918 私网不完全等价。

IP 与子网速查网络更新于 2026-10-13

用地址库判定特殊地址

地址库提供了成组的判定属性:是否私有、是否全局可路由、是否回环、是否链路本地、是否组播、是否保留。写脚本时用这些属性比自己维护一张地址表可靠得多。但有一个陷阱必须记住:私有属性的语义是“非全球地址的集合”,它把文档示例段与保留段也算在内。

私有与全局不是互补关系

很多人以为私有为假就代表是公网地址,这个推断不成立:运营商级转换使用的共享地址段既不是私有、也不是全局,因为标准上它不可全球路由,但也没有被划入私有集合。判断公网属性应当用全局属性,而不是对私有属性取反。

基本信息

私有属性非全球地址集合,包含文档示例段与保留段
全局属性可全球路由,更接近“公网地址”的语义
回环属性回环专用段
链路本地属性自动配置失败时使用的那一段
实测环境本机地址库版本已实测上述取值

典型使用场景

  • 资产清点:批量判定清单里的地址是否可全球路由,筛出误配的公网地址
  • 访问控制生成:把非全局地址汇总成过滤清单,用于边界防护规则
  • 日志分析:对日志里的来源地址做分类,快速区分内网流量与外部流量
  • 上线前校验:检查配置里的地址是否落在保留或文档示例段,避免踩坑
  • 教学演示:用一行代码展示同一个地址在两组属性上的取值差异,直观且不易忘
  • 脚本加固:把判定逻辑写成函数并加注释,避免团队成员各写一套口径

典型判定(本环境实测)

典型判定(本环境实测)
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真假保留段
不要用私有属性做私有网段判断:它会把文档示例段与保留段一并算进来;应当显式比对三个私有网段,需要判断非私有时也要单独写明范围。
各语言地址库的属性口径不完全一致,跨团队协作时建议把判定规则写成配置或常量集中维护,避免同一份清单在不同脚本里得到不同结论。

易错点

  • 把私有属性当内网白名单使用,会把文档示例段与保留段一起放进来
  • 认为私有属性为假就代表公网地址,共享地址段两者皆假,判断会出错
  • 不同脚本各自维护地址清单,版本更新后口径不一致,审计结论互相矛盾

数据来源与参考

  • Python ipaddress 官方文档
  • RFC 6890(特殊用途语义)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌