Crear módulos de Terraform reutilizables
Gestión de secretos con Ansible Vault

Guía del comando tcpdump

tcpdump

tcpdump es una utilidad de línea de comandos que te permite capturar y analizar el tráfico de red que atraviesa tu sistema. Se utiliza con frecuencia para ayudar a solucionar problemas de red, así como auditar la seguridad.

Una herramienta potente y versátil que incluye muchas opciones y filtros, tcpdump se puede utilizar en una variedad de casos. Su funcionalidad es similar a Wireshark, pero es especialmente útil dado que es una herramienta de línea de comandos, es ideal para ejecutarse en servidores remotos o dispositivos para los cuales no está disponible una interfaz gráfica, para recopilar datos que se pueden analizar más tarde. También se puede iniciar en segundo plano o como un trabajo programado utilizando herramientas como cron.

En este artículo, veremos algunas de las características más comunes de tcpdump.

Página oficial

Documentación

Índice:

tcpdump en la terminal

1. Instalación en Linux

Tcpdump se incluye con varias distribuciones de Linux, por lo que es probable que ya lo tengas instalado. Verifica si tcpdump está instalado en tu sistema con el siguiente comando:

which tcpdump

Output:

/usr/sbin/tcpdump

Si tcpdump no está instalado, puedes instalarlo utilizando el administrador de paquetes de tu distribución. Por ejemplo, en Ubuntu, Debian o Linux Mint:

sudo apt install -y tcpdump

En Rocky Linux, Fedora o RHEL así:

sudo dnf install -y tcpdump

En Arch Linux o Manjaro:

sudo pacman -S tcpdump

tcpdump requiere libpcap, que es una biblioteca para la captura de paquetes de red. Si no está instalada, se agregará automáticamente como una dependencia.

Estás listo para comenzar a capturar algunos paquetes.

2. Captura de paquetes con tcpdump

Para capturar paquetes con fines de solución de problemas o análisis, tcpdump requiere permisos elevados. Por lo tanto, en los siguientes ejemplos, la mayoría de los comandos están precedidos por sudo.

Para empezar, utiliza el comando tcpdump –list-interfaces (o -D para abreviar) para ver qué interfaces están disponibles para la captura:

sudo tcpdump -D

Resultado:

1.eth0
2.virbr0
3.eth1
4.any (Pseudo-device that captures on all interfaces)
5.lo [Loopback]

En el ejemplo anterior, puedes ver todas las interfaces disponibles en mi máquina. La interfaz especial any permite la captura en cualquier interfaz activa.

Vamos a usarlo para comenzar a capturar algunos paquetes. Captura todos los paquetes en cualquier interfaz ejecutando este comando:

sudo tcpdump --interface any

Output:

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
09:56:18.293641 IP rhel75.localdomain.ssh > 192.168.64.1.56322: Flags [P.], seq 3770820720:3770820916, ack 3503648727, win 309, options [nop,nop,TS val 76577898 ecr 510770929], length 196
09:56:18.293794 IP 192.168.64.1.56322 > rhel75.localdomain.ssh: Flags [.], ack 196, win 391, options [nop,nop,TS val 510771017 ecr 76577898], length 0
09:56:18.295058 IP rhel75.59883 > gateway.domain: 2486+ PTR? 1.64.168.192.in-addr.arpa. (43)
09:56:18.310225 IP gateway.domain > rhel75.59883: 2486 NXDomain* 0/1/0 (102)
09:56:18.312482 IP rhel75.49685 > gateway.domain: 34242+ PTR? 28.64.168.192.in-addr.arpa. (44)
09:56:18.322425 IP gateway.domain > rhel75.49685: 34242 NXDomain* 0/1/0 (103)
09:56:18.323164 IP rhel75.56631 > gateway.domain: 29904+ PTR? 1.122.168.192.in-addr.arpa. (44)
09:56:18.323342 IP rhel75.localdomain.ssh > 192.168.64.1.56322: Flags [P.], seq 196:584, ack 1, win 309, options [nop,nop,TS val 76577928 ecr 510771017], length 388
09:56:18.323563 IP 192.168.64.1.56322 > rhel75.localdomain.ssh: Flags [.], ack 584, win 411, options [nop,nop,TS val 510771047 ecr 76577928], length 0
09:56:18.335569 IP gateway.domain > rhel75.56631: 29904 NXDomain* 0/1/0 (103)
09:56:18.336429 IP rhel75.44007 > gateway.domain: 61677+ PTR? 98.122.168.192.in-addr.arpa. (45)
09:56:18.336655 IP gateway.domain > rhel75.44007: 61677* 1/0/0 PTR rhel75. (65)
09:56:18.337177 IP rhel75.localdomain.ssh > 192.168.64.1.56322: Flags [P.], seq 584:1644, ack 1, win 309, options [nop,nop,TS val 76577942 ecr 510771047], length 1060

---- SKIPPING LONG OUTPUT -----

09:56:19.342939 IP 192.168.64.1.56322 > rhel75.localdomain.ssh: Flags [.], ack 1752016, win 1444, options [nop,nop,TS val 510772067 ecr 76578948], length 0
^C
9003 packets captured
9010 packets received by filter
7 packets dropped by kernel

Tcpdump continúa capturando paquetes hasta que recibe una señal de interrupción. Puedes interrumpir la captura presionando Ctrl+C. Como puedes ver en este ejemplo, tcpdump capturó más de 9,000 paquetes. En este caso, dado que estoy conectado a este servidor usando ssh, tcpdump capturó todos estos paquetes. Para limitar la cantidad de paquetes capturados y detener tcpdump, utiliza la opción -c (para contar):

sudo tcpdump -i any -c 5

Output:

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
11:21:30.242740 IP rhel75.localdomain.ssh > 192.168.64.1.56322: Flags [P.], seq 3772575680:3772575876, ack 3503651743, win 309, options [nop,nop,TS val 81689848 ecr 515883153], length 196
11:21:30.242906 IP 192.168.64.1.56322 > rhel75.localdomain.ssh: Flags [.], ack 196, win 1443, options [nop,nop,TS val 515883235 ecr 81689848], length 0
11:21:30.244442 IP rhel75.43634 > gateway.domain: 57680+ PTR? 1.64.168.192.in-addr.arpa. (43)
11:21:30.244829 IP gateway.domain > rhel75.43634: 57680 NXDomain 0/0/0 (43)
11:21:30.247048 IP rhel75.33696 > gateway.domain: 37429+ PTR? 28.64.168.192.in-addr.arpa. (44)
5 packets captured
12 packets received by filter
0 packets dropped by kernel

En este caso, tcpdump dejó de capturar automáticamente después de capturar cinco paquetes. Esto es útil en diferentes escenarios, por ejemplo, si estás solucionando problemas de conectividad y capturar algunos paquetes iniciales es suficiente. Esto es aún más útil cuando aplicamos filtros para capturar paquetes específicos (como se muestra a continuación).

Por defecto, tcpdump resuelve las direcciones IP y los puertos en nombres, como se muestra en el ejemplo anterior. Cuando estás solucionando problemas de red, a menudo es más fácil usar las direcciones IP y los números de puerto; desactiva la resolución de nombres utilizando la opción -n y la resolución de puerto con -nn:

sudo tcpdump -i any -c5 -nn

Output:

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
23:56:24.292206 IP 192.168.64.28.22 > 192.168.64.1.35110: Flags [P.], seq 166198580:166198776, ack 2414541257, win 309, options [nop,nop,TS val 615664 ecr 540031155], length 196
23:56:24.292357 IP 192.168.64.1.35110 > 192.168.64.28.22: Flags [.], ack 196, win 1377, options [nop,nop,TS val 540031229 ecr 615664], length 0
23:56:24.292570 IP 192.168.64.28.22 > 192.168.64.1.35110: Flags [P.], seq 196:568, ack 1, win 309, options [nop,nop,TS val 615664 ecr 540031229], length 372
23:56:24.292655 IP 192.168.64.1.35110 > 192.168.64.28.22: Flags [.], ack 568, win 1400, options [nop,nop,TS val 540031229 ecr 615664], length 0
23:56:24.292752 IP 192.168.64.28.22 > 192.168.64.1.35110: Flags [P.], seq 568:908, ack 1, win 309, options [nop,nop,TS val 615664 ecr 540031229], length 340
5 packets captured
6 packets received by filter
0 packets dropped by kernel

Como se muestra arriba, la salida de la captura ahora muestra las direcciones IP y los números de puerto. Esto también evita que tcpdump realice búsquedas DNS, lo que ayuda a reducir el tráfico de red al solucionar problemas de red.

Ahora que puedes capturar paquetes de red, exploremos qué significa esta salida.

3. Comprendiendo el formato de salida

Tcpdump es capaz de capturar y decodificar muchos protocolos diferentes, como TCP, UDP, ICMP y muchos más. Aunque no podemos cubrir todos aquí, para ayudarte a empezar, exploremos el paquete TCP. Puedes encontrar más detalles sobre los diferentes formatos de protocolo en las páginas manuales de tcpdump. Un paquete típico de TCP capturado por tcpdump se ve así:

08:41:13.729687 IP 192.168.64.28.22 > 192.168.64.1.41916: Flags [P.], seq 196:568, ack 1, win 309, options [nop,nop,TS val 117964079 ecr 816509256], length 372

Los campos pueden variar según el tipo de paquete enviado, pero este es el formato general.

El primer campo, 08:41:13.729687, representa la marca de tiempo del paquete recibido según el reloj local.

A continuación, IP representa el protocolo de la capa de red, en este caso, IPv4. Para paquetes IPv6, el valor es IP6.

El siguiente campo, 192.168.64.28.22, es la dirección IP y puerto de origen. Esto es seguido por la dirección IP y puerto de destino, representados por 192.168.64.1.41916.

Después de la fuente y el destino, puedes encontrar los indicadores de flags de TCP [P.]. Los valores típicos para este campo incluyen:

Valor Tipo de Bandera Descripción
S SYN Inicio de conexión
F FIN Finalización de conexión
P PUSH Empuje de datos
R RST Restablecimiento de conexión
. ACK Acknowledgment

Este campo también puede ser una combinación de estos valores, como [S.] para un paquete SYN-ACK.

A continuación está el número de secuencia de los datos contenidos en el paquete. Para el primer paquete capturado, este es un número absoluto. Los paquetes subsiguientes utilizan un número relativo para facilitar su seguimiento. En este ejemplo, la secuencia es seq 196:568, lo que significa que este paquete contiene bytes 196 a 568 de este flujo.

A esto le sigue el Número de Ack: ack 1. En este caso, es 1, ya que este es el lado que envía datos. Para el lado que recibe datos, este campo representa el siguiente byte esperado (datos) en este flujo. Por ejemplo, el número de Ack para el siguiente paquete en este flujo sería 568.

El siguiente campo es el tamaño de la ventana win 309, que representa el número de bytes disponibles en el búfer de recepción, seguido por opciones de TCP como MSS (Tamaño Máximo de Segmento) o Escala de Ventana. Para obtener detalles sobre las opciones del protocolo TCP, consulta los Parámetros del Protocolo de Control de Transmisión (TCP).

Finalmente, tenemos la longitud del paquete, length 372, que representa la longitud, en bytes, de los datos de carga útil. La longitud es la diferencia entre los últimos y primeros bytes en el número de secuencia.

Ahora aprendamos cómo filtrar paquetes para reducir resultados y facilitar la solución de problemas específicos.

4. Filtrado de paquetes

Como se mencionó anteriormente, tcpdump puede capturar demasiados paquetes, algunos de los cuales ni siquiera están relacionados con el problema que estás solucionando. Por ejemplo, si estás solucionando un problema de conectividad con un servidor web, no te interesa el tráfico de SSH, por lo que eliminar los paquetes SSH de la salida facilita trabajar en el problema real.

Una de las características más poderosas de tcpdump es su capacidad para filtrar los paquetes capturados utilizando diversos parámetros, como direcciones IP de origen y destino, puertos, protocolos, etc. Veamos algunos de los más comunes.

Por protocolo

Para filtrar paquetes según el protocolo, especifica el protocolo en la línea de comandos. Por ejemplo, captura solo paquetes ICMP usando este comando:

sudo tcpdump -i any -c5 icmp

Output:

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes

En una terminal diferente, intenta hacer ping a otra máquina:

ping opensource.com

Output:

PING opensource.com (54.204.39.132) 56(84) bytes of data.
64 bytes from ec2-54-204-39-132.compute-1.amazonaws.com (54.204.39.132): icmp_seq=1 ttl=47 time=39.6 ms

De vuelta en la captura de tcpdump, observa que tcpdump captura y muestra solo los paquetes relacionados con ICMP. En este caso, tcpdump no está mostrando los paquetes de resolución de nombres que se generaron al resolver el nombre opensource.com:

09:34:20.136766 IP rhel75 > ec2-54-204-39-132.compute-1.amazonaws.com: ICMP echo request, id 20361, seq 1, length 64
09:34:20.176402 IP ec2-54-204-39-132.compute-1.amazonaws.com > rhel75: ICMP echo reply, id 20361, seq 1, length 64
09:34:21.140230 IP rhel75 > ec2-54-204-39-132.compute-1.amazonaws.com: ICMP echo request, id 20361, seq 2, length 64
09:34:21.180020 IP ec2-54-204-39-132.compute-1.amazonaws.com > rhel75: ICMP echo reply, id 20361, seq 2, length 64
09:34:22.141777 IP rhel75 > ec2-54-204-39-132.compute-1.amazonaws.com: ICMP echo request, id 20361, seq 3, length 64
5 packets captured
5 packets received by filter
0 packets dropped by kernel

Por host

Limita la captura solo a los paquetes relacionados con un host específico utilizando el filtro de host:

sudo tcpdump -i any -c5 -nn host 54.204.39.132

Output:

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
09:54:20.042023 IP 192.168.122.98.39326 > 54.204.39.132.80: Flags [S], seq 1375157070, win 29200, options [mss 1460,sackOK,TS val 122350391 ecr 0,nop,wscale 7], length 0
09:54:20.088127 IP 54.204.39.132.80 > 192.168.122.98.39326: Flags [S.], seq 1935542841, ack 1375157071, win 28960, options [mss 1460,sackOK,TS val 522713542 ecr 122350391,nop,wscale 9], length 0
09:54:20.088204 IP 192.168.122.98.39326 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 122350437 ecr 522713542], length 0
09:54:20.088734 IP 192.168.122.98.39326 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 122350438 ecr 522713542], length 112: HTTP: GET / HTTP/1.1
09:54:20.129733 IP 54.204.39.132.80 > 192.168.122.98.39326: Flags [.], ack 113, win 57, options [nop,nop,TS val 522713552 ecr 122350438], length 0
5 packets captured
5 packets received by filter
0 packets dropped by kernel

En este ejemplo, tcpdump captura y muestra solo los paquetes hacia y desde el host 54.204.39.132.

Por puerto

Para filtrar paquetes según el servicio o puerto deseado, utiliza el filtro de puerto. Por ejemplo, captura paquetes relacionados con un servicio web (HTTP) mediante el siguiente comando:

sudo tcpdump -i any -c5 -nn port 80

Output:

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
09:58:28.790548 IP 192.168.122.98.39330 > 54.204.39.132.80: Flags [S], seq 1745665159, win 29200, options [mss 1460,sackOK,TS val 122599140 ecr 0,nop,wscale 7], length 0
09:58:28.834026 IP 54.204.39.132.80 > 192.168.122.98.39330: Flags [S.], seq 4063583040, ack 1745665160, win 28960, options [mss 1460,sackOK,TS val 522775728 ecr 122599140,nop,wscale 9], length 0
09:58:28.834093 IP 192.168.122.98.39330 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 122599183 ecr 522775728], length 0
09:58:28.834588 IP 192.168.122.98.39330 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 122599184 ecr 522775728], length 112: HTTP: GET / HTTP/1.1
09:58:28.878445 IP 54.204.39.132.80 > 192.168.122.98.39330: Flags [.], ack 113, win 57, options [nop,nop,TS val 522775739 ecr 122599184], length 0
5 packets captured
5 packets received by filter
0 packets dropped by kernel

Por fuente IP/nombre de host

También puedes filtrar paquetes según la dirección IP de origen o destino o el nombre de host. Por ejemplo, para capturar paquetes del host 192.168.122.98:

sudo tcpdump -i any -c5 -nn src 192.168.122.98

Output:

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
10:02:15.220824 IP 192.168.122.98.39436 > 192.168.122.1.53: 59332+ A? opensource.com. (32)
10:02:15.220862 IP 192.168.122.98.39436 > 192.168.122.1.53: 20749+ AAAA? opensource.com. (32)
10:02:15.364062 IP 192.168.122.98.39334 > 54.204.39.132.80: Flags [S], seq 1108640533, win 29200, options [mss 1460,sackOK,TS val 122825713 ecr 0,nop,wscale 7], length 0
10:02:15.409229 IP 192.168.122.98.39334 > 54.204.39.132.80: Flags [.], ack 669337581, win 229, options [nop,nop,TS val 122825758 ecr 522832372], length 0
10:02:15.409667 IP 192.168.122.98.39334 > 54.204.39.132.80: Flags [P.], seq 0:112, ack 1, win 229, options [nop,nop,TS val 122825759 ecr 522832372], length 112: HTTP: GET / HTTP/1.1
5 packets captured
5 packets received by filter
0 packets dropped by kernel

Observa que tcpdump capturó paquetes con la dirección IP de origen 192.168.122.98 para múltiples servicios, como la resolución de nombres (puerto 53) y HTTP (puerto 80). Los paquetes de respuesta no se muestran ya que su dirección IP de origen es diferente.

Por otro lado, puedes utilizar el filtro dst para filtrar por dirección IP/hostname de destino:

sudo tcpdump -i any -c5 -nn dst 192.168.122.98

Output:

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
10:05:03.572931 IP 192.168.122.1.53 > 192.168.122.98.47049: 2248 1/0/0 A 54.204.39.132 (48)
10:05:03.572944 IP 192.168.122.1.53 > 192.168.122.98.47049: 33770 0/0/0 (32)
10:05:03.621833 IP 54.204.39.132.80 > 192.168.122.98.39338: Flags [S.], seq 3474204576, ack 3256851264, win 28960, options [mss 1460,sackOK,TS val 522874425 ecr 122993922,nop,wscale 9], length 0
10:05:03.667767 IP 54.204.39.132.80 > 192.168.122.98.39338: Flags [.], ack 113, win 57, options [nop,nop,TS val 522874436 ecr 122993972], length 0
10:05:03.672221 IP 54.204.39.132.80 > 192.168.122.98.39338: Flags [P.], seq 1:643, ack 113, win 57, options [nop,nop,TS val 522874437 ecr 122993972], length 642: HTTP: HTTP/1.1 302 Found
5 packets captured
5 packets received by filter
0 packets dropped by kernel

Por expresiones complejas

También puedes combinar filtros utilizando los operadores lógicos and y or para crear expresiones más complejas. Por ejemplo, para filtrar paquetes desde la dirección IP de origen 192.168.122.98 y solo el servicio HTTP, utiliza este comando:

sudo tcpdump -i any -c5 -nn src 192.168.122.98 and port 80

Output:

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
10:08:00.472696 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [S], seq 2712685325, win 29200, options [mss 1460,sackOK,TS val 123170822 ecr 0,nop,wscale 7], length 0
10:08:00.516118 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [.], ack 268723504, win 229, options [nop,nop,TS val 123170865 ecr 522918648], length 0
10:08:00.516583 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [P.], seq 0:112, ack 1, win 229, options [nop,nop,TS val 123170866 ecr 522918648], length 112: HTTP: GET / HTTP/1.1
10:08:00.567044 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [.], ack 643, win 239, options [nop,nop,TS val 123170916 ecr 522918661], length 0
10:08:00.788153 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [F.], seq 112, ack 643, win 239, options [nop,nop,TS val 123171137 ecr 522918661], length 0
5 packets captured
5 packets received by filter
0 packets dropped by kernel

Puedes crear expresiones más complejas agrupando filtros con paréntesis. En este caso, encierra toda la expresión de filtro con comillas para evitar que la terminal las confunda con expresiones de la terminal:

sudo tcpdump -i any -c5 -nn "port 80 and (src 192.168.122.98 or src 54.204.39.132)"

Resultado:

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
10:10:37.602214 IP 192.168.122.98.39346 > 54.204.39.132.80: Flags [S], seq 871108679, win 29200, options [mss 1460,sackOK,TS val 123327951 ecr 0,nop,wscale 7], length 0
10:10:37.650651 IP 54.204.39.132.80 > 192.168.122.98.39346: Flags [S.], seq 854753193, ack 871108680, win 28960, options [mss 1460,sackOK,TS val 522957932 ecr 123327951,nop,wscale 9], length 0
10:10:37.650708 IP 192.168.122.98.39346 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 123328000 ecr 522957932], length 0
10:10:37.651097 IP 192.168.122.98.39346 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 123328000 ecr 522957932], length 112: HTTP: GET / HTTP/1.1
10:10:37.692900 IP 54.204.39.132.80 > 192.168.122.98.39346: Flags [.], ack 113, win 57, options [nop,nop,TS val 522957942 ecr 123328000], length 0
5 packets captured
5 packets received by filter
0 packets dropped by kernel

En este ejemplo, estamos filtrando paquetes solo para el servicio HTTP (puerto 80) y direcciones IP de origen 192.168.122.98 o 54.204.39.132. Esta es una manera rápida de examinar ambos lados del mismo flujo.

5. Verificación del contenido del paquete

En los ejemplos anteriores, estábamos revisando solo los encabezados de los paquetes en busca de información como origen, destinos, puertos, etc. A veces, esto es todo lo que necesitamos para solucionar problemas de conectividad de red. Sin embargo, en ocasiones necesitamos inspeccionar el contenido del paquete para asegurarnos de que el mensaje que estamos enviando contiene lo que necesitamos o que recibimos la respuesta esperada. Para ver el contenido del paquete, tcpdump proporciona dos banderas adicionales: -X para imprimir el contenido en hexadecimal y ASCII o -A para imprimir el contenido en ASCII.

Por ejemplo, inspecciona el contenido HTTP de una solicitud web de la siguiente manera:

sudo tcpdump -i any -c10 -nn -A port 80

Output:

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
13:02:14.871803 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [S], seq 2546602048, win 29200, options [mss 1460,sackOK,TS val 133625221 ecr 0,nop,wscale 7], length 0
E..<..@.@.....zb6.'....P...@......r............ ............................ 13:02:14.910734 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [S.], seq 1877348646, ack 2546602049, win 28960, options [mss 1460,sackOK,TS val 525532247 ecr 133625221,nop,wscale 9], length 0
E..<..@./..a6.'...zb.P..o..&...A..q a.......... .R.W....... ................ 13:02:14.910832 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 133625260 ecr 525532247], length 0
E..4..@.@.....zb6.'....P...Ao..'...........
.....R.W................
13:02:14.911808 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 133625261 ecr 525532247], length 112: HTTP: GET / HTTP/1.1
E.....@.@..1..zb6.'....P...Ao..'...........
.....R.WGET / HTTP/1.1
User-Agent: Wget/1.14 (linux-gnu)
Accept: */*
Host: opensource.com
Connection: Keep-Alive

................
13:02:14.951199 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [.], ack 113, win 57, options [nop,nop,TS val 525532257 ecr 133625261], length 0
E..4.F@./.."6.'...zb.P..o..'.......9.2.....
.R.a....................
13:02:14.955030 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [P.], seq 1:643, ack 113, win 57, options [nop,nop,TS val 525532258 ecr 133625261], length 642: HTTP: HTTP/1.1 302 Found
E....G@./...6.'...zb.P..o..'.......9.......
.R.b....HTTP/1.1 302 Found
Server: nginx
Date: Sun, 23 Sep 2018 17:02:14 GMT
Content-Type: text/html; charset=iso-8859-1
Content-Length: 207
X-Content-Type-Options: nosniff
Location: https://opensource.com/
Cache-Control: max-age=1209600
Expires: Sun, 07 Oct 2018 17:02:14 GMT
X-Request-ID: v-6baa3acc-bf52-11e8-9195-22000ab8cf2d
X-Varnish: 632951979
Age: 0
Via: 1.1 varnish (Varnish/5.2)
X-Cache: MISS
Connection: keep-alive

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="https://opensource.com/">here</a>.</p>
</body></html>
................
13:02:14.955083 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [.], ack 643, win 239, options [nop,nop,TS val 133625304 ecr 525532258], length 0
E..4..@.@.....zb6.'....P....o..............
.....R.b................
13:02:15.195524 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [F.], seq 113, ack 643, win 239, options [nop,nop,TS val 133625545 ecr 525532258], length 0
E..4..@.@.....zb6.'....P....o..............
.....R.b................
13:02:15.236592 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [F.], seq 643, ack 114, win 57, options [nop,nop,TS val 525532329 ecr 133625545], length 0
E..4.H@./.. 6.'...zb.P..o..........9.I.....
.R......................
13:02:15.236656 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [.], ack 644, win 239, options [nop,nop,TS val 133625586 ecr 525532329], length 0
E..4..@.@.....zb6.'....P....o..............
.....R..................
10 packets captured
10 packets received by filter
0 packets dropped by kernel

Esto es útil para solucionar problemas con llamadas a API, siempre y cuando las llamadas utilicen HTTP sin cifrar. Para conexiones cifradas, esta salida es menos útil.

6. Guardar capturas en un archivo

Otra característica útil proporcionada por tcpdump es la capacidad de guardar la captura en un archivo para que puedas analizar los resultados más tarde. Esto te permite capturar paquetes en modo por lotes durante la noche, por ejemplo, y verificar los resultados por la mañana. También es útil cuando hay demasiados paquetes para analizar, ya que la captura en tiempo real puede ocurrir demasiado rápido.

Para guardar paquetes en un archivo en lugar de mostrarlos en la pantalla, utiliza la opción -w (para escribir):

sudo tcpdump -i any -c10 -nn -w webserver.pcap port 80

Output:

[sudo] password for v: 
tcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
10 packets captured
10 packets received by filter
0 packets dropped by kernel

Este comando guarda la salida en un archivo llamado webserver.pcap. La extensión .pcap significa «captura de paquetes» y es la convención para este formato de archivo.

Como se muestra en este ejemplo, nada se muestra en la pantalla y la captura finaliza después de capturar 10 paquetes, según la opción -c10. Si deseas obtener alguna retroalimentación para asegurarte de que se están capturando paquetes, utiliza la opción -v.

Tcpdump crea un archivo en formato binario, por lo que no puedes abrirlo simplemente con un editor de texto. Para leer el contenido del archivo, ejecuta tcpdump con la opción -r (para leer):

tcpdump -nn -r webserver.pcap

Output:

reading from file webserver.pcap, link-type LINUX_SLL (Linux cooked)
13:36:57.679494 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [S], seq 3709732619, win 29200, options [mss 1460,sackOK,TS val 135708029 ecr 0,nop,wscale 7], length 0
13:36:57.718932 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [S.], seq 1999298316, ack 3709732620, win 28960, options [mss 1460,sackOK,TS val 526052949 ecr 135708029,nop,wscale 9], length 0
13:36:57.719005 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 135708068 ecr 526052949], length 0
13:36:57.719186 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 135708068 ecr 526052949], length 112: HTTP: GET / HTTP/1.1
13:36:57.756979 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [.], ack 113, win 57, options [nop,nop,TS val 526052959 ecr 135708068], length 0
13:36:57.760122 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [P.], seq 1:643, ack 113, win 57, options [nop,nop,TS val 526052959 ecr 135708068], length 642: HTTP: HTTP/1.1 302 Found
13:36:57.760182 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [.], ack 643, win 239, options [nop,nop,TS val 135708109 ecr 526052959], length 0
13:36:57.977602 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [F.], seq 113, ack 643, win 239, options [nop,nop,TS val 135708327 ecr 526052959], length 0
13:36:58.022089 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [F.], seq 643, ack 114, win 57, options [nop,nop,TS val 526053025 ecr 135708327], length 0
13:36:58.022132 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [.], ack 644, win 239, options [nop,nop,TS val 135708371 ecr 526053025], length 0

Dado que ya no estás capturando los paquetes directamente desde la interfaz de red, no se requiere sudo para leer el archivo.

También puedes utilizar cualquiera de los filtros que hemos discutido para filtrar el contenido del archivo, tal como lo harías con datos en tiempo real. Por ejemplo, inspecciona los paquetes en el archivo de captura desde la dirección IP de origen 54.204.39.132 ejecutando este comando:

tcpdump -nn -r webserver.pcap src 54.204.39.132

Output:

reading from file webserver.pcap, link-type LINUX_SLL (Linux cooked)
13:36:57.718932 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [S.], seq 1999298316, ack 3709732620, win 28960, options [mss 1460,sackOK,TS val 526052949 ecr 135708029,nop,wscale 9], length 0
13:36:57.756979 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [.], ack 113, win 57, options [nop,nop,TS val 526052959 ecr 135708068], length 0
13:36:57.760122 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [P.], seq 1:643, ack 113, win 57, options [nop,nop,TS val 526052959 ecr 135708068], length 642: HTTP: HTTP/1.1 302 Found
13:36:58.022089 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [F.], seq 643, ack 114, win 57, options [nop,nop,TS val 526053025 ecr 135708327], length 0

¿Qué sigue después de tcpdump?

Estas características básicas de tcpdump te ayudarán a comenzar con esta herramienta poderosa y versátil. Para aprender más, consulta el sitio web y las páginas del manual de tcpdump.

La interfaz de línea de comandos de tcpdump proporciona una gran flexibilidad para capturar y analizar el tráfico de red. Si necesitas una herramienta gráfica para entender flujos más complejos, echa un vistazo a Wireshark.

Una ventaja de Wireshark es que puede leer archivos .pcap capturados por tcpdump. Puedes usar tcpdump para capturar paquetes en una máquina remota que no tenga una interfaz gráfica y analizar el archivo resultante con Wireshark, pero eso es un tema para otro día.

Wireshark con fichero tcpdump

Cheat Sheet tcpdump

Este cheat sheet de tcpdump te ayudará a familiarizarte con los filtros y comandos de tcpdump apropiados para diversas situaciones. Primero los interruptores y comandos de tcpdump disponibles, luego unos cuantos ejemplos de uso de cada comando de tcpdump.

Comandos de Captura

Usa los siguientes comandos para capturar paquetes de datos:

Comando Uso Ejemplar Explicación
-i any tcpdump -i any Captura desde todas las interfaces; puede requerir superusuario (sudo/su)
-i eth0 tcpdump -i eth0 Captura desde la interfaz eth0
-c count tcpdump -i eth0 -c 5 Salir después de recibir count (5) paquetes
-r captures.pcap tcpdump -i eth0 -r captures.pcap Lee y analiza el archivo de captura guardado captures.pcap
tcp tcpdump -i eth0 tcp Muestra solo paquetes TCP
udp tcpdump -i eth0 udp Muestra solo paquetes UDP
icmp tcpdump -i eth0 icmp Muestra solo paquetes ICMP
ip tcpdump -i eth0 ip Muestra solo paquetes IPv4
ip6 tcpdump -i eth0 ip6 Muestra solo paquetes IPv6
arp tcpdump -i eth0 arp Muestra solo paquetes ARP
rarp tcpdump -i eth0 rarp Muestra solo paquetes RARP
slip tcpdump -i eth0 slip Muestra solo paquetes SLIP
-I tcpdump -i eth0 -I Establece la interfaz en modo monitor
-K tcpdump -i eth0 -K No verifica la suma de comprobación
-p tcpdump -i eth0 -p No captura en modo promiscuo

Comandos de Filtro

Puedes agregar expresiones de filtro especiales en tcpdump para seleccionar paquetes específicos. Son especialmente útiles cuando deseas analizar archivos de captura de paquetes guardados. Cada expresión de filtro es un parámetro de una o varias palabras y su argumento, separados por espacios. También puedes aplicar operadores lógicos para combinar dos expresiones de filtro.

En los siguientes ejemplos, estamos usando 127.0.0.1 como un marcador de posición para direcciones IPv4/IPv6:

Expresión de Filtro Explicación
src host 127.0.0.1 Filtra por IP/hostname de origen 127.0.0.1
dst host 127.0.0.1 Filtra por IP/hostname de destino 127.0.0.1
host 127.0.0.1 Filtra por IP de origen o destino = 127.0.0.1
ether src 01:23:45:AB:CD:EF Filtra por MAC de origen 01:23:45:AB:CD:EF
ether dst 01:23:45:AB:CD:EF Filtra por MAC de destino 01:23:45:AB:CD:EF
ether host 01:23:45:AB:CD:EF Filtra por MAC de origen o destino 01:23:45:AB:CD:EF
src net 127.0.0.1 Filtra por ubicación de red de origen 127.0.0.1
dst net 127.0.0.1 Filtra por ubicación de red de destino 127.0.0.1
net 127.0.0.1 Filtra por ubicación de red de origen o destino 127.0.0.1
net 127.0.0.1/24 Filtra por ubicación de red de origen o destino 127.0.0.1 con la máscara de subred tcpdump de longitud 24
src port 80 Filtra por puerto de origen = 80
dst port 80 Filtra por puerto de destino = 80
port 80 Filtra por puerto de origen o destino = 80
src portrange 80-400 Filtra por valor de puerto de origen entre 80 y 400
dst portrange 80-400 Filtra por valor de puerto de destino entre 80 y 400
portrange 80-400 Filtra por valor de puerto de origen o destino entre 80 y 400
ether broadcast Filtra por transmisiones de Ethernet
ip broadcast Filtra por transmisiones de IPv4
ether multicast Filtra por multidifusiones de Ethernet
ip multicast Filtra por multidifusiones de IPv4
ip6 multicast Filtra por multidifusiones de IPv6
ip src

host mydevice

Filtra por nombre de host de origen IPv4 mydevice
arp dst host mycar Filtra por nombre de host de destino ARP mycar
rarp src host 127.0.0.1 Filtra por origen RARP 127.0.0.1
ip6 dst host mywatch Filtra por nombre de host de destino IPv6 mywatch
tcp dst port 8000 Filtra por puerto TCP de destino = 8000
udp src portrange 1000-2000 Filtra por puertos TCP de origen en 1000–2000
sctp port 22 Filtra por puerto de origen o destino = 22

Comandos de Visualización

Estos interruptores de tcpdump le dicen al terminal cómo mostrar la salida:

Comando Ejemplo Explicación
-A tcpdump -i eth0 -A Imprime cada paquete (sin su encabezado de nivel de enlace) en ASCII. Útil para capturar páginas web.
-D tcpdump -D Imprime la lista de interfaces de red disponibles en el sistema y desde las cuales tcpdump puede capturar paquetes.
-e tcpdump -i eth0 -e Imprime el encabezado de nivel de enlace en cada línea de salida, como direcciones de capa MAC para protocolos como Ethernet y IEEE 802.11.
-F params.conf tcpdump -i eth0 -F /path/to/params.conf Usa el archivo params.conf como entrada para la expresión de filtro. (Ignora otras expresiones en la línea de comandos.)
-n tcpdump -i eth0 -n No convierte direcciones (es decir, direcciones de host, números de puerto, etc.) a nombres.
-S tcpdump -i eth0 -S Imprime números de secuencia TCP absolutos en lugar de relativos. (Los números de secuencia TCP absolutos son más largos.)
--time-stamp-precision=tsp tcpdump -i eth0 --time-stamp-precision=nano Al capturar, establece la precisión de la marca de tiempo para la captura en tsp: • micro para microsegundo (predeterminado) • nano para nanosegundo.
-t tcpdump -i eth0 -t Omite la marca de tiempo en cada línea de salida.
-tt tcpdump -i eth0 -tt Imprime la marca de tiempo, como segundos desde el 1 de enero de 1970, 00:00:00, UTC, y fracciones de segundo desde ese momento, en cada línea de volcado.
-ttt tcpdump -i eth0 -ttt Imprime un delta (resolución de microsegundos o nanosegundos según la opción –time-stamp-precision) entre la línea actual y la anterior en cada línea de salida. La resolución predeterminada es de microsegundo.
-tttt tcpdump -i eth0 -tttt Imprime una marca de tiempo como horas, minutos, segundos y fracciones de segundo desde la medianoche, precedida por la fecha, en cada línea de volcado.
-ttttt tcpdump -i eth0 -ttttt Imprime un delta (resolución de microsegundos o nanosegundos según la opción –time-stamp-precision) entre la línea actual y la primera en cada línea de salida. La resolución predeterminada es de microsegundo.
-u tcpdump -i eth0 -u Imprime manijas no decodificadas del sistema de archivos de red (NFS).
-v tcpdump -i eth0 -v Produce una salida detallada. Cuando se escribe en un archivo (opción -w) y al mismo tiempo no se lee desde un archivo (opción -r), informa al error estándar, una vez por segundo, la cantidad de paquetes capturados.
-vv tcpdump -i eth0 -vv Salida detallada adicional que -v
-vvv tcpdump -i

eth0 -vvv

Salida detallada adicional que -vv
-x tcpdump -i eth0 -x Imprime los encabezados y datos de cada paquete (sin su encabezado de nivel de enlace) en hexadecimal.
-xx tcpdump -i eth0 -xx Imprime los encabezados y datos de cada paquete, incluido su encabezado de nivel de enlace, en hexadecimal.
-X tcpdump -i eth0 -X Imprime los encabezados y datos de cada paquete (sin su encabezado de nivel de enlace) en hexadecimal y ASCII.
-XX tcpdump -i eth0 -XX Imprime los encabezados y datos de cada paquete, incluido su encabezado de nivel de enlace, en hexadecimal y ASCII.

Comandos de Salida

Personaliza la salida de tcpdump con los siguientes comandos:

Comando Ejemplo Explicación
-w captures.pcap tcpdump -i eth0 -w captures.pcap Captura de salida a un archivo captures.pcap
-d tcpdump -i eth0 -d Muestra la forma legible por humanos en la salida estándar
-L tcpdump -i eth0 -L Muestra los tipos de enlace de datos para la interfaz
-q tcpdump -i eth0 -q Salida rápida/silenciosa. Imprime menos información del protocolo, por lo que las líneas de salida son más cortas
-U tcpdump -i eth0 -U -w out.pcap Sin la opción -w, imprime una descripción del contenido de cada paquete. Con la opción -w, escribe cada paquete en el archivo de salida out.pcap en tiempo real en lugar de solo cuando se llena el búfer de salida

Comandos Variados

Los siguientes comandos no entran en las categorías anteriores:

Aquí están los operadores lógicos que tcpdump utiliza, con 127.0.0.1 como marcador de posición para direcciones IPv4/IPv6:

Operador Sintaxis Ejemplo Descripción
AND and, && tcpdump -n src 127.0.0.1 and dst port 21 Combina opciones de filtrado unidas por «and»
OR or, \|\| tcpdump dst 127.0.0.1 or src port 22 Coincide con cualquiera de las condiciones unidas por «or»
EXCEPT not, ! tcpdump dst 127.0.0.1 and not icmp Niega la condición precedida por «not»
LESS less, <, (<=) tcpdump dst host 127.0.0.1 and less 128 Muestra paquetes más cortos que (o iguales a) 128 bytes de longitud. < solo se aplica a longitud 32, es decir, <32
GREATER greater, >, (>=) tcpdump dst host 127.0.0.1 and greater 64 Muestra paquetes más largos que (o iguales a) 64 bytes de longitud. > solo se aplica a longitud 32, es decir, >32
EQUAL =, == tcpdump host 127.0.0.1 = 0 Muestra paquetes con longitud cero

Más ejemplos de uso

En los ejemplos a continuación, creamos comandos específicos combinando interruptores y filtros de tcpdump:

Ejemplo Explicación
tcpdump -r outfile.pcap src host 10.0.2.15 Muestra todos los paquetes en el archivo outfile.pcap provenientes del host con dirección IP 10.0.2.15
tcpdump -i any ip and not tcp port 80 Escucha paquetes no HTTP (que tienen el número de puerto TCP 80) en cualquier interfaz de red
tcpdump -i eth0 -n >32 -w pv01.pcap -c 30 Guarda 30 paquetes de longitud superior a 32 bytes en captures.pcap sin resolución DNS en la interfaz de red eth0
tcpdump -AtuvX icmp Captura el tráfico ICMP e imprime los paquetes ICMP en formato hexadecimal y ASCII y las siguientes características: Con: encabezados, datos, manijas de NFS no decodificadas; Sin: encabezados de nivel de enlace, marcas de tiempo
tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' Muestra todos los paquetes HTTP IPv4 hacia y desde el puerto 80, es decir, imprime solo paquetes que contienen datos, no, por ejemplo, paquetes SYN y FIN y paquetes ACK únicamente

Más apuntes

Invítame a un café con bitcoins:
1QESjZDPxWtZ9sj3v5tvgfFn3ks13AxWVZ

Bitcoins para café
También puedes invitarme a algo para mojar...

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Rellena este campo
Rellena este campo
Por favor, introduce una dirección de correo electrónico válida.
Tienes que aprobar los términos para continuar