Networking
3 min lectura

Automatizando diagnósticos de red con Python

Aprende a crear scripts en Python para diagnosticar conectividad, validar latencia y monitorear puertos críticos en infraestructuras de red.

pythonnetworkingautomatizacionsysadmindevops
Automatizando diagnósticos de red con Python

#Introducción

En la ingeniería de redes y administración de infraestructura, el diagnóstico manual mediante herramientas como ping, traceroute o telnet puede resultar lento cuando debemos verificar decenas de switches, routers o servidores.

Python es el lenguaje ideal para automatizar estas tareas repetitivas, permitiendo construir herramientas ligeras de diagnóstico que pueden integrarse en pipelines o ejecutarse periódicamente con cron.


#1. Verificación Rápida de Puertos con Sockets

Una de las comprobaciones más habituales es validar si un servicio específico (como SSH en el puerto 22, HTTP en el 80, o MySQL en el 3306) está aceptando conexiones.

Podemos implementar una prueba rápida sin dependencias externas usando el módulo estándar socket:

PYTHON
import socket

def check_service(host: str, port: int, timeout: float = 2.0) -> bool:
    """Verifica si un puerto TCP específico está abierto y accesible."""
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
        sock.settimeout(timeout)
        result = sock.connect_ex((host, port))
        return result == 0

# Ejemplo de uso
servidores = [
    ("192.168.1.1", 22),   # Router principal
    ("192.168.1.10", 80),  # Servidor web local
    ("8.8.8.8", 53),       # DNS de Google
]

for host, port in servidores:
    estado = "ABIERTO" if check_service(host, port) else "CERRADO/TIMEOUT"
    print(f"Host: {host}:{port} -> Estado: {estado}")

Ventaja del socket connect_ex

El método connect_ex devuelve un código de error de C en lugar de levantar una excepción socket.error, lo que hace que la ejecución sea mucho más rápida y limpia al escanear múltiples endpoints.


#2. Ping Sweep Concurrente en una Subred

Cuando necesitas inventariar qué direcciones IP están activas en un segmento de red local (por ejemplo 192.168.1.0/24), realizar comprobaciones secuenciales tomaría demasiado tiempo. Con concurrent.futures, podemos paralelizar los pings:

PYTHON
import subprocess
import platform
from concurrent.futures import ThreadPoolExecutor

def ping_host(ip: str) -> bool:
    """Envía un paquete ICMP Echo y devuelve True si el host responde."""
    param = "-n" if platform.system().lower() == "windows" else "-c"
    timeout_param = "-w" if platform.system().lower() == "windows" else "-W"
    
    cmd = ["ping", param, "1", timeout_param, "1", ip]
    result = subprocess.run(cmd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
    return result.returncode == 0

def scan_subnet(base_ip: str, start: int = 1, end: int = 30):
    print(f"Escaneando rango {base_ip}.{start} hasta {base_ip}.{end}...")
    ips = [f"{base_ip}.{i}" for i in range(start, end + 1)]
    
    with ThreadPoolExecutor(max_workers=20) as executor:
        results = executor.map(ping_host, ips)
        
    for ip, alive in zip(ips, results):
        if alive:
            print(f" [✓] Dispositivo activo: {ip}")

if __name__ == "__main__":
    scan_subnet("192.168.1", 1, 25)

#3. Buenas Prácticas para Scripts en Producción

  1. Usa timeouts explícitos: Nunca dejes sockets o comandos de red sin timeout; de lo contrario, un host colgado bloqueará tu script.
  2. Estructura la salida: Si planeas alertar a un webhook de Discord, Slack o Telegram, exporta tus diagnósticos en formato JSON o métricas Prometheus.
  3. Manejo de permisos: Recuerda que algunas operaciones de bajo nivel (como captura de paquetes raw o Scapy) requieren privilegios de superusuario (sudo).

#Conclusión

Con menos de 50 líneas de código en Python, puedes crear utilidades de diagnóstico robustas que simplifican el soporte técnico diario y la supervisión de infraestructura.

¿Te resultó útil este artículo?

Compártelo con otros desarrolladores o ingenieros de redes.

Yakin Dario

Ingeniero Telemático

Ver más artículos