2013-06-20 5 views
7

Учитывая два адреса CIDR: 192.168.2.0/14 и 192.168.2.0/32Проверьте, пересекаются ли два адреса CIDR?

Как проверить, перекрываются ли два 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 адрес ??

Я нашел ссылку :: How can I check if an ip is in a network in python

+0

FYI, 192.168.2.0/32 является единым IP-адрес (192.168.2.0), а не подсети. – slebetman

+0

Вы принимаете ответ, который не является специфичным для python? – slebetman

+0

Thnx для информации. Мне нужно это в python, но ваше объяснение может быть полезным. – AJRedDevil

ответ

8

Использование 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 
+0

Спасибо, что библиотека делает именно то, что я хочу. – AJRedDevil

+0

Работает ли тот же код для IPv6, или он поддерживает только IPv4? – AJRedDevil

+0

Работа для 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 – falsetru

1

Если не netaddr под рукой для тестирования, но я думаю, вы могли бы проверить, если first и last адрес первой сети и содержатся во втором:

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 

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

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 

Или вы могли бы заметить, что для диапазонов перекрываться, младший адрес первого диапазона должен быть меньше или равен адрес второго диапазона, и наоборот. Таким образом:

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 
+0

Спасибо, что работает сравнение диапазона. Еще одна вещь, вы могли бы узнать, какие IP-адреса перекрываются? – AJRedDevil

+2

IP-адреса, которые перекрываются, представляют собой подсеть с меньшим диапазоном: то есть большее число после символа '/'. Следовательно, между 192.168.2.0/23 и 192.168.2.0/24 адреса, которые перекрываются, - 192.168.2.0/24. Помните, что подсеть CIDR не может «перекрываться». Они могут содержать только меньшую подсеть CIDR или нет. – slebetman

+0

@AJRedDevil Поскольку каждый из них всегда является подмножеством другого, перекрытие - это только меньший диапазон. Первый адрес в перекрытии (меньший диапазон) - 'max (cidr0.first, cidr1.first)'. Последний адрес: 'min (cidr0.last, cidr1.last)'. –

Смежные вопросы