tcpdump
es una utilidad de línea de comandos que puede usar para capturar e inspeccionar el tráfico de red que va y viene de su sistema. Es la herramienta más utilizada entre los administradores de red para solucionar problemas de red y realizar pruebas de seguridad.
A pesar de su nombre, con tcpdump
, también puede capturar tráfico que no sea TCP, como UDP, ARP o ICMP. Los paquetes capturados se pueden escribir en un archivo o salida estándar. Una de las características más poderosas del tcpdump
comando 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
comando en Linux.
Instalandotcpdump
tcpdump
se instala de forma predeterminada en la mayoría de las distribuciones de Linux y macOS. Para verificar si el tcpdump
comando está disponible en su tipo de sistema:
tcpdump --version
La salida debería ser algo como esto:
tcpdump version 4.9.2
libpcap version 1.8.1
OpenSSL 1.1.1b 26 Feb 2019
Si tcpdump
no está presente en su sistema, el comando anterior imprimirá "tcpdump: comando no encontrado". Puede instalarlo fácilmente tcpdump
usando el administrador de paquetes de su distribución.
Instalación tcpdump
en Ubuntu y Debian
sudo apt update && sudo apt install tcpdump
Instalación tcpdump
en CentOS y Fedora
sudo yum install tcpdump
Instalación tcpdump
en Arch Linux
sudo pacman -S tcpdump
Captura de paquetes contcpdump
La sintaxis general del tcpdump
comando es la siguiente:
tcpdump [options] [expression]
- El comando
options
le permite controlar el comportamiento del comando. - El filtro
expression
define qué paquetes serán capturados.
Solo se puede ejecutar root o usuario con sudo
privilegios tcpdump
. Si intenta ejecutar el comando como un usuario sin privilegios, obtendrá un error que dice: "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 ens3, link-type EN10MB (Ethernet), capture size 262144 bytes
15:47:24.248737 IP linuxize-host.ssh > desktop-machine.39196: Flags [P.], seq 201747193:201747301, ack 1226568763, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 108
15:47:24.248785 IP linuxize-host.ssh > desktop-machine.39196: Flags [P.], seq 108:144, ack 1, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 36
15:47:24.248828 IP linuxize-host.ssh > desktop-machine.39196: Flags [P.], seq 144:252, ack 1, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 108
... Long output suppressed
23116 packets captured
23300 packets received by filter
184 packets dropped by kernel
tcpdump
continuará capturando paquetes y escribiendo en la salida estándar hasta que reciba una señal de interrupción. Use la Ctrl+C
combinación de teclas para enviar una señal de interrupción y detener el comando.
Para una salida más detallada, pase la -v
opción, o -vv
para una salida aún más detallada:
sudo tcpdump -vv
Puede especificar la cantidad de paquetes que se capturarán usando la -c
opción. Por ejemplo, para capturar solo diez paquetes, escribiría:
sudo tcpdump -c 10
Después de capturar los paquetes, tcpdump
se detendrá.
Cuando no se especifica ninguna interfaz, tcpdump
utiliza la primera interfaz que encuentra y descarga todos los paquetes que pasan por esa interfaz.
Utilice la -D
opción 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.ens3 [Up, Running]
2.any (Pseudo-device that captures on all interfaces) [Up, Running]
3.lo [Up, Running, Loopback]
El resultado anterior muestra que ens3
es la primera interfaz encontrada tcpdump
y utilizada cuando no se proporciona ninguna interfaz al comando. La segunda interfaz any
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
opción seguida del nombre de la interfaz o el índice asociado. Por ejemplo, para capturar todos los paquetes de todas las interfaces, especificaría la any
interfaz:
sudo tcpdump -i any
De forma predeterminada, tcpdump
realiza una resolución DNS inversa en las direcciones IP y traduce los números de puerto en nombres. Use la -n
opció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 usar esta opción siempre que invoque tcpdump
.
En lugar de mostrar el resultado en la pantalla, puede redirigirlo a un archivo utilizando los operadores de redirección >
y >>
:
sudo tcpdump -n -i any > file.out
También puede ver los datos mientras los guarda en un archivo usando el tee
comando:
sudo tcpdump -n -l | tee file.out
La -l
opción en el comando anterior indica tcpdump
que la línea de salida se almacene en búfer. Cuando no se usa esta opción, la salida no se escribirá en la pantalla cuando se genere una nueva línea.
Comprender la tcpdump
salida
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]
Vayamos campo por campo y expliquemos la siguiente línea:
15:47:24.248737 IP 192.168.1.185.22 > 192.168.1.150.37445: Flags [P.], seq 201747193:201747301, ack 1226568763, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 108
15:47:24.248737
- La marca de tiempo del paquete capturado está en hora local y utiliza el siguiente formato:hours:minutes:seconds.frac
, dondefrac
son fracciones de segundo desde la medianoche.IP
- El protocolo de paquetes. En este caso, IP significa la versión 4 del protocolo de Internet (IPv4).192.168.1.185.22
- La dirección IP y el puerto de origen, separados por un punto (.
).192.168.1.150.37445
- La dirección IP y el puerto de destino, separados por un punto (.
).Flags [P.]
- Campo Indicadores TCP. En este ejemplo,[P.]
significa paquete de reconocimiento de inserción, que se utiliza para reconocer el paquete anterior y enviar datos. Otros valores típicos de campo de marca son los siguientes:- [.] - ACK (Reconocimiento)
- [S] - SYN (Iniciar conexión)
- [P] - PSH (datos de inserción)
- [F] - FIN (Finalizar conexión)
- [R] - RST (Restablecer conexión)
- [S.] - SYN-ACK (paquete SynAcK)
seq 201747193:201747301
- El número de secuencia está en lafirst:last
notación. Muestra el número 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 posteriores se usan como posiciones de bytes relativas. En este ejemplo, el número es201747193:201747301
, lo que significa que este paquete contiene los bytes 201747193 a 201747301 del flujo de datos. Utilice la-S
opción para imprimir números de secuencia absolutos.ack 1226568763
El número de reconocimiento es el número de secuencia de los siguientes datos esperados por el 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" es el relleno utilizado para hacer que el encabezado TCP sea múltiplo de 4 bytes.TS val
es una marca de tiempo TCP yecr
representa una respuesta de eco. Visite la documentación de la IANA para obtener más información sobre las opciones de TCP.length 108
- La longitud de los datos de carga útil
tcpdump
filtros
Cuando tcpdump
se invoca sin filtros, captura todo el tráfico y produce una gran cantidad de resultados que dificultan la búsqueda y el análisis de los paquetes de interés.
Los filtros son una de las características más poderosas del tcpdump
comando. Ya que le permiten capturar solo aquellos paquetes que coincidan con la expresión. Por ejemplo, al solucionar problemas relacionados con un servidor web, puede usar filtros para obtener solo el tráfico HTTP.
tcpdump
utiliza la sintaxis de Berkeley Packet Filter (BPF) para filtrar los paquetes capturados utilizando varios parámetros de mecanizado, como protocolos, direcciones IP y puertos de origen y destino, 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 .
Filtrado por Protocolo
Para restringir la captura a un protocolo en particular, especifique el protocolo como filtro. Por ejemplo, para capturar solo el tráfico UDP, ejecutaría:
sudo tcpdump -n udp
Otra forma de definir el protocolo es utilizar el proto
calificador, 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.
Filtrado por anfitrión
Para capturar solo paquetes relacionados con un host específico, use el host
calificador:
sudo tcpdump -n host 192.168.1.185
El host puede ser una dirección IP o un nombre.
También puede filtrar la salida a un rango de IP dado usando el net
calificador. Por ejemplo, para volcar solo los paquetes relacionados con 10.10.0.0/16
usted, usaría:
sudo tcpdump -n net 10.10
Filtrado por puerto
Para limitar la captura solo a paquetes desde o hacia un puerto específico, use el port
calificador. El siguiente comando captura paquetes relacionados con el servicio SSH (puerto 22) usando este comando:
sudo tcpdump -n port 23
El portrange
calificador le permite capturar tráfico en una variedad de puertos:
sudo tcpdump -n portrange 110-150
Filtrado por Origen y Destino
También puede filtrar paquetes en función del puerto o host de origen o destino mediante los calificadores are src
, dst
, src and dst
y .src or dst
El siguiente comando captura los paquetes entrantes de un host con IP 192.168.1.185:
sudo tcpdump -n src host 192.168.1.185
Para encontrar el tráfico proveniente de cualquier fuente al puerto 80, usaría:
sudo tcpdump -n dst port 80
Filtros complejos
Los filtros se pueden combinar usando los operadores and
( &&
), or
( ||
) y not
( ).!
Por ejemplo, para capturar todo el tráfico HTTP proveniente de una dirección IP de origen 192.168.1.185, usaría este comando:
sudo tcpdump -n src 192.168.1.185 and tcp port 80
También puede usar paréntesis para agrupar y crear filtros más complejos:
sudo tcpdump -n 'host 192.168.1.185 and (tcp port 80 or tcp port 443)'
Para evitar errores de análisis al usar caracteres especiales, encierre los filtros entre comillas simples.
Aquí hay otro comando de ejemplo para capturar todo el tráfico excepto SSH desde una dirección IP de origen 192.168.1.185:
sudo tcpdump -n src 192.168.1.185 and not dst port 22
Inspección de paquetes
De forma predeterminada tcpdump
, captura solo los encabezados de los paquetes. Sin embargo, a veces es posible que necesite inspeccionar el contenido de los paquetes.
tcpdump
le permite imprimir el contenido de los paquetes en ASCII y HEX.
La -A
opción dice tcpdump
imprimir cada paquete en ASCII y -x
en HEX:
sudo tcpdump -n -A
Para mostrar el contenido del paquete tanto en HEX como en ASCII, use la -X
opción:
sudo tcpdump -n -X
Leer y escribir capturas en un archivo
Otra característica útil de tcpdump
es escribir los paquetes en un archivo. Esto es útil cuando está capturando una gran cantidad de paquetes o capturando paquetes para su posterior análisis.
Para comenzar a escribir en un archivo, use la -w
opción seguida del archivo de captura de salida:
sudo tcpdump -n -w data.pcap
Este comando anterior guardará la captura en un archivo llamado data.pcap
. Puede nombrar el archivo como desee, pero es una convención común usar la .pcap
extensión (captura de paquetes).
Cuando -w
se utiliza la opción, la salida no se muestra en la pantalla. tcpdump
escribe paquetes sin procesar y crea un archivo binario que no se puede leer con un editor de texto normal.
Para inspeccionar el contenido del archivo, invoque tcpdump
con la -r
opción:
sudo tcpdump -r data.pcap
Si desea ejecutar tcpdump
en segundo plano, agregue el símbolo de y comercial ( &
) al final del comando.
El archivo de captura también se puede inspeccionar con otras herramientas de análisis de paquetes, como Wireshark.
Al capturar paquetes durante un largo período de tiempo, puede habilitar la rotación de archivos. tcpdump
le permite crear nuevos archivos y rotar el archivo de volcado en un intervalo de tiempo específico o tamaño fijo. El siguiente comando creará hasta diez archivos de 200 MB, denominados file.pcap0
, file.pcap1
y así sucesivamente: antes de sobrescribir los archivos más antiguos.
sudo tcpdump -n -W 10 -C 200 -w /tmp/file.pcap
Una vez que se generan diez archivos, se sobrescribirán los archivos más antiguos.
Tenga en cuenta que solo debe ejecutarlo tcpdump
durante la resolución de problemas.
Si desea comenzar tcpdump
en un momento específico, puede usar un cronjob. tcpdump
no tiene una opción para salir después de un tiempo determinado. Puede usar el timeout
comando para detenerse tcpdump
después de un tiempo. Por ejemplo, para salir después de 5 minutos, usaría:
sudo timeout 300 tcpdump -n -w data.pcap
Conclusión
tcpdump
es una herramienta de línea de comandos para analizar y solucionar problemas relacionados con la red.
Este artículo le presentó los conceptos básicos de tcpdump
uso y sintaxis. Para obtener documentación más detallada, visite el sitio web de tcpdump.
Si tiene alguna pregunta o comentario, no dude en dejar un comentario.
0 Comentarios