Introducción
tcpdump
es una utilidad de línea de comandos que puede utilizar para capturar e inspeccionar el tráfico de red hacia y desde el sistema. Es la herramienta más utilizada por los administradores de red para la resolución de problemas de red y las pruebas de seguridad.
A pesar del nombre, con tcpdump
, también es posible capturar tráfico no TCP como UDP, ARP o ICMP. Los paquetes capturados se pueden escribir en un archivo o en una salida estándar. Una de las características más poderosas del tcpdump
es su capacidad para usar filtros y capturar solo los datos que desea analizar.
En este artículo, cubriremos los conceptos básicos de cómo usar el tcpdump
en Linux.
Si desea instalar Tcpdump en un servidor remoto, continúe leyendo, de lo contrario omita el primer párrafo "Conectando al servidor" y lea el siguiente.
Conexión al servidor
Para acceder al servidor, necesita conocer la dirección IP. También necesitará su nombre de usuario y contraseña para la autenticación. Para conectarse al servidor como root, escriba el siguiente comando:
ssh root@IP_DEL_SERVER
A continuación, deberá ingresar la contraseña del usuario root.
Si no está utilizando el usuario root, puede iniciar sesión con otro nombre de usuario utilizando el mismo comando, luego cambie root a su nombre de usuario:
ssh nome_utente@IP_DEL_SERVER
Luego se le pedirá que ingrese su contraseña de usuario.
El puerto estándar para conectarse a través de ssh es 22, si su servidor usa un puerto diferente, deberá especificarlo usando el parámetro -p, luego escriba el siguiente comando:
ssh nome_utente@IP_DEL_SERVER -p PORTA
Instalar Tcpdump
tcpdump
se instala de forma predeterminada en la mayoría de las distribuciones de Linux y macOS. Para verificar si el tcpdump
está disponible en su tipo de sistema, use el siguiente comando:
tcpdump --version
Si tcpdump
no está presente en su sistema, el comando anterior imprimirá "tcpdump: comando no encontrado". Puede instalar tcpdump
fácilmente usando el administrador de paquetes de su distribución.
Instale Tcpdump en Ubuntu y Debian
sudo apt update && sudo apt install tcpdump
Instale Tcpdump en CentOS y Fedora
sudo yum install tcpdump
Instalar Tcpdump en Arch Linux
sudo pacman -S tcpdump
Luego verifique la instalación correcta con el siguiente comando:
tcpdump --version
La salida debería verse así:
tcpdump version 4.9.3
libpcap version 1.8.1
OpenSSL 1.1.1d 10 Sep 2019
Adquirir paquetes con tcpdump
La sintaxis general del tcpdump
es la siguiente:
tcpdump [options] [expression]
- El
options
permite controlar el comportamiento del comando. - El
expression
define qué paquetes se capturarán.
El tcpdump
solo puede ser ejecutado por root o por usuarios con privilegios sudo
Si intenta ejecutar el comando como un usuario sin privilegios, recibirá un mensaje de error: "No tiene permiso para capturar en ese dispositivo".
El caso de uso más simple es invocar tcpdump
sin opciones ni filtros:
sudo tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
21:28:50.627720 IP static.78.18.201.195.clients.your-server.de.ssh > 2-226-134-97.ip181.domain.it.65328: Flags [P.], seq 3036272519:3036272647, ack 288322885, win 1452, length 128
21:28:50.627782 IP static.78.18.201.195.clients.your-server.de.ssh > 2-226-134-97.ip181.domain.it.65328: Flags [P.], seq 128:192, ack 1, win 1452, length 64
21:28:50.627823 IP static.78.18.201.195.clients.your-server.de.ssh > 2-226-134-97.ip181.domain.it.65328: Flags [P.], seq 192:320, ack 1, win 1452, length 128
21:28:50.627863 IP static.78.18.201.195.clients.your-server.de.ssh > 2-226-134-97.ip181.domain.it.65328: Flags [P.], seq 320:384, ack 1, win 1452, length 64...
29 packets captured
45 packets received by filter
10 packets dropped by kernel
tcpdump
continuará capturando paquetes y escribiendo en la salida estándar hasta que reciba una señal de interrupción. Utilice la combinación de Ctrl+C
para enviar una señal de interrupción y abortar el comando.
Para obtener resultados más detallados, use la -v
o -vv
para obtener resultados aún más detallados:
sudo tcpdump -vv
Puede especificar el número de paquetes a capturar usando la opción -c
Por ejemplo, para capturar solo diez paquetes, escriba:
sudo tcpdump -c 10
Después de capturar los paquetes, tcpdump
se detendrá.
Cuando no se especifica una interfaz, tcpdump
usa la primera interfaz que encuentra y descarga todos los paquetes que pasan por esa interfaz.
Utilice la -D
para imprimir una lista de todas las interfaces de red disponibles de las que tcpdump puede recopilar paquetes:
sudo tcpdump -D
Para cada interfaz, el comando imprime el nombre de la interfaz, una breve descripción y un índice asociado (número):
1.eth0 [Up, Running]
2.any (Pseudo-device that captures on all interfaces) [Up, Running]
3.lo [Up, Running, Loopback]
4.nflog (Linux netfilter log (NFLOG) interface)
5.nfqueue (Linux netfilter queue (NFQUEUE) interface)
6.usbmon1 (USB bus number 1)
7.usbmon2 (USB bus number 2)
El resultado anterior muestra que eth0
es la primera interfaz encontrada y utilizada por tcpdump
cuando no se proporciona ninguna interfaz al comando. La segunda, any
interfaz, es un dispositivo especial que le permite capturar todas las interfaces activas.
Para especificar la interfaz en la que desea capturar el tráfico, invoque el comando con la -i
seguida del nombre de la interfaz o el índice asociado. Por ejemplo, para obtener todos los paquetes de todas las interfaces, debe especificar la interfaz any
sudo tcpdump -i any
De forma predeterminada, tcpdump
realiza una resolución DNS inversa en direcciones IP y traduce los números de puerto en nombres. Use la -n
para deshabilitar la traducción:
sudo tcpdump -n
Omitir la búsqueda de DNS evita generar tráfico de DNS y hace que la salida sea más legible. Se recomienda que utilice esta opción siempre que invoque tcpdump
.
En lugar de mostrar la salida en la pantalla, puede redirigirla a un archivo usando los operadores de redirección >
y >>
sudo tcpdump -n -i any > file.out
También puede mirar los datos mientras los guarda en un archivo usando el comando tee
sudo tcpdump -n -l | tee file.out
La -l
en el comando anterior permite a tcpdump
almacenar en búfer la línea de salida. Cuando no se utiliza esta opción, la salida no se escribirá en la pantalla cuando se genere una nueva línea.
Comprender la salida de tcpdump
tcpdump
genera información para cada paquete capturado en una nueva línea. Cada línea incluye una marca de tiempo e información sobre ese paquete, según el protocolo.
El formato típico de una línea de protocolo TCP es el siguiente:
[Timestamp] [Protocol] [Src IP].[Src Port] > [Dst IP].[Dst Port]: [Flags], [Seq], [Ack], [Win Size], [Options], [Data Length]
Vamos campo por campo y explicamos la siguiente línea:
15:47:24.248737 IP 192.168.1.27.22 > 192.168.1.15.37445: Flags [P.], seq 201747193:201747301, ack 1226568763, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 108
15:47:24.248737
marca de tiempo del paquete capturado está en la hora local y utiliza el siguiente formato:,hours:minutes:seconds.frac
dondefrac
son fracciones de segundo desde la medianoche.IP
: el protocolo del paquete. En este caso, IP significa Protocolo de Internet versión 4 (IPv4).192.168.1.27.22
: la dirección IP de origen y el puerto separados por un punto (.
).192.168.1.15.37445
: la dirección IP de destino y el puerto separados por un punto (.
).
Flags [P.]
- Campo de bandera de TCP. En este ejemplo, [P.]
significa paquete de confirmación de inserción, que se utiliza para reconocer el paquete anterior y enviar datos. Otros valores típicos de los campos de bandera son los siguientes:
- [.] - ACK (reconocimiento)
- [S] - SYN (Iniciar conexión)
- [P] - PSH (datos de inserción)
- [F] - FIN (Terminar conexión)
- [R] - RST (restablecer conexión)
- [S.] - SYN-ACK (paquete SynAcK)
seq 201747193:201747301
- El número secuencial está en lafirst:last
notación. Muestra la cantidad de datos contenidos en el paquete. Excepto por el primer paquete en el flujo de datos donde estos números son absolutos, todos los paquetes subsiguientes se usan como posiciones relativas de bytes. En este ejemplo, el número es201747193:201747301
, lo que significa que este paquete contiene bytes de 201747193 a 201747301 del flujo de datos. Utilice la-S
para imprimir números de secuencia absolutos.ack 1226568763
El número de acuse de recibo es el número progresivo de los datos posteriores que se esperan del otro extremo de esta conexión.win 402
: el número de ventana es el número de bytes disponibles en el búfer de recepción.options [nop,nop,TS val 1051794587 ecr 2679218230]
- Opciones de TCP.nop
o "sin operación" se utiliza para hacer que el encabezado TCP sea múltiplo de 4 bytes.TS val
es una marca de tiempo de TCP yecr
representa una respuesta de eco. Visite la documentación de IANA para obtener más información sobre las opciones de TCP.length 108
- La longitud de los datos de carga útil
Filtros tcpdump
Cuando tcpdump
se invoca sin filtrar, captura todo el tráfico y produce una gran cantidad de resultados, lo que dificulta la búsqueda y el análisis de paquetes de interés.
Los filtros son una de las características más poderosas del comando tcpdump
Le permiten capturar solo aquellos paquetes que coinciden con la expresión. Por ejemplo, al solucionar problemas de un servidor web, puede utilizar filtros para obtener solo tráfico HTTP.
tcpdump
usa la sintaxis de Berkeley Packet Filter (BPF) para filtrar los paquetes capturados usando varios parámetros de procesamiento como protocolos, direcciones IP de origen y destino y puertos, etc.
En este artículo, veremos algunos de los filtros más comunes. Para obtener una lista de todos los filtros disponibles, consulte la página de manual de pcap-filter.
Filtrar por protocolo
Para limitar la adquisición a un protocolo en particular, especifique el protocolo como filtro. Por ejemplo, para capturar tráfico UDP solo debe usar:
sudo tcpdump -n udp
Otra forma de definir el protocolo es utilizar el proto
, seguido del número de protocolo. El siguiente comando filtrará el protocolo número 17 y producirá el mismo resultado que el anterior:
sudo tcpdump -n proto 17
Para obtener más información sobre los números, consulte la lista de números de protocolo IP.
Filtrar por host
Para capturar solo los paquetes relacionados con un host específico, use el parámetro de host
sudo tcpdump -n host 192.168.1.22
El host puede ser una dirección IP o un nombre.
También puede filtrar la salida en un rango de IP particular usando el parámetro net
Por ejemplo, para volcar solo los paquetes relacionados 10.10.0.0/16
, debe usar:
sudo tcpdump -n net 10.10
Filtro de puerta
Para limitar la captura a solo paquetes hacia o desde un puerto específico, use el parámetro de port
El siguiente comando adquiere paquetes relacionados con el servicio SSH (puerto 22) usando este comando:
sudo tcpdump -n port 22
El portrange
permite capturar tráfico en una serie de puertos:
sudo tcpdump -n portrange 110-150
Filtrar por origen y destino
También puede filtrar paquetes por puerto o host de origen o destino utilizando los parámetros src
, dst
, src and dst
y src or dst
El siguiente comando adquiere paquetes del host con IP 192.168.1.22:
sudo tcpdump -n src host 192.168.1.22
Para encontrar el tráfico de cualquier fuente al puerto 80, deberá utilizar:
sudo tcpdump -n dst port 80
Filtros complejos
Los filtros se pueden combinar utilizando los &&
and
(&&), or
(