La utilidad tcpdump es una de las herramientas de línea de comandos populares para el monitoreo de redes en Linux. Ayuda a depurar el tráfico de red y auditarlo. Como su nombre indica, tcpdump intercepta paquetes TCP (Protocolo de Control de Transmisión) y muestra o guarda en un archivo un conjunto de datos adecuado para su análisis, volcado. Dichos analizadores de tráfico de red se denominan rastreadores.

A pesar de su relativa simplicidad y naturaleza poco exigente, este programa tiene una amplia gama de características. Tcpdump puede ayudar a detectar tráfico malicioso, detectar un intento de entrada no autorizada, determinar una posible fuga de datos o lanzar un ataque DDoS, y mucho más. Por separado, observamos que tcpdump se puede ejecutar en servidores remotos donde no hay un shell gráfico.

Instalación de tcpdump

El programa tcpdump está incluido en todas las principales distribuciones de Linux, lo que hace que el proceso de instalación sea lo más fácil posible.

En la familia Debian/Ubuntu, basta con ejecutar el comando en la terminal:

# apt update && apt install tcpdump

En CentOS / Fedora, el comando de instalación se ve así:

# dnf install tcpdump

Sintaxis de tcpdump

La sintaxis general del comando tcpdump se ve así:

# tcpdump [-i network_interface name] [parameters] [filters]

En el caso más simple, puede interceptar todo el tráfico de red ejecutando el comando tcpdump sin parámetros en nombre del superusuario. Sin embargo, si queremos analizar los paquetes que pasan a través de una interfaz de red específica (adaptador), podemos usar la opción-i. El nombre de las interfaces disponibles se puede encontrar con el comando «tcpdump-D»:

si omite el parámetro opcional-i, se utilizará la interfaz predeterminada (por regla general, este es el primer adaptador de la lista). Por lo tanto, es mejor especificar siempre la interfaz explícitamente, por ejemplo, «tcpdump-i ens3». Como resultado de ejecutar este comando, obtendremos una lista de encabezados de paquetes de esta forma:

Si necesita una salida más detallada, puede agregar los parámetros-v, – vv o-vvv al comando. Esto le permitirá obtener, por ejemplo, la duración, el identificador, la longitud total y otros parámetros del paquete.

Otros parámetros útiles:

  • q-genera un mínimo de información.
  • n-no utilice nombres y servicios de host. De forma predeterminada, tcpdump intenta convertir (resolver) direcciones IP en nombres de dominio y números de puerto en nombres de servicio. La opción-nn también deshabilitará la conversión de puertos. Esta función se puede utilizar para reducir el tráfico de red durante la depuración de la red al eliminar llamadas adicionales al Sistema de Nombres de Dominio (DNS).
  • a-Convertir direcciones de difusión en nombres de dominio.
  • tttt: use la salida de marcas de tiempo con una fecha (de forma predeterminada, solo se emite la marca de tiempo Unix).
  • t – no muestre la marca de tiempo en cada fila.
  • c-limite el conjunto de líneas en el volcado al número especificado.
  • w-escribe la salida en un archivo. Discutiremos esta posibilidad en detalle más adelante.
  • Z es el usuario en cuyo nombre se está escribiendo el archivo (de forma predeterminada, el guardado se realiza en nombre del usuario de tcpdump).

Puede obtener más información sobre todos los parámetros en la página de tcpdump en la documentación oficial o llamando a la página de ayuda con el comando «man tcpdump».

Captura de paquetes con tcpdump

En esta captura de pantalla, podemos ver que tcpdump interceptó 5 paquetes TCP/IP que pasaban por la interfaz de red ens3 y mostraba cada uno en una línea separada. Tenga en cuenta que la captura continuará hasta que presionemos Ctrl + C o se alcance el número de líneas especificado en el parámetro-c.

Comprensión de la salida de tcpdump

Por ejemplo, veamos una de las líneas de salida de tcpdump.:

09:10:56.157002 IP debian.48464 > example.com.http: Flags [S], seq 4254890747, win 64240, options [mss 1460,sackOK,TS val 1993676504 ecr 0,nop,wscale 7], length 0

En esta línea vemos:

  1. La marca de tiempo Unix es 09: 10: 56.157002 (la hora exacta en que se capturó el paquete). Tenga en cuenta que cuando se usa el parámetro-tttt, también se mostrará la fecha de captura.
  2. El protocolo es IP. En esta línea se ejecutó una solicitud http a la página web. La utilidad también puede generar paquetes transmitidos, por ejemplo, a través de udp, icmp, ip6,etc.
  3. La dirección IP o el nombre de host y el número de puerto del remitente del paquete es debian.48464 (aquí tcpdump convirtió la dirección IP local en 10.0.2.15 al nombre «debian»).
  4. El nombre de host o la dirección IP y el número de puerto del destinatario del paquete — firstvds.ru .http (http en este caso significa una solicitud al puerto 80).
  5. El indicador TCP es Flags [S] (S es la abreviatura de SYN, que significa el comienzo de una conexión). Puede haber varios indicadores, por ejemplo, [F.] significa cerrar la conexión (FIN) y confirmar el paquete recibido (dot).
  6. El número de secuencia absoluto de los datos en el paquete es seq 4254890747.
  7. El tamaño de la ventana es win 64240 (este es solo el número de bytes en el búfer de recepción).
  8. Parámetros TCP-options []].
  9. La longitud de la carga útil es la longitud 0. Se considera que la carga útil son los datos transmitidos en el paquete. Dado que en este caso se ejecuta una solicitud de inicio de conexión (SYN), no hay datos en el paquete.

Nuestro ejemplo muestra un acceso exitoso a una página web, no hay problemas con la transmisión de paquetes.

Filtrado de paquetes

En los ejemplos anteriores, no usamos filtros, por lo que tcpdump mostró los encabezados de todos los paquetes que pasaron a través de la interfaz de red seleccionada. Realmente parece un basurero. Pero si sabemos qué información específica queremos obtener, podemos borrar fácilmente la salida de basura innecesaria utilizando parámetros adicionales. Para hacer esto, la utilidad proporciona herramientas de filtrado convenientes.:

Según el protocolo. Puede monitorear tcp, udp, icmp, ip, ip6, arp y otros paquetes por separado especificando el nombre del protocolo en el comando. Por ejemplo, «tcpdump-i ens3 tcp» generará solo paquetes TCP.:

Por dirección IP, nombre de host o dirección física (MAC). Para mostrar información sobre un solo host, debe especificar su dirección IP o nombre después de la palabra clave «host», por ejemplo, » tcpdump-i ens3 host example.com «:

Por puerto o rango de puertos. Por ejemplo, para interceptar paquetes que llegan solo al puerto 80 (http), debe agregar el parámetro «puerto 80» :

Por remitente (src) o destinatario (dst). Por ejemplo, » tcpdump-i ens3 dst example.com «:

Por supuesto, si necesitamos un aislamiento de paquetes más preciso, se pueden combinar filtros. Los operadores lógicos Y ( & & ), O ( | | ) y NO (!) se utilizan para esto.

Por ejemplo, «tcpdump-i ens3 src 10.0.2.15 y puerto dst 80» solo generará llamadas desde la dirección IP local a cualquier host en el puerto 80.:

Para excluir protocolos innecesarios, por ejemplo, ICMP, puede agregar el parámetro «no icmp» :

# tcpdump -i ens3 not icmp

Si necesita reglas de filtrado más complejas, puede usar paréntesis para priorizarlas. También puede utilizar filtros adicionales.:

red para filtrar por subred,

menor o mayor para limitar el tamaño de los paquetes,y así sucesivamente.

Al componer filtros complejos, se recomienda encerrar la expresión resultante entre comillas, por ejemplo:

# tcpdump -i ens3 "port 80 and (dst 10.0.2.3 or dst 10.0.2.15)"

La utilidad tcpdump proporciona muchos parámetros, filtros y sus casos de uso, hemos considerado solo algunas combinaciones básicas. Le recomendamos que lea la referencia completa en la documentación oficial sobre los filtros tcpdump.

Comprobación del contenido del paquete

Hasta ahora, solo hemos visto los encabezados de los paquetes en las capturas de pantalla anteriores. Para mostrar su contenido, agregue el parámetro-X (salida en formato hexadecimal) o-A (en formato ASCII) al comando, por ejemplo, «tcpdump-i ens3-A src example.com y puerto 80»:

Tenga en cuenta que no podrá analizar el contenido del paquete de conexión segura (https) de esta manera. En este ejemplo, el host responde a una solicitud insegura al puerto 80 reenviando (301 Movido permanentemente) a una dirección segura (Ubicación: https://example.com /).

Guardar en un archivo

Los datos recibidos por el comando tcpdump se pueden guardar en un archivo binario en el formato.pcap para un análisis posterior agregando el parámetro-w al comando:

# tcpdump -i <interface> -c <number of lines> -w <file path .pcap>

Esto puede ser conveniente, por ejemplo, para registrar información en un horario, por la noche o cuando el terminal no está disponible.

Ejemplo de uso

Hagamos una pequeña auditoría de seguridad y averigüemos a qué recursos de red accede el servidor Linux inmediatamente después de encenderlo, cuando el terminal aún no está disponible. Por supuesto, sería posible ver el tráfico de la red utilizando un rastreador instalado en un nodo separado en la red local. Pero para hacer esto, necesita, en primer lugar, tener dicho nodo y, en segundo lugar, configurar el reenvío de conexiones (proxy). No siempre es fácil hacer esto con medios improvisados, tcpdump hace que sea mucho más fácil resolver el problema.

Para investigar, tomemos varias distribuciones populares de Linux: Debian / Ubuntu, CentOS / Fedora y AlmaLinux. En cada sistema operativo, realizaremos una instalación mínima y deshabilitaremos todos los servicios innecesarios y actualizaciones automáticas.

Para ejecutar automáticamente el comando tcpdump después de habilitar la interfaz de red, cree un archivo de servicio / etc / systemd/system / tcp-dump.servicio (unidad) con algo como este contenido:

[Unit]
Description=TCP dump
Requires=network-online.target
After=network-online.target
[Service]
ExecStart=/usr/bin/tcpdump -i ens3 -c 1000 -w /tmp/tcpdump.pcap
[Install]
WantedBy=multi-user.target

Tenga en cuenta que trabajar con archivos de servicio requiere derechos de superusuario (root).

También vale la pena considerar que la ruta al archivo ejecutable tcpdump puede ser diferente, es mejor verificar este punto con el comando «which tcpdump» :

Después de guardar el archivo, active el servicio con systemctl enable tcp-dump.comando de servicio y reinicie el sistema. Ahora puede descifrar el tcpdump recibido.archivo pcap usando el mismo tcpdump con el parámetro-r o en un sniffer con la GUI de Wireshark. Echemos un vistazo a los resultados (por brevedad, las direcciones duplicadas se excluyen de la salida).

1. Debian

Aquí vemos llamadas técnicas a nodos de red que utilizan IGMP( Protocolo de Administración de Grupos de Internet, Protocolo de Administración de Grupos de Internet), mDNS (DNS de Multidifusión, protocolo DNS de Multidifusión), UDP (Protocolo de Datagramas de Usuario, Protocolo de Datagramas de Usuario) y una solicitud externa NTP (Protocolo de Tiempo de Red, Protocolo de Tiempo de Red).

2. Fedora

En general, el conjunto de servicios es aproximadamente el mismo, pero tenga en cuenta que el sistema realiza adicionalmente la determinación de la ubicación (solicitando un servicio de geolocalización beacondb.net ), y también realiza más solicitudes a servidores NTP ubicados en diferentes países.

3. AlmaLinux

AlmaLinux es una distribución basada en Red Hat Enterprise Linux (RHEL) como respuesta a la finalización del soporte para la distribución CentOS por parte de Red Hat. Como puede ver, este sistema operativo se comporta de manera mucho más modesta y realiza solicitudes externas solo a los recursos de la red regional.

Desde el punto de vista de la confidencialidad de los datos, vale la pena señalar que contactar servidores o estaciones de trabajo con servicios de red extranjeros es una de las razones para realizar auditorías de tráfico y verificar la configuración del hardware.

Por supuesto, las capacidades de tcpdump no se limitan a ejemplos tan simples. Con este programa, puede rastrear el tráfico de correo y virus, separar las solicitudes «blancas» de los ciberataques y realizar muchas otras acciones útiles.