En esta guía te enseñaremos a capturar tráfico de red, filtrando exactamente por lo que estás buscando. En alguna ocasión nos interesa capturar y analizar todo el tráfico, pero en otras ocasiones solamente queremos capturar tráfico de una determinada IP, de un determinado puerto destino o de un protocolo concreto. Aquí te contamos todo eso mediante ejemplos para que puedas aprender a capturar tráfico con tcpdump en Linux.
TCPDUMP es la herramienta número uno de análisis de tráfico de red, una combinación de posibilidades y simplicidad en la línea de comandos.
Vamos a mostrarte mediante ejemplos, como hacer capturas de tráfico simples, o capturas complejas filtrando solamente aquello que necesites, útil para cualquier administrador de redes o seguridad.
Instalar y ejecutar tcpdump
Tcpdump es una herramienta muy antigua y está integrada en la paquetería oficial de cualquier distribución, por tanto la instalación es muy sencilla. En Debian o Ubuntu es tan sencillo como esto:
apt-get install tcpdump
Y en Fedora, CentOS, AlmaLinux o RedHat sería así:
yum install tcpump
Después, lo único que debes recordar es que por defecto capturar tráfico de un interfaz requiere permisos de root
. Por tanto, o bien utiliza el usuario root
o utiliza sudo
como corresponda en tu sistema.
- Todo en un interfaz
- Filtrar por IP
- Filtrar por IP origen y/o destino
- Filtrar por subred
- Mostrar contenido de paquete en hexadecimal
- Filtrar por puerto
- Filtrar tráfico por un rango de puertos
- Mostrar tráfico de un protocolo
- Mostrar solo tráfico IPv6
- Filtrar tráfico en base al tamaño del paquete
- Guardar la captura de tráfico en fichero
- Leer la captura de tráfico de un fichero
- Filtrar tráfico de una IP origen y un puerto destino
- Filtrar tráfico de una red a otra
- Tráfico a una determinada IP excepto ICMP
- Filtrar por Flags TCP
- Filtrar tráfico FTP
- Capturar contraseñas en tráfico no cifrado
- Otras opciones imprescindibles de Tcpdump
Todo en un interfaz
Para capturar todo el tráfico de red de un interfaz y mostrarlo en pantalla (resumido):
tcpdump -i eth0
El resultado sería algo así:
18:59:20.218672 IP 192.168.153.138.54750 > 192.168.153.108.https: Flags [.], ack 1, win 502, length 0 18:59:20.220167 IP 192.168.153.138.54750 > 192.168.153.108.https: Flags [P.], seq 1:213, ack 1, win 502, length 212 18:59:20.220728 IP 192.168.153.108.https > 192.168.153.138.54750: Flags [.], ack 213, win 917, length 0 18:59:20.222349 IP 192.168.153.80.49153 > 255.255.255.255.6667: UDP, length 172 18:59:20.354854 IP 192.168.153.108.https > 192.168.153.138.54750: Flags [.], seq 1:1361, ack 213, win 917, length 1360
Filtrar por IP
Para capturar el tráfico de una IP concreta, ya sea origen o destino de una conexión, puedes filtrarlo así:
tcpdump host 10.10.10.10
Filtrar por IP origen y/o destino
Si además quieres especificar que la IP sea solamente IP origen o destino de una conexión, puedes hacerlo de la siguiente forma:
tcpdump src 10.10.10.10 tcpdump dst 10.10.10.10
Filtrar por subred
También puedes agrupar por redes o subredes, y filtrar el tráfico para un determinado conjunto de IPs de esta forma, indicando el segmento de red:
tcpdump net 10.10.10.0/24
Mostrar contenido de paquete en hexadecimal
Tcpdump te puede mostrar el contenido de un paquete en hexadecimal y código ASCII, es decir, que te permitirá ver parte de la información que contiene ese paquete, y te puede servir para identificar información que estés buscando:
tcpdump -X
Y te mostrará algo similar, donde puedes ver a la derecha el contenido en texto ASCII:
Filtrar por puerto
El filtro de puerto es imprescindible, porque la mayoría de las veces estarás analizando algún problema en alguna aplicación o servicio concreto, y filtrar por el puerto adecuado será muy útil.
tcpdump port 22 tcpdump dst port 25
Filtrar tráfico por un rango de puertos
Si lo que necesitas es filtrar tráfico de un rango de puertos, también puedes hacerlo así:
tcpdump portrange 80-88 tcpdump dst portrange 80-88
Mostrar tráfico de un protocolo
En otras ocasiones, será preferible seleccionar el tráfico de un protocolo concreto, y eso lo puedes hacer así:
tcpdump udp tcpdump icmp
Mostrar solo tráfico IPv6
Si en algún momento IPv6 consigue desplegarse finalmente y reemplazar de verdad a IPv4, te vendrá muy bien filtrar solamente tráfico IPv6 y eliminar lo demás:
tcpdump ip6
Filtrar tráfico en base al tamaño del paquete
A veces, nos toca analizar tráfico buscando anomalías, y para eso nos puede venir bien seleccionar paquetes con un determinado tamaño, en algunas ocasiones querremos ver paquetes muy pequeños y en otras ocasiones paquetes grandes, el tamaño se indica en bytes:
tcpdump less 64 tcpdump <= 64 tcpdump greater 1450
Guardar la captura de tráfico en fichero
Cuando queremos hacer un análisis rápido, será suficiente con ver el resultado de la captura en consola, y con eso analizar lo que estemos buscando. Pero, en muchas ocasiones será necesario hacer un análisis exhaustivo del tráfico para buscar anomalías o problemas más complejos, y para eso es imprescindible guardar la captura en un fichero, y después poder analizarlo con WireShark.
WireShark es el complemento ideal para tcpdump, porque es compatible con Windows, Linux y MacOS, y te permite hacer un análisis mucho más detallado de todo el tráfico permitiendo ver estadísticas, identificar situaciones de congestión, pérdidas de paquetes, y casi todo lo que se te ocurra. La extensión habitual de estos ficheros es .pcap.
Para guardar la captura en disco:
tcpdump -w FICHERO_CAPTURA.pcap
Leer la captura de tráfico de un fichero
Cuando tenemos un fichero con una captura, además de leerlo con Wireshark también podemos hacerlo con Tcpdump. Es muy fácil:
tcpdump -r FICHERO_CAPTURA.pcap
Opciones avanzadas
Una vez vista las opciones básicas de Tcpdump, vamos a ver algunas opciones o combinaciones que nos permiten establecer filtros, y seleccionar exactamente el tráfico que nos interesa, quitando todo lo demás.
Ahora veremos cómo podemos combinar las opciones anteriores, pero además también podemos establecer varias condiciones de un mismo filtro con los siguientes operadores:
AND o &&: establece varias condiciones y se aplica cuando ambas se cumplen
OR o ||: establece varias condiciones y se aplica cuando al menos una se cumple
not o !: establece que se aplique el filtro cuando NO se cumpla la condición
Filtrar tráfico de una IP origen y un puerto destino
Por ejemplo, si necesitamos filtrar todo el tráfico que vaya a la IP destino 1.2.3.4 y al servicio Remote Desktop Services (puerto 3389), sin resolver nombres DNS ni puertos:
tcpdump -nn dst 1.2.3.4 and dst port 3389
Filtrar tráfico de una red a otra
Filtrar todo el tráfico desde la red origen 10.10.10.0/24 que tenga como destino la red 192.168.1.0/24 o la 192.168.2.0/24, utilizando algún puerto entre el 1024 y el 2048:
tcpdump src net 10.10.10.0/24 and dst net 192.168.1.0/24 or 192.168.2.0/24 and portrange 1024-2048
Tráfico a una determinada IP excepto ICMP
Mostrar todo el tráfico con destino la IP 1.2.3.4 que no sea tipo ICMP:
tcpdump dest 1.2.3.4 and not icmp
Filtrar por Flags TCP
En algunas ocasiones necesitaremos hilar más fino, y hacer filtros todavía más específicos. Por ejemplo, podemos identificar algunos flags de TCP para capturar tráfico, vamos a ver algunos ejemplos.
Capturar tráfico TCP SYN:
tcpdump "tcp[tcpflags] == tcp-syn"
O filtrar paquetes con el flag TCP FIN:
tcpdump "tcp[tcpflags] == tcp-fin"
Filtrar tráfico FTP
Capturar tráfico FTP, tanto de control como de datos:
tcpdump port ftp or ftp-data
Capturar contraseñas en tráfico no cifrado
Todavía hay protocolos que utilizan canales no cifrados, y las contraseñas se transmite en claro, como HTTP, FTP, POP3, TELNET, … Esto evidentemente es un problema de seguridad, y podemos comprobarlo simplemente capturando tráfico y aplicando unos filtros para capturar algunas de las cadenas de texto que se utilizan al intercambiar esta información:
tcpdump port http or port ftp or port smtp or port imap or port pop3 or port telnet -lA | egrep -i -B5 'pass=|pwd=|log=|login=|user=|username=|pw=|passw=|passwd= |password=|pass:|user:|username:|password:|login:|pass |user '
Otras opciones imprescindibles de Tcpdump
- -nn: No traduce IPs ni puertos en nombres, en la mayoría de los casos no es necesario, y es más claro observar las IPs y los puertos con sus números correspondientes.
- -XX: Además del contenido de -X, muestra las cabeceras ethernet
- -D: Muestra la lista de interfaces disponibles
- -vv: Mostrar más información (verbose)
- -c X: Mostrar solamente X número de paquetes y se para la captura
- -E: descifrar tráfico IPSEC proporcionando la clave de cifrado