建议下一个可用的IP网络块

时间:2019-04-18 01:54:03

标签: python

我想知道是否有一个很好的方法来找到下一个可用的缺口,从而在给定现有清单的情况下创建一个网络区块?

例如,我的列表中有以下网络:

[
    '10.0.0.0/24',
    '10.0.0.0/20',
    '10.10.0.0/20',
]

然后有人来问:“您有足够的空间容纳我1/22吗?”

我希望能够提出一些建议: “这里是一个空格:x.x.x.x / 22”(x.x.x.x早于10.0.0.0)

“这里是一个空格:x.x.x.x / 22”(x.x.x.x介于10.0.0.255和10.10.0.0之间)

“这里是一个空格:x.x.x.x / 22”(x.x.x.x出现在10.10.15.255之后)

我真的很感谢任何建议。

1 个答案:

答案 0 :(得分:2)

ipaddress库非常适合此类用例。您可以使用IPv4Network类定义子网范围,并且可以将其返回的IPv4Address对象转换为整数以进行比较。

我在下面做什么:

  1. 将给定列表建立为IPv4Network的列表
  2. 确定我们要查找的块的大小
  3. 遍历列表,计算连续块之间的空间量,并检查我们所需的块是否适合。

您也可以返回内置了子网的IPv4Network而不是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
相关问题