python - 建议下一个可用的 IP 网络块
问题描述
我想知道在给定现有列表的情况下,是否有一种好方法可以找到下一个可用间隙来创建网络块?
例如,我的列表中有这些网络:
[
'10.0.0.0/24',
'10.0.0.0/20',
'10.10.0.0/20',
]
然后有人走过来问:“你有足够的空间给我 1 /22 吗?”
我希望能够提出一些建议:“这是一个空格:xxxx/22”(xxxx 是 10.0.0.0 之前的东西)
或者
“这是一个空格:xxxx/22”(xxxx 介于 10.0.0.255 和 10.10.0.0 之间)
或者
“这是一个空格:xxxx/22”(xxxx 是 10.10.15.255 之后的内容)
我真的很感激任何建议。
解决方案
该ipaddress
库非常适合这种用例。您可以使用IPv4Network
该类来定义子网范围,IPv4Address
它可以返回的对象可以转换为整数进行比较。
我在下面做什么:
- 将您的给定列表建立为
IPv4Network
s的列表 - 确定我们正在寻找的块的大小
- 遍历列表,计算连续块之间的空间量,并检查我们想要的块是否适合。
您也可以返回IPv4Network
带有内置子网的 an,而不是IPv4Address
,但我将把它作为练习留给读者。
from ipaddress import IPv4Network, IPv4Address
networks = [
IPv4Network('10.0.0.0/24')
IPv4Network('10.0.0.0/20')
IPv4Network('10.0.10.0/20')
]
wanted = 22
wanted_size = 2 ** (32 - wanted) # number of addresses in a /22
space_found = None
for i in range(1, len(networks):
previous_network_end = int(networks[i-1].network_address + int(networks[i-1].hostmask))
next_network_start = int(networks[i].network_address)
free_space_size = next_network_start - previous_network_end
if free_space_size >= wanted_size:
return IPv4Address(networks[i-1] + 1) # first available address