A éste lo he llamado el truco del año: la posibilidad de utilizar la herramienta de análisis de protocolos de red Wireshark, en tiempo real, para examinar el tráfico sobre una placa de red de un servidor remoto.

En el artículo anterior expliqué cómo monitorear el tráfico de red en un servidor remoto, a través de una sesión SSH, utilizando la herramienta de línea de comandos tcpdump. Al estar accediendo mediante SSH, era imperiosamente necesario filtrar todo el tráfico desde y hacia mi dirección IP, para no inundar la captura con los paquetes originados por la propia sesión SSH.

La herramienta tcpdump cumple con el objetivo de capturar el tráfico de red a la perfección, pero si necesitamos hacer un análisis de tráfico mas exhaustivo, obtener estadísticas, gráficas de ancho de banda, y demás, será necesario utilizar una herramienta más avanzada, como Wireshark.

Lo que se suele hacer en estos casos, es guardar la captura de tcpdump en un archivo de formato pcap, para ser analizado luego con otra herramienta, por ejemplo Wireshark. Esto es posible porque además de capturar tráfico en vivo, Wireshark permite guardar y abrir capturas en formato pcap.

Pero, además de la posibilidad de abrir una captura guardada con anterioridad en un archivo pcap, Wireshark permite especificar un archivo o entrada estándar como interfaz de captura. Y he aquí la belleza de este truco: unir con un pipe la salida de tcpdump corriendo en un servidor (el cual lógicamente no posee entorno gráfico ni sistema de ventanas), a través de un túnel SSH, con la entrada estándar de Wireshark especificada como interfaz de captura:

user@freebsd:~ % set SRCIP="192.168.156.242"; ssh -p 22 sysadmin@www.linuxito.com "tcpdump -U -i eth0 -w - host ! $SRCIP" | wireshark -k -i - > & /dev/null

La variable SRCIP especifica la dirección IP desde donde se está estableciendo la conexión SSH con el servidor, para filtrar en la captura de tcpdump.

En el servidor remoto se ejecuta tcpdump con los siguientes parámetros y opciones: tcpdump -U -s0 -i eth0 -w - host ! $SRCIP. La opción -U se utiliza para que cada paquete sea impreso (por salida estándar o archivo, como en este caso) inmediatamente, evitando el uso de buffers de escritura. Mediante -i se especifica la interfaz de red desde donde capturar tráfico. Luego se indica con -w - que la salida sea guardada a un archivo con formato pcap, pero en lugar de archivo se especifica la salida estándar. Si no se usa esta opción (-w), la salida por defecto de tcpdump es un resumen de cada paquete. Esta salida no puede ser interpretada por Wireshark, por ende con -w se fuerza el uso del formato pcap. Finalmente, se filtra la IP de origen de la sesión SSH (host ! $SRCIP), para no inundar la captura con paquetes originados por la misma.

Mediante un pipe (|) se envía la salida estándar generada por tcpdump en el servidor hacia la entrada estándar de Wireshark en la workstation, indicando que tome inmediatamente (-k) dicha entrada estándar como interfaz de captura de tráfico (-i -).

user@freebsd:~ % set SRCIP="192.168.156.242"; ssh -p 22 sysadmin@www.linuxito.com "tcpdump -U -i eth0 -w - host ! $SRCIP" | wireshark -k -i - > & /dev/null
sysadmin@www.linuxito.com's password: 
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes

Luego de ingresar el password correspondiente al usuario "sysadmin" en el servidor, se establece el túnel SSH y comienza a visualizarse el tráfico de red en el mismo:

(Notar que en la barra de título de Wireshark se lee el mensaje "*Standard input", el cual indica que está capturando tráfico desde entrada estándar.)

Esto permite analizar en tiempo real el tráfico en una interfaz de red de un servidor, desde una estación de trabajo con GNU/Linux o FreeBSD (que posea Wireshark instalado).

Si se ejecuta desde una estación de trabajo con GNU/Linux con el intérprete de comandos Bash, sólo se debe modificar la declaración de la variable SRCIP, tal como se observa a continuación (evitar el uso de set):

[user@slackware:~]$ SRCIP="192.168.156.242"; ssh -p 22 sysadmin@www.linuxito.com "tcpdump -U -i eth0 -w - host ! $SRCIP" | wireshark -k -i - > & /dev/null

Espero que les resulte de gran utilidad.

Para más información:

Wireshark User’s Guide

Manpage of TCPDUMP


Tal vez pueda interesarte


Compartí este artículo