22

给定两个 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"):

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

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

4

4 回答 4

37

使用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
于 2013-06-20T06:46:07.113 回答
6

我假设您实际上希望两个 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
于 2013-06-20T06:42:32.453 回答
4

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

pip install ipconflict

例子:

ipconflict 10.0.0.0/22 10.0.1.0/24

输出:

conflict found: 10.0.1.0/24 <-> 10.0.1.0/22
于 2019-06-04T13:33:44.173 回答
1

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

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

顺便说一句,IPNetwork 第 1102 行定义了一个__contains__方法。但我不确定1127 线没有坏吗?如果是,您应该测试并报告错误。

于 2013-06-20T06:41:49.183 回答