tcpdumpes 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 tcpdumpcomando 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 tcpdumpcomando en Linux.

Instalandotcpdump

tcpdumpse instala de forma predeterminada en la mayoría de las distribuciones de Linux y macOS. Para verificar si el tcpdumpcomando 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 tcpdumpno está presente en su sistema, el comando anterior imprimirá "tcpdump: comando no encontrado". Puede instalarlo fácilmente tcpdumpusando el administrador de paquetes de su distribución.

Instalación tcpdumpen Ubuntu y Debian

sudo apt update && sudo apt install tcpdump

Instalación tcpdumpen CentOS y Fedora

sudo yum install tcpdump

Instalación tcpdumpen Arch Linux

sudo pacman -S tcpdump

Captura de paquetes contcpdump

La sintaxis general del tcpdumpcomando es la siguiente:

tcpdump [options] [expression]
  • El comando optionsle permite controlar el comportamiento del comando.
  • El filtro expressiondefine qué paquetes serán capturados.

Solo se puede ejecutar root o usuario con sudo privilegios tcpdumpSi 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 tcpdumpsin 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

tcpdumpcontinuará capturando paquetes y escribiendo en la salida estándar hasta que reciba una señal de interrupción. Use la Ctrl+Ccombinación de teclas para enviar una señal de interrupción y detener el comando.

Para una salida más detallada, pase la -vopción, o -vvpara una salida aún más detallada:

sudo tcpdump -vv

Puede especificar la cantidad de paquetes que se capturarán usando la -copción. Por ejemplo, para capturar solo diez paquetes, escribiría:

sudo tcpdump -c 10

Después de capturar los paquetes, tcpdumpse detendrá.

Cuando no se especifica ninguna interfaz, tcpdumputiliza la primera interfaz que encuentra y descarga todos los paquetes que pasan por esa interfaz.

Utilice la -Dopció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 ens3es la primera interfaz encontrada tcpdumpy utilizada cuando no se proporciona ninguna interfaz al comando. La segunda interfaz anyes 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 -iopció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 anyinterfaz:

sudo tcpdump -i any

De forma predeterminada, tcpdumprealiza una resolución DNS inversa en las direcciones IP y traduce los números de puerto en nombres. Use la -nopció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 >>>:

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 -lopción en el comando anterior indica tcpdumpque 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 tcpdumpsalida

tcpdumpgenera 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, donde fracson 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 la first:lastnotació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 es 201747193:201747301, lo que significa que este paquete contiene los bytes 201747193 a 201747301 del flujo de datos. Utilice la -Sopción para imprimir números de secuencia absolutos.

  • ack 1226568763El 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 vales una marca de tiempo TCP y ecrrepresenta 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

tcpdumpfiltros

Cuando tcpdumpse 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 tcpdumpcomando. 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.

tcpdumputiliza 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 protocalificador, 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 hostcalificador:

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 netcalificador. Por ejemplo, para volcar solo los paquetes relacionados con 10.10.0.0/16usted, 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 portcalificador. El siguiente comando captura paquetes relacionados con el servicio SSH (puerto 22) usando este comando:

sudo tcpdump -n port 23

El portrangecalificador 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 srcdstsrc and dsty .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.

tcpdumple permite imprimir el contenido de los paquetes en ASCII y HEX.

La -Aopción dice tcpdumpimprimir cada paquete en ASCII y -xen HEX:

sudo tcpdump -n -A

Para mostrar el contenido del paquete tanto en HEX como en ASCII, use la -Xopción:

sudo tcpdump -n -X

Leer y escribir capturas en un archivo

Otra característica útil de tcpdumpes 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 -wopció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.pcapPuede nombrar el archivo como desee, pero es una convención común usar la .pcapextensión (captura de paquetes).

Cuando -wse utiliza la opción, la salida no se muestra en la pantalla. tcpdumpescribe 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 tcpdumpcon la -ropción:

sudo tcpdump -r data.pcap

Si desea ejecutar tcpdumpen 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. tcpdumple 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.pcap0file.pcap1y 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 tcpdumpdurante la resolución de problemas.

Si desea comenzar tcpdumpen un momento específico, puede usar un cronjobtcpdumpno tiene una opción para salir después de un tiempo determinado. Puede usar el timeout comando para detenerse tcpdumpdespué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

tcpdumpes 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 tcpdumpuso 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.