Ejemplos de Tcpdump: captura del tráfico de red en Linux

Tcpdump es un comando de resolución de problemas de red que también se conoce como rastreador de paquetes y se utiliza para capturar y mostrar paquetes de una red. Tcpdump permite a los usuarios capturar y mostrar TCP / IP y otros paquetes (UDP, ARP o ICMP) que se transmiten o reciben a través de la red a la que está conectada la computadora.

Puede aplicar filtros a los paquetes y evitar el tráfico que no desea ver. Puede capturar todos los datos que se encuentran en su red local y guardarlos en un archivo para su posterior análisis. Para ejecutar el comando tcpdump, necesita root o usuario con sudo privilegios.

En este tutorial, aprenderemos cómo usar los comandos tcpdump para analizar el tráfico que fluye en una máquina Linux.

1. Capture el tráfico en la interfaz

Cuando use tcpdump sin ninguna opción, analizará el tráfico en todas las interfaces, ejecute el siguiente comando:

$ sudo tcpdump

Tienes que presionar el botón Ctrl + C para detenerlo.

Para capturar el tráfico en una interfaz específica, use -i opción y limitar el número de paquetes a por -c opción:

El siguiente tcpdump example analiza la interfaz ‘ens160’ y limita el paquete a 5:

$ sudo tcpdump -i ens160 -c 5
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
22:37:57.488830 IP Ubuntu.ssh > static.vnpt.vn.50302: Flags [P.], seq 904499689:904499877, ack 2322684183, win 501, options [nop,nop,TS val 215651573 ecr 764510174], length 188
22:37:57.489727 IP Ubuntu.33256 > dns.google.domain: 5774+ [1au] PTR? 219.62.249.14.in-addr.arpa. (55)
22:37:57.496238 IP static.vnpt.vn.50302 > Ubuntu.ssh: Flags [.], ack 188, win 2045, options [nop,nop,TS val 764510247 ecr 215651573], length 0
22:37:57.546212 ARP, Request who-has 42.112.22.189 tell 42.112.22.254, length 46
22:37:57.549223 ARP, Request who-has 42.112.22.162 tell 42.112.22.254, length 46
5 packets captured

2) Capturar tráfico en un host específico

Puede capturar paquetes entrantes y salientes de un host específico usando -host opción.

$ sudo tcpdump -i ens160 -c 5 -ttttnnvvS host 14.249.62.219

Ahora, puede ver tanto los paquetes de solicitud como los de respuesta:

tcpdump: listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
2020-06-22 06:07:36.407733 IP (tos 0x12,ECT(0), ttl 64, id 60196, offset 0, flags [DF], proto TCP (6), length 176)
    100.9.8.40.22 > 14.249.62.219.49396: Flags [P.], cksum 0x60a7 (incorrect -> 0x8547), seq 296088568:296088692, ack 3491435441, win 501, options [nop,nop,TS val 242630491 ecr 673952638], length 124
2020-06-22 06:07:36.407905 IP (tos 0x12,ECT(0), ttl 64, id 60197, offset 0, flags [DF], proto TCP (6), length 208)
    100.9.8.40.22 > 14.249.62.219.49396: Flags [P.], cksum 0x60c7 (incorrect -> 0xeed4), seq 296088692:296088848, ack 3491435441, win 501, options [nop,nop,TS val 242630492 ecr 673952638], length 156
2020-06-22 06:07:36.407967 IP (tos 0x12,ECT(0), ttl 64, id 60198, offset 0, flags [DF], proto TCP (6), length 288)
    100.9.8.40.22 > 14.249.62.219.49396: Flags [P.], cksum 0x6117 (incorrect -> 0x82ca), seq 296088848:296089084, ack 3491435441, win 501, options [nop,nop,TS val 242630492 ecr 673952638], length 236
2020-06-22 06:07:36.408018 IP (tos 0x12,ECT(0), ttl 64, id 60199, offset 0, flags [DF], proto TCP (6), length 408)
    100.9.8.40.22 > 14.249.62.219.49396: Flags [P.], cksum 0x618f (incorrect -> 0xebc8), seq 296089084:296089440, ack 3491435441, win 501, options [nop,nop,TS val 242630492 ecr 673952638], length 356
2020-06-22 06:07:36.408049 IP (tos 0x12,ECT(0), ttl 64, id 60200, offset 0, flags [DF], proto TCP (6), length 208)
    100.9.8.40.22 > 14.249.62.219.49396: Flags [P.], cksum 0x60c7 (incorrect -> 0x3db7), seq 296089440:296089596, ack 3491435441, win 501, options [nop,nop,TS val 242630492 ecr 673952638], length 156

3) Buscar paquete por puerto

Para buscar paquetes a un número de puerto específico, utilice -port opción.

Suponiendo que desea analizar la interfaz de red ‘ens160’ y limitar el número de paquetes a 5 desde el puerto 22, ejecutemos el siguiente comando:

$ sudo tcpdump -i ens160 -c 5 -nn port 22
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
22:55:11.567754 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 904502461:904502649, ack 2322684399, win 501, options [nop,nop,TS val 216685651 ecr 765506106], length 188
22:55:11.567973 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 188:408, ack 1, win 501, options [nop,nop,TS val 216685652 ecr 765506106], length 220
22:55:11.568102 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 408:604, ack 1, win 501, options [nop,nop,TS val 216685652 ecr 765506106], length 196
22:55:11.568184 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 604:800, ack 1, win 501, options [nop,nop,TS val 216685652 ecr 765506106], length 196
22:55:11.568262 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 800:996, ack 1, win 501, options [nop,nop,TS val 216685652 ecr 765506106], length 196

Para ignorar un puerto cuando intercepta paquetes, use not port.

Si desea analizar un puerto de interfaz de red ‘ens160’ que no sea el 22, ejecute el siguiente comando:

$ sudo tcpdump -i ens160 -nn not port 22

Puede utilizar una variedad de puertos para capturar el tráfico de su red.

Para example, si desea analizar la interfaz de red ens160 en el rango de puertos: del puerto 20 al puerto 23, ejecute el siguiente comando:

$ sudo tcpdump -i ens160 -c 3 -nns 0 portrange 20-23

4) Capturar paquetes de un protocolo específico

Puede decidir si desea capturar solo paquetes ICMP (Protocolo de mensajes de control de Internet) o TCP (Protocolo de control de transmisión). El siguiente comando capturará solo paquetes TCP:

$ sudo tcpdump -i ens160 -c 5 -nn tcp
Output
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
23:13:04.283421 IP 10.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 904505569:904505677, ack 2322684631, win 501, options [nop,nop,TS val 217758367 ecr 766570531], length 108
23:13:04.283512 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 108:144, ack 1, win 501, options [nop,nop,TS val 217758367 ecr 766570531], length 36
23:13:04.283588 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 144:260, ack 1, win 501, options [nop,nop,TS val 217758367 ecr 766570531], length 116
23:13:04.283642 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 260:296, ack 1, win 501, options [nop,nop,TS val 217758367 ecr 766570531], length 36
23:13:04.283863 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 296:508, ack 1, win 501, options [nop,nop,TS val 217758368 ecr 766570531], length 212

5) Save iniciar sesión en un archivo específico

Es posible guardar los paquetes capturados en un archivo. De forma predeterminada, al capturar paquetes en un archivo, solo se guardarán 68 bytes de datos de cada paquete. El resto de la información se ignora.

Puedes usar -s opción para decirle a tcpdump linux cuántos bytes para cada paquete guardar y especificar 0 ya que la longitud de la instantánea de los paquetes le dice a tcpdump que guarde todo el paquete, use el siguiente comando:

PS sudo tcpdump -i ens160 -c 5 -nn tcp -w packets-record.pcap -s 0

Output
tcpdump: listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
5 packets captured

6) Leer el archivo de registro tcpdump

No puede leer el contenido de un archivo que guarda paquetes tcpdump con los comandos comunes como ‘cat’ o ‘less’ pero necesita usar el -r parámetro del comando tcpdump:

$ sudo tcpdump -r packets-record.pcap 

Ahora puede leer el contenido del archivo de registro tcpdump:

reading from file packets-record.pcap, link-type EN10MB (Ethernet)
23:18:57.823581 IP Ubuntu.ssh > static.vnpt.vn.50302: Flags [P.], seq 904507573:904507617, ack 2322684767, win 501, options [nop,nop,TS val 218111907 ecr 766921765], length 44
23:18:57.823697 IP Ubuntu.ssh > static.vnpt.vn.50302: Flags [P.], seq 44:160, ack 1, win 501, options [nop,nop,TS val 218111907 ecr 766921765], length 116
23:18:57.823778 IP Ubuntu.ssh > static.vnpt.vn.50302: Flags [P.], seq 160:196, ack 1, win 501, options [nop,nop,TS val 218111907 ecr 766921765], length 36
23:18:57.832656 IP static.vnpt.vn.50302 > Ubuntu.ssh: Flags [.], ack 44, win 2047, options [nop,nop,TS val 766921826 ecr 218111907], length 0
23:18:57.832685 IP static.vnpt.vn.50302 > Ubuntu.ssh: Flags [.], ack 160, win 2045, options [nop,nop,TS val 766921826 ecr 218111907], length 0

También puede usar este archivo pcap para verlo con Wireshark y analizarlo.

7) Filtrar paquetes de una fuente específica

Para filtrar paquetes que provienen de una IP de origen específica, puede usar src opción.

$ sudo tcpdump src 100.9.8.40

De la misma manera, si desea ver el tráfico en otra dirección, use dst opción:

$ sudo tcpdump dst 14.249.62.219

8) Capturar paquetes por red

Para capturar entradas y salidas de un uso de red -net opción. El siguiente comando captura el tráfico de la red 192.168.0.0/24:

$ sudu tcpdump net 192.169.0.0/24

9) Capturar paquetes en ASCII

Para mostrar paquetes capturados en ASCII use -A opción, que es útil para capturar páginas web.

$ sudo tcpdump -A -i eth0

Tcpdump también puede mostrar el contenido de los paquetes en formato Hex y ASCII, luego usar -X opción:

$ sudo tcpdump -X -i eth0

10) Capturar paquetes IPV6

Podemos capturar el tráfico IPV6 usando ip6 opción y proto para especificar el protocolo TCP o UDP.

proto 6 – TCP

proto 17 – UDP

Lo siguiente captura todo el tráfico ipv6 usando el protocolo tcp:

$ sudo tcpdump -nn ip6 proto 6

11) Filtrar agente de usuario Http

El siguiente comando filtra el agente de usuario Http y el host del encabezado de la solicitud https:

$ sudo tcpdump -nn -A -s1500 -l | egrep -i 'User-Agent:|Host:'

Para capturar cookies utilice el siguiente comando:

$ sudo tcpdump -nn -A -s0 -l | egrep -i 'Set-Cookie|Host:|Cookie:'

12) Lista de interfaces disponibles

Puede utilizar tcpdump para enumerar la interfaz disponible con el -D opción.

Para example:

$ sudo tcpdump -D
Output
1.ens160 [Up, Running]
2.any (Pseudo-device that captures on all interfaces) [Up, Running]
3.lo [Up, Running, Loopback]
4.docker0 [Up]
5.nflog (Linux netfilter log (NFLOG) interface)
6.nfqueue (Linux netfilter queue (NFQUEUE) interface)
7.usbmon1 (USB bus number 1)
8.usbmon2 (USB bus number 2)

13) Rotar archivos de captura

Si está capturando tráfico usando tcpdump durante un período prolongado, es bueno crear un nuevo archivo cuando se alcance una cierta cantidad de tiempo o tamaño de archivo.

El siguiente comando creará un nuevo archivo ‘network-02-30.pcap’ cada 30 minutos (-G 1800) con un archivo limitado a 100 MB (-C 100) con un recuento de archivos de 24 (-W 48).

$ sudo tcpdump -i ens160 -w /tmp/network-%H-%M.pcap -W 48 -G 300 -C 100

Opciones de tcpdump

Tcpdump proporciona varias opciones que mejoran o modifican su salida, vamos a comprobar cuáles son esas:

  • -i <interface>: Escuche en la interfaz especificada.
  • -n: No resuelve nombres de host. Puedes usar -nn para no resolver nombres de host o nombres de puertos.
  • -t: Imprima una marca de tiempo legible por humanos en cada línea de volcado, -tttt: Proporciona una salida de marca de tiempo máximamente legible por humanos.
  • -X: Muestra el contenido del paquete en hexadecimal y ascii.
  • -v, -vv, -vvv: Aumente la cantidad de información de paquetes que recibe.
  • -c N: Obtenga solo N número de paquetes y luego deténgase.
  • -s: Defina la longitud de instantánea (tamaño) de la captura en bytes. Usar -s0 para obtener todo, a menos que esté capturando menos intencionalmente.
  • -S: Imprime números de secuencia absolutos.
  • -q: Muestra menos información de protocolo.
  • -w <file name>: Escriba los paquetes sin procesar en el archivo en lugar de

Poder de y, o y no operador

El comando Tcpdump admite la combinación de operadores ‘y’, ‘o’ y ‘no’ para filtrar resultados más precisos.

Capture el tráfico proveniente de 10.20.0.0/16 y que vaya a la red 10.30.0.0/16 mostrando marcas de tiempo legibles por humanos (tt), sin resolución de nombres de host o números de puerto (nn), salida detallada (vv) y usando secuencia absoluta números (S):

$ sudo  -ttnnvvS tcpdump src net 10.20.0.0/16 and dst net 10.30.0.0/16

Muestra el tráfico de la fuente 192.168.0.10 que no es el protocolo UDP:

$ sudo tcpdump src 192.168.0.10 and src net and not udp

Para capturar tráfico arp o ping para un host específico y guardar la salida en un archivo llamado packetfile.txt:

$ sudo tcpdump -nnti eth0 arp or icmp and host 192.168.0.1 -w packetfile.txt

Formato de salida tcpdump

Tomemos una nueva línea de la salida de tcpdump para comprender su formato.

10:31:13.440803 IP Ubuntu.ssh > 117.6.129.86.50736: Flags [P.], seq 188:400, ack 1, win 501, options [nop,nop,TS val 468736347 ecr 335665367], length 212

Donde:

10:31:13.401128 – Hora en la que se capturó el paquete en hora local.

IP – Indicó que el protocolo de paquetes es IPV4.

Ubuntu.ssh – Esto indica la dirección IP de origen o el nombre de host de origen y .ssh significa puerto (aquí será 22).

117.6.129.86.50376 – Esto indica la dirección IP de destino y el punto (.) Separados por el número de puerto.

Banderas:

[P.] – Este es el campo de banderas de TCP.

[.] – ACK (reconocimiento).

[S] – SYN (Iniciar conexión).

[P] – PSH (Push Data).

[F] – FIN (Finalizar conexión).

[R] – RST (Restablecer conexión).

[S.] – SYN-ACK (paquete SynAcK).

seq 188:400 – El número de secuencia indica que el paquete contiene los bytes ‘188’ a ‘400’ de datos.

win 501 – Este campo es el tamaño de Windows, que representa el número de bytes disponibles en el búfer de recepción.

options [nop,nop,TS val 468736347 ecr 335665367] – Estas son opciones de TCP como MSS (Tamaño máximo de segmento) o Escala de ventana. Puede consultar más sobre Opciones de protocolo TCP.

length 212 – Esto representa la longitud de los datos de carga útil en bytes.

Conclusión

Aunque los rastreadores de paquetes son herramientas de diagnóstico útiles, también se pueden abusar de ellos. Por ejemplo, las personas sin escrúpulos pueden ejecutar rastreadores de paquetes para capturar las contraseñas que otros envían a través de la red. Dependiendo de la configuración de su red, este truco puede funcionar incluso si el rastreador de paquetes no se está ejecutando ni en la computadora emisora ​​ni en la receptora.

Por esta razón, muchas organizaciones tienen políticas que prohíben el uso de rastreadores de paquetes, excepto en circunstancias limitadas.

Espero que haya disfrutado leyendo los comandos de tcpdump y deje su sugerencia en la sección de comentarios a continuación.