¿Cómo manipular direcciones IP en Python usando el módulo ipaddress?

Dirección IP significa dirección de protocolo de Internet. Es un número de identificación relacionado con una computadora o red seleccionada. Cuando se conecta a la web, la dirección IP permite que las computadoras envíen y reciban información. Python proporciona el módulo ipaddress que brinda las capacidades para crear, manipular y operar en direcciones y redes IPv4 e IPv6. Este módulo viene integrado con python 3.3+, por lo que no necesita instalarlo si tiene python 3.3+. Aunque puedes instalarlo usando pip.

pip install ipaddress

El módulo tiene la clase IPv4Address y la  clase IPv6Address para manejar formatos IPv4 e IPv6 respectivamente. Dado que los objetos IPv4Address e IPv6Address comparten muchos atributos comunes, veremos solo para el formato IPv4 y podemos hacer lo mismo para el formato IPv6.

Dirección IPv4

Los objetos IPv4Address tienen muchos atributos para la dirección IPv4. ipaddress.IPv4Address(‘dirección’) construye un objeto IPv4Address que representa la dirección IPv4 ‘dirección’. Algunos atributos de la clase son los siguientes:

  • max_prefixlen: Devuelve el número total de bits en la dirección IP representada por el objeto IPv4Address (32 para IPv4 y 128 para IPv6).
  • is_multicast: devuelve True si la dirección está reservada para uso de multidifusión.
  • is_private: Retorna True si la dirección está asignada para redes privadas.
  • is_global: Retorna True si la dirección está asignada para redes públicas.
  • is_unspecified: Devuelve True si la dirección no está especificada.
  • is_reserved: devuelve True si la dirección está reservada por IETF.
  • is_loopback: devuelve True si se trata de una dirección de bucle invertido.
  • is_link_local: Retorna True si la dirección está reservada para uso de enlace local.

También podemos usar operadores de comparación para comparar objetos de dirección. Además, podemos sumar o restar números enteros del objeto de dirección.

Ahora veamos un ejemplo de estos atributos.

Ejemplo:

Python3

import ipaddress
# Creating an object of IPv4Address class and
# initializing it with an IPv4 address.
ip = ipaddress.IPv4Address('112.79.234.30')
 
# Print total number of bits in the ip.
print("Total no of bits in the ip:", ip.max_prefixlen)
 
# Print True if the IP address is reserved for multicast use.
print("Is multicast:", ip.is_multicast)
 
# Print True if the IP address is allocated for private networks.
print("Is private:", ip.is_private)
 
# Print True if the IP address is global.
print("Is global:", ip.is_global)
 
# Print True if the IP address is unspecified.
print("Is unspecified:", ip.is_unspecified)
 
# Print True if the IP address is otherwise IETF reserved.
print("Is reversed:", ip.is_reserved)
 
# Print True if the IP address is a loopback address.
print("Is loopback:", ip.is_loopback)
 
# Print True if the IP address is Link-local
print("Is link-local:", ip.is_link_local)
 
# next ip address
ip1 = ip + 1
print("Next ip:", ip1)
 
# previous ip address
ip2 = ip - 1
print("Previous ip:", ip2)
 
# Print True if ip1 is greater than ip2
print("Is ip1 is greater than ip2:", ip1 > ip2)

Producción:

Total no of bits in the ip: 32
Is multicast: False
Is private: False
Is global: True
Is unspecified: False
Is reversed: False
Is loopback: False
Is link-local: False
Next ip: 112.79.234.31
Previous ip: 112.79.234.29
Is ip1 is greater than ip2: True

Red IPv4

Los objetos IPv4Network se utilizan para inspeccionar y definir redes IP. Todos los atributos para el objeto de dirección también son válidos para el objeto de red; además, el objeto de red proporciona atributos adicionales. Algunos de ellos se enumeran a continuación.

  • network_address: Devuelve la dirección de red para la red.
  • broadcast_address: Devuelve la dirección de transmisión de la red. Todos los hosts de la red deben recibir los paquetes enviados a la dirección de transmisión.
  • netmask: máscara de red de retorno de la red.
  • with_netmask: devuelve una representación de string de la red, con la máscara en notación de máscara de red.
  • with_hostmask: devuelve una representación de string de la red, con la máscara en notación de máscara de host.
  • prefixlen: Devuelve la longitud del prefijo de red en bits.
  • num_addresses: Devuelve el número total de la dirección de esta red.
  • hosts(): Devuelve un iterador sobre los hosts utilizables en la red. Los hosts utilizables son todas las direcciones IP que pertenecen a la red, excepto la propia dirección de red y la dirección de difusión de la red.
  • se superpone ( otro ): devuelve verdadero si esta red está parcial o totalmente contenida en otra u otra está totalmente contenida en esta red.
  • subnets ( prefixlen_diff ): devuelve las subredes que se unen para crear la definición de red actual, según los valores del argumento. El parámetro prefixlen_diff es el número entero que indica la cantidad en la que se debe aumentar la longitud de nuestro prefijo.
  • supernet ( prefixlen_diff ): devuelve la superred que contiene esta definición de red, prefixlen_diff es la cantidad en la que se debe reducir la longitud de nuestro prefijo.
  • subnet_of ( otro ): devuelve verdadero si esta red es una subred de otra ( nuevo en python 3.7 ).
  • supernet_of ( otro ): devuelve verdadero si esta red es una superred de otra ( nuevo en python 3.7 ).
  • compare_networks ( otro ): Compara la red IP con la otra red IP. En esta comparación solo se consideran las direcciones de red, no los bits de host. Devuelve -1, 0 o 1.

Ahora veamos un ejemplo de los métodos anteriores.

Ejemplo: 

Python3

import ipaddress
 
# Initializing an IPv4 Network.
network = ipaddress.IPv4Network("192.168.1.0/24")
 
# Print the network address of the network.
print("Network address of the network:", network.network_address)
 
# Print the broadcast address
print("Broadcast address:", network.broadcast_address)
 
# Print the network mask.
print("Network mask:", network.netmask)
 
# Print with_netmask.
print("with netmask:", network.with_netmask)
 
# Print with_hostmask.
print("with_hostmask:", network.with_hostmask)
 
# Print Length of network prefix in bits.
print("Length of network prefix in bits:", network.prefixlen)
 
# Print the number of hosts under the network.
print("Total number of hosts under the network:", network.num_addresses)
 
# Print if this network is under (or overlaps) 192.168.0.0/16
print("Overlaps 192.168.0.0/16:", network.overlaps(ipaddress.IPv4Network("192.168.0.0/16")))
 
# Print the supernet of this network
print("Supernet:", network.supernet(prefixlen_diff=1))
 
# Print if the network is subnet of 192.168.0.0/16.
print("The network is subnet of 192.168.0.0/16:",
      network.subnet_of(ipaddress.IPv4Network("192.168.0.0/16")))
 
# Print if the network is supernet of 192.168.0.0/16.
print("The network is supernet of 192.168.0.0/16:",
      network.supernet_of(ipaddress.IPv4Network("192.168.0.0/16")))
 
# Compare the ip network with 192.168.0.0/16.
print("Compare the network with 192.168.0.0/16:",
      network.compare_networks(ipaddress.IPv4Network("192.168.0.0/16")))

Producción:

Network address of the network: 192.168.1.0
Broadcast address: 192.168.1.255
Network mask: 255.255.255.0
with netmask: 192.168.1.0/255.255.255.0
with_hostmask: 192.168.1.0/0.0.0.255
Length of network prefix in bits: 24
Total number of hosts under the network: 256
Overlaps 192.168.0.0/16: True
Supernet: 192.168.0.0/23
The network is subnet of 192.168.0.0/16: True
The network is supernet of 192.168.0.0/16: False
Compare the network with 192.168.0.0/16: 1

Publicación traducida automáticamente

Artículo escrito por piyushtiwari515 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *