首页/网络/IP 与子网速查/用 Python ipaddress 做 IPv6 计算
IPv6 与下一代网络42 条

用 Python ipaddress 做 IPv6 计算

Python 的 ipaddress 模块原生支持 IPv6:取子网、数地址、压缩形式、判断类型都一行搞定;注意 hosts() 在 /64 上是 2^64 量级的迭代器,永远不要 list(),用 next/islice。

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

为什么用脚本算六层网段

六层地址数量以十的十九次方计,手工推算既慢又没有意义。地址库把前缀、子网、地址数量、压缩写法这些操作都封装好了,一行代码就能取到结果,脚本里也不需要在字符串上做分割拼接,出错概率大幅下降。

一个必须记住的边界

地址库可以列出某个网段内的所有可用主机,但在标准长度的子网上这个数量是十的十九次方量级。直接把它转换成列表会瞬间耗尽内存,正确做法是用迭代器配合截取函数只取前若干个,需要统计总数时读取数量属性而不是真的生成完整序列。

基本信息

适用环境Python 标准地址库,无需额外安装
常用操作取子网、数地址、压缩写法、类型判断
主机枚举返回迭代器,按需取值
危险操作对标准长度子网直接转成列表
边界行为子网内第一个地址被跳过,点对点前缀两个地址都可用

典型使用场景

  • 批量规划:把一个前缀按固定长度切成多个子网,输出结果直接用于配置生成
  • 容量核对:读取地址数量属性,快速确认某段前缀的规模量级
  • 地址规范化:把各种写法统一成标准压缩形式,便于比对与去重
  • 类型判断:判定地址是否为回环、链路本地、全局等,用于日志分类
  • 配置生成:按子网列表批量产出服务端监听地址与策略条目
  • 排障辅助:计算某个地址所在子网与网关,快速定位是否配置在正确范围内

常用操作(已实测输出)

常用操作(已实测输出)
import ipaddress as ipa
n = ipa.ip_network('2001:db8:acad::/48')
n.num_addresses            # 1208925819614629174706176
next(n.subnets(new_prefix=64))
# 按六十四位切分后的第一个子网

from itertools import islice
hosts = ipa.ip_network('2001:db8::/64').hosts()
list(islice(hosts, 3))
# 取前三个可用地址,避免生成完整序列

常用属性对照

属性含义注意点
地址数量该前缀包含的地址总数直接读取,不要枚举
子网切分按新前缀切分返回生成器,按需取值
可用主机可分配给接口的地址序列标准长度子网禁止整体转换
压缩形式标准化写法用于比对与去重
标准长度子网的主机枚举从全零地址之后的第一个开始,跳过用于子网路由的全零地址;点对点前缀比较特殊,两个地址都可用于接口,这与常见的长前缀习惯不同。
对标准长度子网调用整体转换会直接把内存吃满,属于典型的脚本事故:需要遍历时务必用迭代器配合截取函数,只取实际需要的数量。

易错点

  • 对标准长度子网枚举主机并整体转换成列表,内存瞬间耗尽导致脚本与主机异常
  • 把点对点前缀当作没有可用地址,实际两个地址都可用于接口,配置被无谓改写
  • 在字符串层面手工拼接地址,遇到压缩写法与大小写差异时解析出错,应使用地址库

数据来源与参考

  • Python ipaddress 官方文档
  • RFC 4291(地址架构)

相关工具

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