Filtrado de tcpdump: poner orden en el caos

En mi último artículo, Solución de problemas con tcpdump, analicé el tcpdump herramienta, algunos casos de uso básicos y recorrí una maqueta de un escenario del mundo real. Ahora quiero profundizar un poco más. Cualquiera que utilice esta herramienta en una situación real nota inmediatamente la cantidad de información (creo que lo llaman "detallado"...) que se le presenta al usuario. Una de las mejores cosas que puede hacer por sí mismo es encontrar una manera conveniente de filtrar la información que necesita. Veamos algunas maneras en las que puedes hacer esto.

Índice

Opciones de filtro comunes

el tcpdump La herramienta tiene varias formas integradas de filtrar la captura en sí. Esto significa que puede refinar la información que recibe incluso antes de que comience la captura. Esto es muy preferible y hace que el filtrado posterior a la captura sea un proceso mucho menos tedioso. Algunos de los filtros de precaptura que puede utilizar son los siguientes:

Para filtrar por dirección IP:

$ sudo tcpdump host x.x.x.x

Para filtrar por interfaz:

$ sudo tcpdump -i eth0

Para filtrar por fuente:

$ sudo tcpdump src x.x.x.x

Para filtrar por destino:

$ sudo tcpdump dst x.x.x.x

Para filtrar por protocolo:

$ sudo tcpdump icmp

Esta lista no cubre todas las opciones disponibles, pero le brinda un buen punto de partida. A continuación, echemos un vistazo a algunas de las otras formas en que podemos manipular la captura.

Escribir capturas en un archivo (pcap)

Debido a la naturaleza de la solución de problemas, me resulta útil documentar lo que veo al capturar con tcpdump. Por suerte, tcpdump tiene un formato de archivo de salida que captura todos los datos que vemos. Este formato se llama archivo, también conocido como PCAP, y se usa en varias utilidades, incluidos analizadores de red y tcpdump. Aquí estamos escribiendo en un archivo PACAP llamado usando el -w cambiar.

[[email protected] ~]# tcpdump -i enp0s8 -c100 -nn -w output_file
tcpdump: listening on enp0s8, link-type EN10MB (Ethernet), capture size 262144 bytes
100 packets captured
102 packets received by filter
0 packets dropped by kernel

Lectura de archivos pcap

Puede reproducir archivos PCAP usando el -r cambiar. Solo una advertencia, si intenta reproducir un archivo PCAP por medios convencionales (cat, Vim, etc.), recibirá un galimatías ilegible. Si desea utilizar estos programas para mostrar su salida, siga leyendo.

$ tcpdump -r output_file

Escribiendo tcpdump a .txt

Si desea utilizar medios convencionales para leer su archivo de salida, debe volver a ejecutar tcpdump, excluyendo el -w bandera. Puede ver a continuación que estamos utilizando una salida estándar en formato de archivo con el nombre de archivo.

[[email protected] ~]# tcpdump -i enp0s8 -c100 -nn > output.txt
  tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
  listening on enp0s8, link-type EN10MB (Ethernet), capture size 262144 bytes
  100 packets captured
  102 packets received by filter
  0 packets dropped by kernel

Ejemplo

Antes de continuar, quiero explicar el escenario que preparé para el resto de este artículo. Tenemos tres máquinas virtuales ejecutándose en la misma red. El Cliente 1 y el Cliente 2 hacen ping al servidor sin parar. Capturaremos el tráfico ICMP en la interfaz de la máquina virtual del servidor y luego filtraremos los paquetes de cada máquina cliente. Me doy cuenta de que este es un ejercicio bastante sencillo, pero los principios se pueden aplicar a entornos reales más complejos.

  • Servidor - 172.25.1.5
  • Cliente 1 - 172.25.1.4
  • Cliente 2 - 172.25.1.7

A continuación, echamos un vistazo a los dos comandos utilizados para generar nuestras capturas:

  1. Escribir en el archivo PCAP - tcpdump -i enp0s8 -c100 -nn -w output_file
  2. Escribir en un archivo TXT - tcpdump -i enp0s8 -c100 -nn > output.txt

La única diferencia notable aquí es el formato de salida. Puede ver que hemos capturado el tráfico en la interfaz y hemos limitado la captura a 100 paquetes sin nombre ni resolución de puerto. Ahora filtremos nuestro archivo solo en el tráfico del cliente 1.

Para hacer esto, usamos una de dos cadenas de comando (dependiendo del formato de archivo de nuestra captura):

Filtrar salida PCAP - tcpdump -r output_file | grep -i 172.25.1.4

[[email protected] ~]# tcpdump -r output_file | grep -i 172.25.1.4
reading from file output_file, link-type EN10MB (Ethernet)
22:01:14.947643 IP 172.25.1.4 > server.example.com: ICMP echo request, id 1, seq 109, length 64
22:01:14.947704 IP server.example.com > 172.25.1.4: ICMP echo reply, id 1, seq 109, length 64
22:01:16.023097 IP 172.25.1.4 > server.example.com: ICMP echo request, id 1, seq 110, length 64
22:01:16.023153 IP server.example.com > 172.25.1.4: ICMP echo reply, id 1, seq 110, length 64
22:01:17.081338 IP 172.25.1.4 > server.example.com: ICMP echo request, id 1, seq 111, length 64
22:01:17.081386 IP server.example.com > 172.25.1.4: ICMP echo reply, id 1, seq 111, length 64
22:01:18.103740 IP 172.25.1.4 > server.example.com: ICMP echo request, id 1, seq 112, length 64
22:01:18.103784 IP server.example.com > 172.25.1.4: ICMP echo reply, id 1, seq 112, length 64
22:01:19.128568 IP 172.25.1.4 > server.example.com: ICMP echo request, id 1, seq 113, length 64
22:01:19.128646 IP server.example.com > 172.25.1.4: ICMP echo reply, id 1, seq 113, length 64
22:01:20.129531 IP 172.25.1.4 > server.example.com: ICMP echo request, id 1, seq 114, length 64
22:01:20.129577 IP server.example.com > 172.25.1.4: ICMP echo reply, id 1, seq 114, length 64
22:01:21.175573 IP 172.25.1.4 > server.example.com: ICMP echo request, id 1, seq 115, length 64
22:01:21.175631 IP server.example.com > 172.25.1.4: ICMP echo reply, id 1, seq 115, length 64
22:01:22.199852 IP 172.25.1.4 > server.example.com: ICMP echo request, id 1, seq 116, length 64
22:01:22.199899 IP server.example.com > 172.25.1.4: ICMP echo reply, id 1, seq 116, length 64
22:01:23.231032 IP 172.25.1.4 > server.example.com: ICMP echo request, id 1, seq 117, length 64
22:01:23.231083 IP server.example.com > 172.25.1.4: ICMP echo reply, id 1, seq 117, length 64
22:01:24.247585 IP 172.25.1.4 > server.example.com: ICMP echo request, id 1, seq 118, length 64
22:01:24.247660 IP server.example.com > 172.25.1.4: ICMP echo reply, id 1, seq 118, length 64
22:01:25.248875 IP 172.25.1.4 > server.example.com: ICMP echo request, id 1, seq 119, length 64
22:01:25.248937 IP server.example.com > 172.25.1.4: ICMP echo reply, id 1, seq 119, length 64
22:01:26.295889 IP 172.25.1.4 > server.example.com: ICMP echo request, id 1, seq 120, length 64
22:01:26.295946 IP server.example.com > 172.25.1.4: ICMP echo reply, id 1, seq 120, length 64
22:01:27.255274 ARP, Request who-has server.example.com tell 172.25.1.4, length 46

*Edited for length*

Donde

Filtrar salida TXT - cat output.txt | grep -i 172.25.1.4

[[email protected] ~]# cat output.txt | grep -i 172.25.1.4
12:03:56.653494 IP 172.25.1.4 > 172.25.1.5: ICMP echo request, id 1, seq 342, length 64
12:03:56.653534 IP 172.25.1.5 > 172.25.1.4: ICMP echo reply, id 1, seq 342, length 64
12:03:57.674036 IP 172.25.1.4 > 172.25.1.5: ICMP echo request, id 1, seq 343, length 64
12:03:57.674089 IP 172.25.1.5 > 172.25.1.4: ICMP echo reply, id 1, seq 343, length 64
12:03:58.701049 IP 172.25.1.4 > 172.25.1.5: ICMP echo request, id 1, seq 344, length 64
12:03:58.701107 IP 172.25.1.5 > 172.25.1.4: ICMP echo reply, id 1, seq 344, length 64
12:03:59.721996 IP 172.25.1.4 > 172.25.1.5: ICMP echo request, id 1, seq 345, length 64
12:03:59.722134 IP 172.25.1.5 > 172.25.1.4: ICMP echo reply, id 1, seq 345, length 64
12:04:00.746748 IP 172.25.1.4 > 172.25.1.5: ICMP echo request, id 1, seq 346, length 64
12:04:00.746805 IP 172.25.1.5 > 172.25.1.4: ICMP echo reply, id 1, seq 346, length 64
12:04:01.774055 IP 172.25.1.4 > 172.25.1.5: ICMP echo request, id 1, seq 347, length 64
12:04:01.774130 IP 172.25.1.5 > 172.25.1.4: ICMP echo reply, id 1, seq 347, length 64
12:04:02.793968 IP 172.25.1.4 > 172.25.1.5: ICMP echo request, id 1, seq 348, length 64
12:04:02.794012 IP 172.25.1.5 > 172.25.1.4: ICMP echo reply, id 1, seq 348, length 64
12:04:03.846026 IP 172.25.1.4 > 172.25.1.5: ICMP echo request, id 1, seq 349, length 64
12:04:03.846082 IP 172.25.1.5 > 172.25.1.4: ICMP echo reply, id 1, seq 349, length 64
12:04:04.918800 IP 172.25.1.4 > 172.25.1.5: ICMP echo request, id 1, seq 350, length 64
12:04:04.918850 IP 172.25.1.5 > 172.25.1.4: ICMP echo reply, id 1, seq 350, length 64
12:04:05.930499 IP 172.25.1.4 > 172.25.1.5: ICMP echo request, id 1, seq 351, length 64
12:04:05.930543 IP 172.25.1.5 > 172.25.1.4: ICMP echo reply, id 1, seq 351, length 64
12:04:06.954222 IP 172.25.1.4 > 172.25.1.5: ICMP echo request, id 1, seq 352, length 64
12:04:06.954269 IP 172.25.1.5 > 172.25.1.4: ICMP echo reply, id 1, seq 352, length 64
12:04:07.990890 IP 172.25.1.4 > 172.25.1.5: ICMP echo request, id 1, seq 353, length 64
12:04:07.990937 IP 172.25.1.5 > 172.25.1.4: ICMP echo reply, id 1, seq 353, length 64
12:04:09.002781 IP 172.25.1.4 > 172.25.1.5: ICMP echo request, id 1, seq 354, length 64
12:04:09.002842 IP 172.25.1.5 > 172.25.1.4: ICMP echo reply, id 1, seq 354, length 64
12:04:10.032385 IP 172.25.1.4 > 172.25.1.5: ICMP echo request, id 1, seq 355, length 64
12:04:10.032451 IP 172.25.1.5 > 172.25.1.4: ICMP echo reply, id 1, seq 355, length 64
12:04:11.055533 IP 172.25.1.4 > 172.25.1.5: ICMP echo request, id 1, seq 356, length 64
12:04:11.055583 IP 172.25.1.5 > 172.25.1.4: ICMP echo reply, id 1, seq 356, length 64
12:04:12.074288 IP 172.25.1.4 > 172.25.1.5: ICMP echo request, id 1, seq 357, length 64

*Edited for length*

Para verificar el tráfico hacia / desde el cliente 2, simplemente cambie la dirección IP en el grep solicitud. Este método funciona para nombres de host, números de puerto y cualquier otra palabra clave que encuentre en el archivo de captura. Este ejemplo en particular muestra el poder del filtrado previo y posterior. El filtrado previo ocurre cuando capturamos solo en una interfaz específica, y el filtrado posterior ocurre cuando aplicamos un grep solicitud al archivo de captura.

Sacar

Lo que espero comunicar es que tcpdump es una herramienta increíblemente poderosa. Sin embargo, las tecnologías poderosas a menudo están cargadas de información que podría no ser aplicable a sus necesidades específicas. Con un poco de reflexión y planificación, puede prefiltrar su captura para reducir la cantidad de tráfico capturado y luego usar un grep Donde awk consulte el archivo de salida para encontrar rápidamente las interacciones de tráfico que está buscando. Estas estrategias, cuando se aplican correctamente, pueden acelerar exponencialmente los esfuerzos de solución de problemas. Ahora, espero que no tengas que poner esto en práctica pronto.

Artículos de interés

Subir