我试图检查用户是否试图分配一个保留地址。目前我们正在保留前5个和后5个地址以备将来使用。我这样做的方式atm真的很慢,在ipv6交换机的情况下不会有效地工作。有没有其他方法来优化检查?
def verify_ip_subnet(ip_address, subnet_address):
new_subnet = subnet_address.split('/')[1].strip()
if int(new_subnet) == 16:
new_vpn_range = []
new_vpn_range.append(subnet_address.split('/')[0].strip())
new_count = 0
for address in ipaddress.ip_network(subnet_address).hosts():
if new_count == 0 or new_count == 1 or new_count == 2 or new_count == 3 or new_count == 4 or new_count == 65531 or new_count == 65532 or new_count == 65533:
new_vpn_range.append(str(address))
new_count += 1
if ip_address in new_vpn_range:
return False
if int(new_subnet) == 24:
new_vpn_range = []
new_vpn_range.append(subnet_address.split('/')[0].strip())
new_count = 0
for address in ipaddress.ip_network(subnet_address).hosts():
if new_count == 0 or new_count == 1 or new_count == 2 or new_count == 3 or new_count == 4 or new_count == 251 or new_count == 252 or new_count == 253:
new_vpn_range.append(str(address))
new_count += 1
if ip_address in new_vpn_range:
return False
以下是导入的示例:
ip_address = '10.8.0.5'
subnet_address = '10.8.0.0/16'
另一种方法是使用num_addresses在这种情况下我可以检查前5个保留的地址,但是如果我试图检查最后5个地址,索引就会超出范围。下面是一个我如何检查它们的例子:
ip_check = ipaddress.ip_network(subnet_address)
for i in range(6):
if str(ip_check[i]) == ip_address:
return False
last_address = ip_check.num_addresses
print(last_address)
print(ip_check[last_address])
1条答案
按热度按时间rxztt3cl1#
如果要了解IP是否保留用于其他一般用途,可以使用具有布尔属性(is_reserved)的ipaddress.ip_address来了解IP是否保留用于IPv4和IPv6:
还有许多其他属性,如
is_private
、is_global
、is_loopback
...当你想指定前五个和后五个时,你可以使用你所使用的相同代码,但是错误在最后一行,因为索引从0开始。
我修改为使用ip_address函数: