IPWhois en Python3 venv y comando personalizado de sistema

En el día a día de un informático es habitual tener que consultar los datos de registro relacionados a una IP, como el propietario, contacto, organización, AS,… Para ello podemos consultar la web del Registro Regional de Internet o RIR que gestiona el direccionamiento al que pertenece la IP (ver listado completo pinchando aquí), o instalar y hacer uso del paquete Whois en la distribución que estemos utilizando.

Otra opción es desarrollar nuestra propia herramienta que se ajuste a lo que queremos obtener, sin necesidad de revisar las páginas web de todos los RIR ni instalar un paquete adicional en nuestro servidor. Si además creamos un comando de sistema para ejecutar este comando ajustaremos más aún esta herramienta a nuestras necesidades.

El objetivo de esta entrada es compartir una sencilla herramienta desarrollada dentro de un entorno virtual en Python 3, junto a la creación de un comando de sistema personalizado para automatizar su ejecución.

Instalación Python pip y vitualenv

Lo primero que haremos es instalar pip y a continuación el módulo de entornos virtuales para Python 3.

Centos 7

# Instalamos el repositorio EPEL
sudo yum install epel-release
# Instalamos Python 34 y el gestor de paquetes python-pip
sudo yum install python34 python-pip
# Actualizamos pip e instalamos los entornos virtuales
pip install -U pip
pip install -U virtualenv

Debian

# Actualizamos los repositorios
sudo apt-get update
# Instalamos pip para Python 3
sudo apt-get install build-essential libssl-dev libffi-dev python-dev
sudo apt-get install python3-pip
# Ahora los entornos virtuales
sudo pip3 install virtualenv

 

Crear y activar entorno virtual

Nos ubicamos en el directorio en donde se ejecutará nuestra herramienta. Yo suelo trabajar en el directorio /usr/local/scripts, pero la decisión final la dejo a tu gusto teniendo en cuenta que hay que indicar este en el comando de sistema que crearemos más adelante.

mkdir -p /usr/local/scripts/ipwhois && cd /usr/local/scripts/ipwhois

Creamos el entorno virtual sobre el que se ejecutará nuestra herramienta, el cual lamaremos ipwhois_project.

python3 -m virtualenv ipwhois_project

Activamos el entorno virtual.

source ipwhois_project/bin/activate

El prompt cambia indicando que nos encontramos en el entorno virtual, y por tanto todo módulo de Python que instalemos solo se aplicará a este entorno creado.

(ipwhois_project) sergio@sergio-VirtualBox:/usr/local/scripts/ipwhois$

 

Librerías necesarias

Ahora instalamos las librerías necesarias para ejecutar nuestra herramienta.

sudo pip install IPy ipwhois pprint

Recuerda que estos módulos solo aplicarán en el entorno virtual que nos encontramos, nunca a la instalación global de Python. Esto quiere decir que una vez desactivemos el entorno virtual no podrán ser utilizados.

Código de la herramienta

A continuación os muestro el código de la herramienta, sin entrar en muchos detalles más que los comentarios que hay entre líneas.

Creamos el archivo que contrendá el código.

# Creamos el archivo para la herramienta
touch ipWhois.py
# Cambiamos los permisos para el archivo
chmod 775 ipWhois.py
# Editamos el archivo
nano ipWhois.py

 

Y agregamos el código.

# WHOIS sobre IP
# 5-11-19
# Sergio Bastian Rodriguez
# https://blog.tiraquelibras.com/?p=714

# Importamos las librerias necesarias
import sys, pprint
from ipwhois import IPWhois
from IPy import IP

# Obtenemos el argumento indicado al ejecutar la herramienta
ip = sys.argv[1]

# Logica de la heramienta
try:
        # Confirmamos si el argumento es una direccion IP
        ipType = IP(ip)
        
        # Confirmamos si la direccion IP es publica o no
        if ipType.iptype() == 'PUBLIC':
                
                # De ser publica obtenemos los datos del whois y los mostramos
                obj = IPWhois(ip)
                results = obj.lookup_whois()
                pprint.pprint(results)
        else:
                # De no ser publica lo indicamos en un mensaje de error
                raise Exception('The IP ' + ip + ' is not public.')

except Exception as e:
        # Si el argumento no es una dirección IP valida, o no es publica, mostramos el mensaje con el error
        print('ERROR - The argument added is not correct.\n%s' % (str(e)))

finally:
        # Para finalizar mostramos la información del creador de la herramienta
        print('\n***Herramienta desarrollada por:\n Tiraquelibras.com (https://blog.tiraquelibras.com/?p=714)***')

Si ejecutamos el comando consultando una IP u otra cosa, como por ejemplo un dominio, nos mostrará la información de la IP consultada o nos mostrará un error. Te invito a que lo pruebes para ver el resultado.

python ipWhois.py 85.152.18.44
python ipwhois.py tiraqueliras.com

Un ejemplo del resultado si consultamos la información referente a la IP de los DNS de Google:

# ipwhois 8.8.8.8
{'asn': '15169',
 'asn_cidr': '8.8.8.0/24',
 'asn_country_code': 'US',
 'asn_date': '1992-12-01',
 'asn_description': 'GOOGLE - Google LLC, US',
 'asn_registry': 'arin',
 'nets': [{'address': '100 CenturyLink Drive',
           'cidr': '8.0.0.0/9',
           'city': 'Monroe',
           'country': 'US',
           'created': '1992-12-01',
           'description': 'Level 3 Parent, LLC',
           'emails': ['ipaddressing@level3.com'],
           'handle': 'NET-8-0-0-0-1',
           'name': 'LVLT-ORG-8-8',
           'postal_code': '71203',
           'range': '8.0.0.0 - 8.127.255.255',
           'state': 'LA',
           'updated': '2018-04-23'},
          {'address': '1600 Amphitheatre Parkway',
           'cidr': '8.8.8.0/24',
           'city': 'Mountain View',
           'country': 'US',
           'created': '2014-03-14',
           'description': 'Google LLC',
           'emails': ['network-abuse@google.com', 'arin-contact@google.com'],
           'handle': 'NET-8-8-8-0-1',
           'name': 'LVLT-GOGL-8-8-8',
           'postal_code': '94043',
           'range': None,
           'state': 'CA',
           'updated': '2014-03-14'}],
 'nir': None,
 'query': '8.8.8.8',
 'raw': None,
 'raw_referral': None,
 'referral': None}

***Herramienta desarrollada por:
 Tiraquelibras.com (https://blog.tiraquelibras.com/?p=714)***

 

Comando de sistema personalizado

Creamos el archivo en donde agregaremos el código que ejecutará nuestra herramienta, activando y desactivando el entorno virtual automáticamente.

Primero creamos el archivo que ejecutará el programa.

# Creamos el archivo
sudo touch /usr/bin/ipwhois
# Cambiamos los permisos para que lo pueda ejecutar cualquier usuario
sudo chmod 777 /usr/bin/ipwhois

Agregamos el código Bash al comando creado.

sudo nano /usr/bin/ipwhois
case $1 in

        -h | --help)
                echo -e "Whois of IP address.\nOnly one IP by command.\nipwhois [-h|--help]"
                ;;
        *)
                # Confirmamos si se indica un unico argumento.
                # De lo contrario se mostrara un error.
                if [ $# -ne 1 ]; then
                
                        # De no cumplirse mostramos un error
                        echo -e "More than one argument or none has been indicated. Please, add only one argument.\n"
                else
                        # Si se cumple activamos el entorno virtual
                        source /usr/local/scripts/ipwhois/ipwhois_project/bin/activate
                        
                        # Ejecutamos la herramienta con el argumento indicado
                        python /usr/local/scripts/ipwhois/ipWhois.py $1
                        
                        # Desactivamos el entorno virtual
                        deactivate
                fi
                ;;
esac

Para finalizar podemos ejecutar el nuevo comando para ver la ayuda de la siguiente forma.

# ipwhois --help

Whois of IP address.
Only one IP by command.
ipwhois [-h|--help]

Ahora si consultamos una dirección IP se mostrará la información de su registro desde la propia línea de comandos CLI.

ipwhois 85.152.18.44
ipwhois tiraquelibras.com

 

Conclusión

Con unas pocas líneas de código podemos crear nuestras propias herramientas que se adapten mejor a las necesidades que buscamos.

 

Enlaces relacionados

Instalación virtualenv para Python3 en Debian aquí

Instalación virtualenv para Python3 en Centos 7 aquí

Módulo ipwhois para Python3 aquí

Módulo IPy para Python3 aquí