tcpdump es una utilidad de línea de comandos que nos permite capturar y analizar el tráfico de red que pasa por nuestro sistema. Dependiendo de las opciones de filtrado, podemos usar esta herramienta para ayudar de manera efectiva a solucionar cualquier tipo de problema de red. Es una herramienta muy utilizada por los ingenieros administradores de sistemas para estas funciones.
En este tutorial, analizaremos algunas de las formas de usar tcpdump , pero no todos. Esto se debe a que simplemente hay demasiadas opciones de filtrado involucradas en este comando, y no es posible cubrirlas todas. Aquí solo veremos algunas de las opciones comúnmente utilizadas. Puede encontrar el resto en la página del manual.
Instalando el comando tcpdump
Puede verificar si su sistema tiene el tcpdump
comando, escribiendo
tcpdump --version
Si el resultado muestra que no está instalado, puede obtenerlo directamente usando el administrador de paquetes de su sistema.
NOTA :Ya que estaremos capturando paquetes, necesitamos permisos elevados. (sudo es requerido). Estaremos prefijando todo tcpdump
comandos con sudo
como resultado.
Lista de interfaces para captura de paquetes
Antes de capturar paquetes de forma activa, veremos las interfaces disponibles para tcpdump
.
Podemos listar las interfaces usando -D (Mostrar) opción.
sudo tcpdump -D

Obtendrá una lista de todas las interfaces disponibles en su máquina. Esto dependerá de un sistema a otro, por lo que el mío tiene otras interfaces como Docker , ya que se está ejecutando el servicio Docker, además de las típicas interfaces de red.
La interfaz especial any permite capturar en cualquier interfaz activa.
Ahora que conocemos las interfaces disponibles en nuestra máquina, ¡comencemos a capturar paquetes!
Capturar paquetes usando tcpdump
Captura todos los paquetes en cualquier interfaz ejecutando este comando:
sudo tcpdump -i any
Esto especificará que la interfaz sea cualquiera , la interfaz especial mencionada anteriormente.
tcpdump continúa capturando paquetes hasta que recibe una interrupción señal. Puede interrumpir la captura presionando Ctrl+C
.
La salida enumerará todas las capturas de paquetes hasta que se recibió la señal de interrupción para terminar tcpdump
.
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:49:32.841984 IP 111.11.111.11.vultr.com.ssh > 123.45.678.90.48006: Flags [P.], seq 4132693749:4132693857, ack 3344962610, win 1002, options [nop,nop,TS val 135269404 ecr 1623818400], length 108 10:49:32.842057 IP 111.11.111.11.vultr.com.ssh > 123.45.678.90.48006: Flags [P.], seq 108:144, ack 1, win 1002, options [nop,nop,TS val 135269404 ecr 1623818400], length 36 10:49:32.842101 IP 111.11.111.11.vultr.com.ssh > 123.45.678.90.48006: Flags [P.], seq 144:260, ack 1, win 1002, options [nop,nop,TS val 135269404 ecr 1623818400], length 116 10:49:32.842135 IP 111.11.111.11.vultr.com.ssh > 123.45.678.90.48006: Flags [P.], seq 260:296, ack 1, win 1002, options [nop,nop,TS val 135269404 ecr 1623818400], length 36 ... ... ^C 264 packets captured 361 packets received by filter 91 packets dropped by kernel
Como puede observar, tcpdump
había capturado 264 paquetes. Por ejemplo, ya que estoy conectado a este servidor usando ssh
, tcpdump capturó todos estos paquetes.
Limitar el número de capturas de paquetes
Para limitar la cantidad de paquetes capturados y detener tcpdump
, use el -c
(límite de captura) opción:
sudo tcpdump -i any -c 2
Esto hará que el comando tcpdump deje de capturar automáticamente después de 2 paquetes. No necesariamente necesitaremos usar la señal de interrupción para terminarlo manualmente en este caso.
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:57:31.284198 IP 111.11.111.11.vultr.com.ssh > 123.45.678.90.48006: Flags [P.], seq 4132754245:4132754353, ack 3344963698, win 1002, options [nop,nop,TS val 135747845 ecr 1624296856], length 108 10:57:31.284275 IP 111.11.111.11.vultr.com.ssh > 123.45.678.90.48006: Flags [P.], seq 108:144, ack 1, win 1002, options [nop,nop,TS val 135747845 ecr 1624296856], length 36 2 packets captured 16 packets received by filter 8 packets dropped by kernel
Esta opción puede ser bastante útil para monitorear las conexiones de red y solucionar cualquier problema, si hay problemas de red.
Desactivar nombre y resolución de puerto
Por defecto, tcpdump El comando resuelve direcciones IP y puertos en nombres (como vultr.com.ssh , que realiza la resolución de nombres a partir de las direcciones IP y los puertos).
Al solucionar problemas de red, a menudo es más fácil usar las direcciones IP y los números de puerto; Podemos deshabilitar la resolución de nombres usando la opción -n
y resolución de puertos con -nn
.
sudo tcpdump -i any -c 2 -nn
El comando anterior captura 2 paquetes en cualquier interfaz y deshabilita la resolución del puerto.
Entonces, la salida ahora detendrá cualquier resolución de nombres y simplemente devolverá las direcciones IP y los números de puerto.
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:00:36.459922 IP 111.11.111.11.22 > 123.45.678.90.48006: Flags [P.], seq 4132755513:4132755621, ack 3344963838, win 1002, options [nop,nop,TS val 135933020 ecr 1624482048], length 108 11:00:36.459982 IP 111.11.111.11.22 > 123.45.678.90.48006: Flags [P.], seq 108:144, ack 1, win 1002, options [nop,nop,TS val 135933020 ecr 1624482048], length 36 2 packets captured 8 packets received by filter 0 packets dropped by kernel
Aquí, examinemos una línea de la salida.
11:00:36.459922 IP 111.11.111.11.22 > 123.45.678.90.48006: Flags [P.], seq 4132755513:4132755621, ack 3344963838, win 1002, options [nop,nop,TS val 135933020 ecr 1624482048], length 108
Este es un TCP típico captura de paquetes Se puede hacer referencia a otros paquetes y formatos de protocolo en la página del manual del comando tcpdump.
El primer campo, 11:00:36.459922 , 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 IPv6
paquetes, el valor es IP6
.
El siguiente campo, 111.11.111.11.22 , es la dirección IP y el puerto de origen. A esto le sigue la dirección IP y el puerto de destino, representado por 123.45.678.90.48006 .
Ahora que sabemos cómo es el formato de salida básico, analicemos algunas opciones de filtrado para tcpdump
Paquetes de filtrado
Uno de tcpdump La característica más poderosa del comando es su capacidad para filtrar los paquetes capturados utilizando una variedad de parámetros, como direcciones IP de origen y destino, puertos, protocolos, etc. Veamos algunos de los más comunes.
Filtro basado en Protocolo
Para filtrar paquetes según el protocolo, debemos especificar el protocolo en el comando.
Para capturar ICMP solo paquetes, podemos filtrar según ICMP protocolo.
sudo tcpdump -i any -c 5 icmp
Desde el ping
el comando usa ICMP paquetes, podemos analizar los paquetes entrantes debido a ping
desde otra máquina.
Hagamos ping a nuestra máquina actual y capturemos los paquetes de ping entrantes.
Abra una sesión de terminal en otra máquina y escriba
ping IP_ADDRESS_MACHINE_1
Ahora, en nuestro tcpdump
sesión de terminal, ahora podemos ver que captura esos paquetes de respuesta de ping ICMP.
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:18:47.947475 IP 123.45.678.90 > 111.11.111.11.vultr.com: ICMP echo request, id 6068, seq 1, length 64 11:18:47.947554 IP 111.11.111.11.vultr.com > 123.45.678.90: ICMP echo reply, id 6068, seq 1, length 64 11:18:48.947669 IP 123.45.678.90 > 111.11.111.11.vultr.com: ICMP echo request, id 6068, seq 2, length 64 11:18:48.947752 IP 111.11.111.11.vultr.com > 123.45.678.90: ICMP echo reply, id 6068, seq 2, length 64 11:18:49.947853 IP 123.45.678.90 > 111.11.111.11.vultr.com: ICMP echo request, id 6068, seq 3, length 64 5 packets captured 6 packets received by filter 0 packets dropped by kernel
Aquí, 123.45.678.90 es la dirección IP de la máquina (Máquina 2) que envía ping a nuestro tcpdump
sistema y 111.11.111.11 es la dirección IP de la máquina de filtrado de paquetes (Máquina 1).
Desde que estaba usando ssh
para enviar las solicitudes de ping, hay una resolución de dominio (pero no una resolución de nombre) a vultr.com
.
Filtro basado en Host
Para limitar la captura a solo paquetes relacionados con un host específico, podemos usar el host
filtrar
sudo tcpdump -i any -c5 -nn host 192.168.1.2
En este ejemplo, tcpdump captura y muestra solo paquetes hacia y desde el host 192.168.1.2
.
Filtro basado en Puerto
Para filtrar paquetes según el servicio o puerto deseado, use el port
filtrar. Por ejemplo, capture paquetes relacionados con una sesión ssh usando este comando (puerto 22 filtrado):
sudo tcpdump -i any -c5 -nn port 22
Filtro basado en IP de origen/nombre de host
También puede filtrar paquetes según la dirección IP o el nombre de host de origen o destino. Por ejemplo, para capturar paquetes del host 192.168.1.2
sudo tcpdump -i any -c 5 -nn src 192.168.1.2
Podemos usar dst
para filtrar también por IP de destino/nombre de host.
sudo tcpdump -i any -c 5 -nn src 172.168.1.2
Guardar capturas de paquetes
Podemos guardar los resultados de las capturas de paquetes en un archivo para su posterior análisis.
Para guardar paquetes en un archivo en lugar de mostrarlos en la pantalla, use la opción -w
:
sudo tcpdump -i any -c 5 -nn -w sample.pcap port 22
Este comando guarda la salida en un archivo llamado sample.pcap
. El .pcap
la extensión significa "captura de paquetes" y es la convención para este formato de archivo.
Conclusión
En este tutorial, aprendimos cómo podríamos realizar la captura y el filtrado de paquetes en función de diferentes opciones, utilizando el tcpdump
comando.