Check if two CIDR addresses intersect?

被刻印的时光 ゝ 提交于 2019-12-04 00:02:18

问题


Given two CIDR addresses say 192.168.2.0/14 and 192.168.2.0/32

How do I check if two ip addresses overlap in "python2.6"??

I have gone through netaddr and it allows to check if 192.168.2.0 is in CIDR address 192.168.2.0/14 by

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

But how to check for two CIDR address??

I found a reference :: How can I check if an ip is in a network in python


回答1:


Using 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



回答2:


I'll assume you actually want both CIDRs to represent ranges, even though in your example, 192.168.2.0/32 represents only one address. Also note that in 192.168.2.0/14, the .2. is meaningless, because the 14-bit prefix doesn't reach the third octet.

Anyway, there are a several ways to do this. You could notice that for them to overlap, one must always be a subset of the other:

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

Or you could notice that for the ranges to overlap, the first range's lowest address must be less than or equal to the second range's highest address, and vice versa. Thus:

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



回答3:


If don't have netaddr at hand for testing, but I think you could check if the first and last address of the first network are both contained in the second:

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

BTW, IPNetwork line 1102 defines a __contains__ method. But I'm not certain the line 1127 isn't broken ? You should test and report a bug if it is.




回答4:


I wrote this simple command line tool, based on the netaddr lib.

pip install ipconflict

Example:

ipconflict 10.0.0.0/22 10.0.1.0/24

Output:

conflict found: 10.0.1.0/24 <-> 10.0.1.0/22


来源:https://stackoverflow.com/questions/17206679/check-if-two-cidr-addresses-intersect

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!