19. Comando Traceroute

El comando traceroute en Linux imprime la ruta que tarda un paquete en llegar al host. Este comando es útil cuando desea conocer la ruta y todos los saltos que toma un paquete.

La imagen de abajo muestra cómo se usa el comando traceroute para llegar al host de Google (142.251.133.4 esta IP no es la única de Google !) desde la máquina local y también imprime detalles sobre todos los saltos que visita en el medio.

La primera columna corresponde al recuento de saltos.
La segunda columna representa la dirección de ese salto y después de eso, verá tres tiempos separados por espacio en milisegundos.
El comando traceroute envía tres paquetes al salto, es el valor por defecto  y cada uno de los tiempos se refiere al tiempo que tarda el paquete en llegar al salto.

NetCheck
Este script de Python corre el ping, traceroute y dig contra un dominio.


Luego de unos segundos aparece una ventana:



Código con Python para Netchek.py

#!/usr/bin/env python3
import subprocess, datetime, tkinter as tk
from tkinter import messagebox, filedialog
def run_checks():
    destino = entry.get().strip()
    if not destino:
        messagebox.showerror("Error", "Ingresá un dominio o IP.")
        return
    # verificar comandos
    for cmd in ["ping", "traceroute", "dig"]:
        if subprocess.call(["bash","-lc", f"command -v {cmd} >/dev/null 2>&1"]) != 0:
            messagebox.showerror("Falta comando",
                                 f"No se encontró '{cmd}'.\nInstalalo (Ubuntu): sudo apt install inetutils-ping traceroute dnsutils")
            return
    ahora = datetime.datetime.now()
    encabezado = [
        "==== Reporte de conectividad ====",
        f"Fecha y hora: {ahora.strftime('%Y-%m-%d %H:%M:%S')}",
        f"Destino: {destino}",
        "=================================",
        ""
    ]
    salida = "\n".join(encabezado)
    # ejecutar comandos
    def run_cmd(title, cmd):
        nonlocal salida
        salida += f">>> {title} ({destino})\n"
        try:
            res = subprocess.run(cmd, text=True, capture_output=True, timeout=120)
            salida += (res.stdout or "") + (("\nSTDERR:\n"+res.stderr) if res.stderr else "")
        except subprocess.TimeoutExpired:
            salida += "ERROR: comando excedió el tiempo de espera\n"
        salida += "\n"
    run_cmd("PING", ["ping","-c","4", destino])
    run_cmd("TRACEROUTE", ["traceroute", destino])
    run_cmd("DIG", ["dig", destino])
    # elegir dónde guardar
    sugerido = f"netcheck_{ahora.strftime('%Y%m%d_%H%M%S')}.txt"
    path = filedialog.asksaveasfilename(
        defaultextension=".txt",
        initialfile=sugerido,
        filetypes=[("Texto","*.txt"),("Todos","*.*")]
    )
    if not path:
        return
    with open(path, "w", encoding="utf-8") as f:
        f.write(salida)
    messagebox.showinfo("Listo", f"Reporte guardado en:\n{path}")
# UI
root = tk.Tk()
root.title("NetCheck - Ping/Traceroute/Dig")
frm = tk.Frame(root, padx=12, pady=12)
frm.pack()
tk.Label(frm, text="Dominio o IP:").grid(row=0, column=0, sticky="w")
entry = tk.Entry(frm, width=40)
entry.grid(row=0, column=1, padx=8)
entry.focus()
btn = tk.Button(frm, text="Ejecutar pruebas", command=run_checks)
btn.grid(row=1, column=0, columnspan=2, pady=10)
root.mainloop()