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.
Yakin Dario
Ingeniero Telemático
#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:
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:
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
- Usa timeouts explícitos: Nunca dejes sockets o comandos de red sin timeout; de lo contrario, un host colgado bloqueará tu script.
- 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.
- 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