需要分解一个 IP 子网

Need to break down a IP subnet

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

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

例如: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

我不确定如何 code/modify 只为第三个八位位组添加字符串并只向第三个八位位组加 1。

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

谢谢!

看看 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 模块也提供此功能。

如果您使用的是 Python 3.3 或更高版本,则可以使用 the ipaddress module. Using the subnets method,一行即可完成:

>>> 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.