2012-03-15 11 views
7

Duplicar posible:
How can I check if an ip is in a network in pythonPython - ip <-> ¿concordancia de subred?

¿Cuál es el camino más fácil para que coincida con la subred a una dirección IP en Python, por lo que si la dirección IP se encuentra en la subred puedo elegirlo?

Gracias de antemano.

+1

Realmente no está claro lo que estás preguntando. ¿Qué estás eligiendo, el IP o la subred? ¿La pregunta es "cómo puedo saber si una dirección IP está en una subred en particular?" ¿O que? –

Respuesta

16

En Python 3.3+, puede utilizar ipaddress módulo:

>>> import ipaddress 
>>> ipaddress.ip_address('192.0.43.10') in ipaddress.ip_network('192.0.0.0/16') 
True 

Si su instalación de Python es mayor que 3.3, se puede utilizar this backport.


Si desea evaluar una gran cantidad de direcciones IP de esta manera, es probable que desea calcular la máscara de red por adelantado, como

n = ipaddress.ip_network('192.0.0.0/16') 
netw = int(n.network_address) 
mask = int(n.netmask) 

Entonces, para cada dirección, calcular el binario representación con uno de

a = int(ipaddress.ip_address('192.0.43.10')) 
a = struct.unpack('!I', socket.inet_pton(socket.AF_INET, '192.0.43.10'))[0] 
a = struct.unpack('!I', socket.inet_aton('192.0.43.10'))[0] # IPv4 only 

Por último, sólo tiene que comprobar:

in_network = (a & mask) == netw 
+0

de todos modos para hacer esto de manera más eficiente para un conjunto gigante de tablas? ex. Tengo una tabla de aproximadamente 100,000 de ellos :) –

+0

@ EiyrioüvonKauyf También actualicé la respuesta para ese caso. – phihag

+0

muchas gracias :) –

2

Si para un IP determinado desea encontrar un prefijo de una larga lista de prefijos, entonces puede implementar longest prefix match. Primero construye un prefix tree de su lista de prefijos, y luego, recorre el árbol buscando la hoja más alejada que coincida con su prefijo.

Suena aterrador, pero no es tan malo :)