TCPflow: analizar y depurar el tráfico de red en Linux


TCPflow es una potente herramienta gratuita, de código abierto y basada en la línea de comandos para analizar el tráfico de red en sistemas similares a Unix como Linux. Captura los datos recibidos o transferidos a través de conexiones TCP y los almacena en un archivo para su posterior análisis, en un formato útil que permite el análisis y la depuración de protocolos.

En realidad, es una herramienta similar a tcpdump ya que procesa paquetes desde el cable o desde un archivo almacenado. Es compatible con las mismas expresiones de filtrado de gran alcance que admite su contraparte. La única diferencia es que tcpflow ordena todos los paquetes TCP y ensambla cada flujo en un archivo separado (un archivo para cada dirección de flujo) para su posterior análisis.

Su conjunto de características incluye un sistema de complementos avanzado para descomprimir conexiones HTTP comprimidas, deshacer la codificación MIME o invocar programas de terceros para el posprocesamiento y mucho más.

Hay muchos casos de uso para tcpflow que incluyen comprender los flujos de paquetes de red y también soporte para realizar análisis forenses de red y divulgar el contenido de las sesiones HTTP.

Cómo instalar TCPflow en sistemas Linux

TCPflow está disponible en los repositorios oficiales de las distribuciones principales de GNU/Linux, puede instalarlo usando su administrador de paquetes como se muestra.

$ sudo apt install tcpflow	#Debian/Ubuntu
$ sudo yum install tcpflow	#CentOS/RHEL
$ sudo dnf install tcpflow	#Fedora 22+

Después de instalar tcpflow, puede ejecutarlo con privilegios de superusuario; de lo contrario, use el comando sudo. Tenga en cuenta que escucha en la interfaz de red activa (por ejemplo, enp0s3).

$ sudo tcpflow

tcpflow: listening on enp0s3

De forma predeterminada, tcpflow almacena todos los datos capturados en archivos que tienen nombres en el formulario (esto puede ser diferente si usa ciertas opciones como la marca de tiempo).

sourceip.sourceport-destip.destport
192.168.043.031.52920-216.058.210.034.00443

Ahora hagamos una lista de directorios para ver si el flujo de tcp se ha capturado en algún archivo.

$ ls -1

total 20
-rw-r--r--. 1 root    root     808 Sep 19 12:49 192.168.043.031.52920-216.058.210.034.00443
-rw-r--r--. 1 root    root      59 Sep 19 12:49 216.058.210.034.00443-192.168.043.031.52920

Como mencionamos anteriormente, cada flujo de TCP se almacena en su propio archivo. En la salida anterior, puede ver que hay tres archivos de transcripción, que indican tcpflow en dos direcciones opuestas, donde la IP de origen en el primer archivo y la IP de destino en el segundo archivo y viceversa.

El primer archivo 192.168.043.031.52920-216.058.210.034.00443 contiene datos transferidos desde el host 192.168.043.031 (el host local en el que se ejecutó tcpflow) a través del puerto 52920, al host 216.058.210.034 (el host remoto) a través del puerto 443.

Y el segundo archivo 216.058.210.034.00443-192.168.043.031.52920 contiene datos enviados desde el host 216.058.210.034 (el host remoto) a través del puerto 443 al host 192.168.043.031 (el host local en el que se ejecutó tcpflow) a través del puerto 52920.

También se genera un informe XML, que contiene información sobre el programa, como cómo se compiló, la computadora en la que se ejecutó y un registro de cada conexión tcp.

Como habrás notado, tcpflow almacena los archivos de transcripción en el directorio actual de forma predeterminada. La opción -o puede ayudarlo a especificar el directorio de salida donde se escribirán los archivos de transcripción.

$ sudo tcpflow -o tcpflow_files
$ sudo ls -l tcpflow_files

total 32
-rw-r--r--. 1 root root 1665 Sep 19 12:56 157.240.016.035.00443-192.168.000.103.45986
-rw-r--r--. 1 root root   45 Sep 19 12:56 169.044.082.101.00443-192.168.000.103.55496
-rw-r--r--. 1 root root 2738 Sep 19 12:56 172.217.166.046.00443-192.168.000.103.39954
-rw-r--r--. 1 root root   68 Sep 19 12:56 192.168.000.102.00022-192.168.000.103.42436
-rw-r--r--. 1 root root  573 Sep 19 12:56 192.168.000.103.39954-172.217.166.046.00443
-rw-r--r--. 1 root root 4067 Sep 19 12:56 192.168.000.103.45986-157.240.016.035.00443
-rw-r--r--. 1 root root   38 Sep 19 12:56 192.168.000.103.55496-169.044.082.101.00443
-rw-r--r--. 1 root root 3159 Sep 19 12:56 report.xml

También puede imprimir el contenido de los paquetes en la salida estándar a medida que se reciben, sin almacenar ningún dato capturado en archivos, utilizando el indicador -c de la siguiente manera.

Para probar esto de manera efectiva, abra una segunda terminal y ejecute un ping, o navegue por Internet. Debería poder ver los detalles del ping o los detalles de su navegación capturados por tcpflow.

$ sudo tcpflow -c

Es posible capturar todo el tráfico en un puerto en particular, por ejemplo, el puerto 80 (HTTP). En el caso del tráfico HTTP, podrá ver los encabezados HTTP seguidos por el contenido en la salida estándar o en un archivo si se quita el interruptor -c .

$ sudo tcpflow port 80

Para capturar paquetes de una interfaz de red específica, use el indicador -i para especificar el nombre de la interfaz.

$ sudo tcpflow -i eth0 port 80

También puede especificar un host de destino (los valores aceptados son dirección IP, nombre de host o dominios), como se muestra.

$ sudo tcpflow -c host 192.68.43.1
OR
$ sudo tcpflow -c host www.google.com 

Puede habilitar todo el procesamiento utilizando todos los escáneres con el indicador -a , esto es equivalente al conmutador -e all.

$ sudo tcpflow -a  
OR
$ sudo tcpflow -e all

También se puede activar un escáner específico; los escáneres disponibles incluyen md5, http, netviz, tcpdemux y wifiviz (ejecute tcpflow -H para ver información detallada sobre cada escáner).

$ sudo tcpflow -e http
OR
$ sudo tcpflow -e md5
OR
$ sudo tcpflow -e netviz
OR
$ sudo tcpflow -e tcpdemux
OR
$ sudo tcpflow -e wifiviz

El siguiente ejemplo muestra cómo habilitar todos los escáneres excepto tcpdemux.

$ sudo tcpflow -a -x tcpdemux 

TCPflow generalmente intenta poner la interfaz de red en modo promiscuo antes de capturar paquetes. Puede evitar esto usando el indicador -p como se muestra.

$ sudo tcpflow -p -i eth0

Para leer paquetes de un archivo tcpdump pcap, use el indicador -r .

$ sudo tcpflow -f file.pcap

Puede habilitar el modo detallado usando las opciones -v o -d 10 .

$ sudo tcpflow -v
OR
$ sudo tcpflow -d 10

Importante: Una limitación de tcpflow es que, en este momento, no comprende los fragmentos de IP, por lo que los datos transmitidos como parte de las conexiones TCP que contienen fragmentos de IP no se capturarán correctamente.

Para obtener más información y opciones de uso, consulte la página de manual de tcpflow.

$ man tcpflow 

Repositorio de TCPflow Github: https://github.com/simsong/tcpflow

¡Eso es todo por ahora! TCPflow es un potente registrador de flujo de TCP que es útil para comprender los flujos de paquetes de red y realizar análisis forenses de red, y mucho más. Pruébelo y comparta sus pensamientos con nosotros en los comentarios.