3

我正在尝试编写一个脚本,将比/24 更大(不大于/16)的子网分解为/24 子网。例如:10.10.10.0/23 应该给我 10.10.10.0/24 和 10.10.11.0/24

我的逻辑是首先扫描 CIDR 掩码。如果小于 24,则从 24 中减去该数字(假设 x)给出 /24s 的总数,然后是 IP x 次和 /24 的 1 到第三个八位字节。

例如:10.10.8.0/22

if 22 < 24 
x = 24-22 = 2
total # of /24s = 2^x = 4
So output :
10.10.8.0/24
10.10.9.0/24 
10.10.10.0/24
10.10.11.0/24

我不知道如何只为第三个八位字节编码/修改字符串,并且只将 1 添加到第三个八位字节。

我正在考虑创建所有第三个八位字节值的列表并重新构建 IP。但是,如果那里有更简单的方法,那将对我有很大帮助!

谢谢 !

4

2 回答 2

4

看一下netaddr包。它已经内置了对理解网络掩码的支持,并且能够生成任何所需长度的子网列表:

>>> n = netaddr.IPNetwork('10.10.8.0/22')
>>> list(n.subnet(24))
[IPNetwork('10.10.8.0/24'), IPNetwork('10.10.9.0/24'), IPNetwork('10.10.10.0/24'), IPNetwork('10.10.11.0/24')]
>>> [str(sn) for sn in n.subnet(24)]
['10.10.8.0/24', '10.10.9.0/24', '10.10.10.0/24', '10.10.11.0/24']

从 Python 3.3 开始,这个功能也可以在新的内置ipaddress模块中使用。

于 2015-03-07T21:45:59.920 回答
4

如果您使用的是 Python 3.3 或更新版本,则可以使用ipaddress模块. 使用subnetsmethod,您可以在一行中完成:

>>> list(ipaddress.ip_network('10.10.8.0/22').subnets(new_prefix=24))
[IPv4Network('10.10.8.0/24'), IPv4Network('10.10.9.0/24'), IPv4Network('10.10.10.0/24'), IPv4Network('10.10.11.0/24')]

转换为字符串很简单。只需投射到str.

于 2015-03-07T21:50:38.567 回答