使用 Python 计算剩余的 CIDR 范围
Calculating remaining CIDR ranges with Python
我需要帮助来计算 Python 使用子网后剩余的 CIDR 范围。
示例:
我想使用 10.0.0.0/15 的广泛范围,并从中计算出如果我减去 10.0.0.0/16 还剩多少可用范围(答案应该是 10.1.0.0/16 )
但是如果我想减去 /24 或其他操作,这会变得更加棘手。
Python里面有什么东西可以帮助解决这个问题吗?
谢谢
考虑您的示例:您分配了 /15
网络的 /16
子网,因此您将总主机地址 space 一分为二,即您分配的那个,其中有第 16 位的 0
值,以及仍然空闲的值,第 16 位的值是 1
。
现在假设您有一个 /14
网络。分配一个 /16
子网将为您留下 3 个免费的 /16
子网,即位置 15-16 分别具有 01
、10
、11
的子网。当然,由于其中两个在位置 15 上有 1
,我们也可以说您有一个 /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]]
使用 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'])
我需要帮助来计算 Python 使用子网后剩余的 CIDR 范围。
示例: 我想使用 10.0.0.0/15 的广泛范围,并从中计算出如果我减去 10.0.0.0/16 还剩多少可用范围(答案应该是 10.1.0.0/16 )
但是如果我想减去 /24 或其他操作,这会变得更加棘手。
Python里面有什么东西可以帮助解决这个问题吗?
谢谢
考虑您的示例:您分配了 /15
网络的 /16
子网,因此您将总主机地址 space 一分为二,即您分配的那个,其中有第 16 位的 0
值,以及仍然空闲的值,第 16 位的值是 1
。
现在假设您有一个 /14
网络。分配一个 /16
子网将为您留下 3 个免费的 /16
子网,即位置 15-16 分别具有 01
、10
、11
的子网。当然,由于其中两个在位置 15 上有 1
,我们也可以说您有一个 /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]]
使用 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'])