为什么用脚本算六层网段
六层地址数量以十的十九次方计,手工推算既慢又没有意义。地址库把前缀、子网、地址数量、压缩写法这些操作都封装好了,一行代码就能取到结果,脚本里也不需要在字符串上做分割拼接,出错概率大幅下降。
一个必须记住的边界
地址库可以列出某个网段内的所有可用主机,但在标准长度的子网上这个数量是十的十九次方量级。直接把它转换成列表会瞬间耗尽内存,正确做法是用迭代器配合截取函数只取前若干个,需要统计总数时读取数量属性而不是真的生成完整序列。
基本信息
| 适用环境 | 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))
# 取前三个可用地址,避免生成完整序列常用属性对照
| 属性 | 含义 | 注意点 |
|---|---|---|
| 地址数量 | 该前缀包含的地址总数 | 直接读取,不要枚举 |
| 子网切分 | 按新前缀切分 | 返回生成器,按需取值 |
| 可用主机 | 可分配给接口的地址序列 | 标准长度子网禁止整体转换 |
| 压缩形式 | 标准化写法 | 用于比对与去重 |
标准长度子网的主机枚举从全零地址之后的第一个开始,跳过用于子网路由的全零地址;点对点前缀比较特殊,两个地址都可用于接口,这与常见的长前缀习惯不同。
对标准长度子网调用整体转换会直接把内存吃满,属于典型的脚本事故:需要遍历时务必用迭代器配合截取函数,只取实际需要的数量。