需要分解IP子网

时间:2015-03-07 21:30:44

标签: python python-2.x netmask

我正在尝试编写一个脚本,它将比/ 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到3个八位字节。

例如: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。但是,如果有一个更简单的方法,这将帮助我很多!

谢谢!

2 个答案:

答案 0 :(得分: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模块中使用。

答案 1 :(得分:4)

如果您使用的是Python 3.3或更高版本,则可以使用the ipaddress module。使用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