Проверьте, пересекаются ли два адреса CIDR?

Учитывая два адреса CIDR: 192.168.2.0/14 и 192.168.2.0/32

Как проверить, перекрываются ли два IP-адреса в "python2.6"??

Я прошел через 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

Я нашел ссылку:: Как проверить, находится ли ip в сети в python

Ответ 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

Ответ 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

Ответ 3

Если у вас нет 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

BTW, IPNetwork строка 1102 определяет метод __contains__. Но я не уверен, что строка 1127 не нарушена? Вы должны проверить и сообщить об ошибке, если она есть.

Ответ 4

Я написал этот простой инструмент командной строки, основанный на netaddr lib.

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