检查两个CIDR地址是否相交?

2024-04-19 15:03:15 发布

您现在位置:Python中文网/ 问答频道 /正文

给定两个CIDR地址,比如192.168.2.0/14和192.168.2.0/32

如何检查“python2.6”中的两个ip地址是否重叠??

我已经检查过netaddr,它允许检查 192.168.2.0位于CIDR地址192.168.2.0/14 by

from netaddr import IPNetwork, IPAddress
bool = IPAddress("192.168.2.0") in IPNetwork("192.168.2.0/14"):

但如何检查两个CIDR地址??

我找到了一个引用:How can I check if an ip is in a network in python


Tags: infromimportipbyif地址check
3条回答

如果手头没有用于测试的netaddr,但我想您可以检查第一个网络的firstlast地址是否都包含在第二个网络中:

net_1 = IPNetwork("192.168.2.0/14")
net_2 = IPNetwork("192.168.2.0/32")
if net_1.first in net_2 and net_1.last in net_2:
    # do something

顺便说一下,IPNetworkline 1102定义了一个__contains__方法。但我不确定line 1127是不是坏了?如果是的话,你应该测试并报告一个bug。

我假设您实际上希望两个cidr都表示范围,即使在您的示例中,192.168.2.0/32只表示一个地址。还要注意,在192.168.2.0/14中,是.2。没有意义,因为14位前缀没有到达第三个八位字节。

无论如何,有几种方法可以做到这一点。您可以注意到,要使它们重叠,其中一个必须始终是另一个的子集:

def cidrsOverlap(cidr0, cidr1):
    return cidr0 in cidr1 or cidr1 in cidr0

或者您可以注意到,要使范围重叠,第一个范围的最低地址必须小于或等于第二个范围的最高地址,反之亦然。因此:

def cidrsOverlap(cidr0, cidr1):
    return cidr0.first <= cidr1.last and cidr1.first <= cidr0.last

print cidrsOverlap(IPNetwork('192.168.2.0/24'), IPNetwork('192.168.3.0/24'))
# prints False

print cidrsOverlap(IPNetwork('192.168.2.0/23'), IPNetwork('192.168.3.0/24'))
# prints True

使用ipaddr

>>> import ipaddr
>>> n1 = ipaddr.IPNetwork('192.168.1.0/24')
>>> n2 = ipaddr.IPNetwork('192.168.2.0/24')
>>> n3 = ipaddr.IPNetwork('192.168.2.0/25')
>>> n1.overlaps(n2)
False
>>> n1.overlaps(n3)
False
>>> n2.overlaps(n3)
True
>>> n2.overlaps(n1)
False

相关问题 更多 >