【问题标题】:Check if two CIDR addresses intersect?检查两个 CIDR 地址是否相交?
【发布时间】:2013-06-16 21:34:31
【问题描述】:

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

【问题讨论】:

  • 仅供参考,192.168.2.0/32 是单个 IP 地址 (192.168.2.0),而不是子网。
  • 你会接受不是 python 特定的答案吗?
  • 感谢信息。我在 python 中需要它,但你的解释可能有用。
  • 我的解释和罗布的解释是一样的。

标签: python ip-address cidr


【解决方案1】:

使用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

【讨论】:

  • 感谢图书馆完全符合我的要求。
  • 相同的代码是否也适用于 IPv6 还是仅支持 IPv4?
  • 为 IPv6 工作。 ipaddr.IPNetwork('::192.168.0.0/120').overlaps(ipaddr.IPNetwork('::192.168.0.0/121')) 返回 True,ipaddr.IPNetwork('::192.168.4.0/120').overlaps(ipaddr.IPNetwork('::192.168.0.0/121')) 返回 False
  • Powershell有解决办法吗?
【解决方案2】:

我假设您实际上希望两个 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

【讨论】:

  • 感谢范围比较工作。还有一件事,你能找出重叠的ip地址吗??
  • 重叠的ip地址为范围较小的子网:即/后面的数字较大。因此,在 192.168.2.0/23 和 192.168.2.0/24 之间,重叠的地址是 192.168.2.0/24。请记住,CIDR 子网不能“重叠”。它们只能包含或不包含较小的 CIDR 子网。
  • @AJRedDevil 因为一个总是另一个的子集,所以重叠只是较小的范围。重叠(较小范围)中的第一个地址是max(cidr0.first, cidr1.first)。最后一个地址是min(cidr0.last, cidr1.last)
【解决方案3】:

我写了this简单的命令行工具,基于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

【讨论】:

    【解决方案4】:

    如果手头没有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
    

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

    【讨论】:

      猜你喜欢
      • 2018-10-09
      • 1970-01-01
      • 2020-06-15
      • 2019-10-26
      • 2017-12-09
      • 2011-04-19
      • 1970-01-01
      • 2021-12-30
      相关资源
      最近更新 更多