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

AJR*_*vil 13 python ip-address cidr

给定两个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中

from netaddr import IPNetwork, IPAddress
bool = IPAddress("192.168.2.0") in IPNetwork("192.168.2.0/14"):
Run Code Online (Sandbox Code Playgroud)

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

我找到了一个引用:: 如何在python中检查ip是否在网络中

fal*_*tru 19

使用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
Run Code Online (Sandbox Code Playgroud)


rob*_*off 5

我假设您实际上希望两个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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

  • 重叠的ip地址是范围较小的子网:即`/`后面的数字越大.因此,在192.168.2.0/23和192.168.2.0/24之间,重叠的地址是192.168.2.0/24.请记住,CIDR子网不能"重叠".它们只能包含较小的CIDR子网. (2认同)

小智 5

我基于lib 编写了这个netaddr简单的命令行工具。

pip install ipconflict
Run Code Online (Sandbox Code Playgroud)

例子:

ipconflict 10.0.0.0/22 10.0.1.0/24
Run Code Online (Sandbox Code Playgroud)

输出:

conflict found: 10.0.1.0/24 <-> 10.0.1.0/22
Run Code Online (Sandbox Code Playgroud)