首页 > 解决方案 > 建议下一个可用的 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 之后的内容)

我真的很感激任何建议。

标签: python

解决方案


ipaddress库非常适合这种用例。您可以使用IPv4Network该类来定义子网范围,IPv4Address它可以返回的对象可以转换为整数进行比较。

我在下面做什么:

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

您也可以返回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

推荐阅读