Python 中的 IPv4Network - 计算不同大小的下一个最小子网?
IPv4Network in Python - Calculating next minimum subnet of different size?
我正在使用 Python 中的 ipaddress
模块,并试图找出一种方法来计算下一个可用子网(具有相同前缀或不同前缀) t 与现有子网重叠(新子网必须 大于旧子网)。
假设我从网络开始:
from ipaddress import IPv4Network
# From 10.90.1.0 to 10.90.1.31
main_net = IPv4Network("10.90.1.0/27")
我知道下一个可用地址将是 10.90.1.32
,我什至可以很容易地通过以下方式计算出来:
next_ip = main_net.broadcast_address + 1
# will output 10.90.1.32
print(next_ip)
如果我想找到下一个 /27
,我只需像这样创建一个新网络:
# From 10.90.1.32 to 10.90.1.63
new_net = IPv4Network(f"{next_ip}/27")
到目前为止这一切都非常简单,但是现在如果我要查找的下一个子网是 /26
或 /28
怎么办 - 我如何才能找到下一个最小起始 IP 地址Python?
中的任何一种情况
我已经探索过使用 supernet
方法,例如我可以这样做:
# Will print 10.90.1.0/26
print(main_net.supernet(new_prefix=27))
这个方法的问题是它会打印 10.90.1.0/26
与现有的 10.90.1.0/27
网络重叠,我可以做一个循环并让它继续生成下一个 /26
直到它们不再重叠,但对我来说似乎效率低下。当然,还有更好的方法吗?
多亏了 Ron Maupin 的有用评论和有用指南的帮助,我成功地创建了一个函数来执行此操作。我还想多测试一下,但相信它是正确的:
def calculate_next_ip_network(ip_bytes, current_prefix, next_prefix):
next_prefix_mask = (~((1 << (32 - next_prefix)) - 1)) & 0xFFFFFFFF
if next_prefix <= current_prefix:
bit_shift = 32 - next_prefix
else:
bit_shift = 32 - current_prefix
new_ip = (((next_prefix_mask & ip_bytes) >> bit_shift) + 1) << bit_shift
return bytes([new_ip >> i & 0xFF for i in (24, 16, 8, 0)])
用法:
nt = IPv4Network("10.90.1.56/29")
current_prefix = nt.prefixlen
next_prefix = 25
ip_bytes = int.from_bytes(nt.network_address.packed, byteorder="big")
next_ip = calculate_next_ip_network(ip_bytes, current_prefix, next_prefix)
print(IPv4Address(next_ip))
# Should print "10.90.1.128"
我正在使用 Python 中的 ipaddress
模块,并试图找出一种方法来计算下一个可用子网(具有相同前缀或不同前缀) t 与现有子网重叠(新子网必须 大于旧子网)。
假设我从网络开始:
from ipaddress import IPv4Network
# From 10.90.1.0 to 10.90.1.31
main_net = IPv4Network("10.90.1.0/27")
我知道下一个可用地址将是 10.90.1.32
,我什至可以很容易地通过以下方式计算出来:
next_ip = main_net.broadcast_address + 1
# will output 10.90.1.32
print(next_ip)
如果我想找到下一个 /27
,我只需像这样创建一个新网络:
# From 10.90.1.32 to 10.90.1.63
new_net = IPv4Network(f"{next_ip}/27")
到目前为止这一切都非常简单,但是现在如果我要查找的下一个子网是 /26
或 /28
怎么办 - 我如何才能找到下一个最小起始 IP 地址Python?
我已经探索过使用 supernet
方法,例如我可以这样做:
# Will print 10.90.1.0/26
print(main_net.supernet(new_prefix=27))
这个方法的问题是它会打印 10.90.1.0/26
与现有的 10.90.1.0/27
网络重叠,我可以做一个循环并让它继续生成下一个 /26
直到它们不再重叠,但对我来说似乎效率低下。当然,还有更好的方法吗?
多亏了 Ron Maupin 的有用评论和有用指南的帮助,我成功地创建了一个函数来执行此操作。我还想多测试一下,但相信它是正确的:
def calculate_next_ip_network(ip_bytes, current_prefix, next_prefix):
next_prefix_mask = (~((1 << (32 - next_prefix)) - 1)) & 0xFFFFFFFF
if next_prefix <= current_prefix:
bit_shift = 32 - next_prefix
else:
bit_shift = 32 - current_prefix
new_ip = (((next_prefix_mask & ip_bytes) >> bit_shift) + 1) << bit_shift
return bytes([new_ip >> i & 0xFF for i in (24, 16, 8, 0)])
用法:
nt = IPv4Network("10.90.1.56/29")
current_prefix = nt.prefixlen
next_prefix = 25
ip_bytes = int.from_bytes(nt.network_address.packed, byteorder="big")
next_ip = calculate_next_ip_network(ip_bytes, current_prefix, next_prefix)
print(IPv4Address(next_ip))
# Should print "10.90.1.128"