使用 Python 计算剩余的 CIDR 范围



使用子网后,我需要帮助在 Python 中计算剩余的 CIDR 范围。

例: 我想使用10.0.0.0/15的宽范围,并从中计算出如果我减去10.0.0.0/16,我还剩下多少可用范围(答案应该是10.1.0.0/16)

但是如果我想减去/24 或其他操作,这会变得更加棘手。

在 Python 内部有什么可以帮助解决这个问题吗?

谢谢

这很容易用netaddr模块来做。

from netaddr import *
subnet1= IPSet(IPNetwork("10.0.0.0/15"))
subnet2 = IPSet(IPNetwork("10.0.0.0/16"))
# symmetric difference
result = subnet1 ^ subnet2
print(result)

结果:IPSet(['10.1.0.0/16'])

如果要减去/24

from netaddr import *
subnet1= IPSet(IPNetwork("10.0.0.0/15"))
subnet2 = IPSet(IPNetwork("10.0.0.0/24"))
# symmetric difference
result = subnet1 ^ subnet2
print(result)

结果:

IPSet(['10.0.1.0/24', '10.0.2.0/23', '10.0.4.0/22', '10.0.8.0/21', '10.0.16.0/20', '10.0.32.0/19', '10.0.64.0/18', '10.0.128.0/17', '10.1.0.0/16'])

考虑您的示例:您分配了/15网络的/16子网,因此您将总主机地址空间一分为二,即您分配的地址空间,它对第 16 位具有0值,以及仍然空闲的,并且具有第 16 位的1

现在假设你有一个/14网。分配一个/16子网将给你留下3个空闲的/16子网,即分别具有011011在位置15-16的子网。当然,由于其中两个1位于第 15 位,我们也可以说您有一个/15子网 (10.2.0.0/15) 和一个/16子网 ('10.1.0.0/16)。

等等。

因此,当您从原始/15子网分配/24子网时,您将创建2**9(512)/24子网:您分配的子网和更多 511 子网。或者你可以说你只剩下一个/16,一个/17,...,一个/24自由子网。

我不知道有任何库可以做到这一点,但正如你所看到的,计算很简单。另一方面,开发一个系统来跟踪许多后续任务远非微不足道......

如果你想要一个所有子网的列表,这将可以:

def ip2int(dec_ip):
t = 0
for e,k in enumerate(reversed(dec_ip)):
t += k*16**(e*2)
return t
def int2ip(int_ip):
ip = []
for e in range(4):
ip.append(int_ip % 256)
int_ip //= 256
return list(reversed(ip))
def subtract_ip(mask, width, sub_width):
subnets = []
int_mask = ip2int(mask)
delta = int(2 ** (sub_width - width))
for d in range(1, delta):
subnets.append(int2ip(int_mask + d*2**(32-width)))
return subnets
subtract_ip([10,0,0,0], 14, 16)
[[10, 0, 1, 0], [10, 0, 2, 0], [10, 0, 3, 0]]

相关内容

  • 没有找到相关文章

最新更新