GoRiX blog

A blog about things

NetWhisper: monitoreá conexiones salientes

May 02, 2025 — n4ch0m4n

A veces querés saber qué procesos están haciendo conexiones salientes desde tu máquina, pero no querés levantar un Wireshark ni instalar nada pesado.
Acá entra en juego NetWhisper, un script que usa herramientas estándar (ss, awk, sed) para darte una vista clara y en tiempo real de qué está saliendo de tu sistema.

Ideal para personas que valoran la simplicidad, el control y el minimalismo.

¿Qué hace?


  • Muestra las conexiones activas en estado ESTABLISHED.
  • Indica
    • Protocolo (tcp o udp)
    • IP local y remota
    • Proceso que originó la conexión (nombre y PID)
    • Dominio del host remoto (si se puede resolver)
    • Refresca automáticamente cada 2 segundos

El script

#!/bin/sh
# Verifica si ss está disponible
command -v ss >/dev/null 2>&1 || {
    echo "Falta 'ss'. Abortando." >&2
    exit 1
}
# Resolver IP a hostname
if command -v getent >/dev/null 2>&1; then
    RESOLVER="getent"
elif command -v dig >/dev/null 2>&1; then
    RESOLVER="dig"
else
    echo "Falta 'getent' o 'dig' para resolver IPs. Abortando." >&2
    exit 1
fi
resolve_ip() {
    ip="$1"
    case "$RESOLVER" in
        getent)
            host=$(getent hosts "$ip" | awk '{print $2}')
            ;;
        dig)
            host=$(dig +short -x "$ip" | sed 's/\.$//' | head -n 1)
            ;;
        *)
            host="$ip"
            ;;
    esac
    [ -n "$host" ] && echo "$host" || echo "$ip"
}
while true; do
    clear
    echo "NetWhisper - Conexiones salientes activas con resolución DNS"
    echo "Hora: $(date '+%Y-%m-%d %H:%M:%S')"
    echo
    printf "%-6s %-22s %-22s %-30s\n" "PROTO" "LOCAL" "REMOTO" "PROCESO [HOST]"
    ss -tunp 2>/dev/null | grep ESTAB | while IFS= read -r line; do
        proto=$(echo "$line" | awk '{print $1}')
        local=$(echo "$line" | awk '{print $5}')
        remote=$(echo "$line" | awk '{print $6}')
        proc=$(echo "$line" | awk '{print $NF}')
        ip=$(printf "%s\n" "$remote" | cut -d: -f1)
        host=$(resolve_ip "$ip")
        # Formatea proceso: extrae nombre y PID si se puede
        case "$proc" in
            *pid=*name=*)
                pid=$(echo "$proc" | sed -n 's/.*pid=\([0-9]*\),.*/\1/p')
                name=$(echo "$proc" | sed -n 's/.*name="\([^"]*\)".*/\1/p')
                proc_fmt="${name} (${pid})"
                ;;
            *)
                proc_fmt="$proc"
                ;;
        esac
        printf "%-6s %-22s %-22s %-30s\n" "$proto" "$local" "$remote" "$proc_fmt [$host]"
    done
    sleep 2
done

Ejemplo de salida

NetWhisper - Conexiones salientes activas con resolución DNS
Hora: 2025-05-02 20:04:05

PROTO  LOCAL                  REMOTO                 PROCESO [HOST]
udp    192.168.1.30%wlp3s0:68 192.168.1.1:67         192.168.1.1:67 [home]
tcp    192.168.1.30:55014     200.17.202.197:80      users:(("newsboat",pid=68381,fd=11)) [debiansec.c3sl.ufpr.br]
tcp    192.168.1.30:34080     149.154.175.55:443     users:(("Telegram",pid=61599,fd=46)) [149.154.175.55]
tcp    192.168.1.30:53934     181.46.193.237:5222    users:(("profanity",pid=2560,fd=13)) [cpe-181-46-193.com.ar]
tcp    192.168.1.30:44626     172.67.188.132:80      users:(("newsboat",pid=68381,fd=7)) [172.67.188.132]
tcp    192.168.1.30:56384     37.120.193.124:993     users:(("aerc",pid=68382,fd=21)) [mail.cock.li]
tcp    192.168.1.30:38682     104.21.6.250:80        users:(("newsboat",pid=68381,fd=6)) [104.21.6.250]
tcp    192.168.1.30:44842     207.241.237.3:80       users:(("newsboat",pid=68381,fd=13)) [207.241.237.3]
tcp    192.168.1.30:47010     149.154.175.53:443     users:(("Telegram",pid=61599,fd=53)) [149.154.175.53]
tcp    192.168.1.30:36508     64.233.186.108:993     users:(("aerc",pid=68382,fd=7)) [cb-in-f108.1e100.net]
tcp    192.168.1.30:33074     104.21.33.16:443       users:(("newsboat",pid=68381,fd=8)) [104.21.33.16]
tcp    192.168.1.30:53564     200.17.202.197:443     users:(("newsboat",pid=68381,fd=12)) [debiansec.c3sl.ufpr.br]
tcp    192.168.1.30:34214     178.21.23.139:993      users:(("aerc",pid=68382,fd=19)) [layka.disroot.org]

Consideraciones

  • Requiere ejecutar como root o usuario con permisos para ver procesos de otros usuarios.
  • Funciona en cualquier sistema donde estén disponibles ss, awk, sed, getent o dig.
  • No escribe nada, solo muestra en pantalla…si querés haga log hacelo, no tengo ganas.

Por qué escribir este script?

Porque a veces querés saber que mierda está haciendo el browser o algún proceso en tu equipo o servidor, sin instalar cosas gigantes. Porque shell. Porque es simple papu…

Le puse NetWhisper por estas razones:

  • "Net": porque monitorea la red.

  • "Whisper": evoca algo que susurra, que te cuenta en silencio lo que pasa por debajo, sin hacer ruido ni usar herramientas pesadas.

En otras palabras: no es un script que grita (como Wireshark con 800 filtros abiertos), sino que te dice discretamente qué procesos están saliendo a Internet desde tu máquina.

Tags: Seguridad, Scripts

Comments: