Guía de uso de tcpdump para análisis de red

Herramienta tcpdump para captura de paquetes

tcpdump es una utilidad de análisis de tráfico de red que permite interceptar y examinar paquetes según criterios definidos por el usuario. Esta herramienta captura los encabezados completos de los paquetes transmitidos, ofreciendo la capacidad de aplicar filtros a nivel de red, protocolo, host, puerto o cualquier combinación de estos mediante operadores lógicos como and, or y not para eliminar información irrelevante.

Instalación

yum -y install tcpdump

Sintaxis general

tcpdump [ -AbdDefhHIJKlLnNOpqStuUvxX# ] [ -B buffer_size ]
        [ -c count ]
        [ -C file_size ] [ -G rotate_seconds ] [ -F file ]
        [ -i interface ] [ -j tstamp_type ] [ -m module ] [ -M secret ]
        [ --number ] [ -Q|-P in|out|inout ]
        [ -r file ] [ -V file ] [ -s snaplen ] [ -T type ] [ -w file ]
        [ -W filecount ]
        [ -E spi@ipaddr algo:secret,...  ]
        [ -y datalinktype ] [ -z postrotate-command ] [ -Z user ]
        [ --time-stamp-precision=tstamp_precision ]
        [ --immediate-mode ] [ --version ]
        [ expression ]

Opciones más utiliazdas

-D: Listar interfaces de red disponibles

-D
--list-interfaces

Muestra la lista de interfaces de red del sistema donde tcpdump puede capturar paquetes. Para cada interfaz se presenta un número identificador junto con el nombre y opcionalmente una descripción textual.

[root@servidor ~]# tcpdump -D
1.docker0
2.tunl0
3.bluetooth0 (Bluetooth adapter number 0)
4.nflog (Linux netfilter log (NFLOG) interface)
5.nfqueue (Linux netfilter queue (NFQUEUE) interface)
6.usbmon1 (USB bus number 1)
7.cali2c685e579df
8.usbmon2 (USB bus number 2)
9.cali6b72856f7ac
10.ens37
11.cali296c6c0494c
12.any (Pseudo-device that captures on all interfaces)
13.lo [Loopback]

-i: Seleccionar interfaz de captura

-i interface
--interface=interface

Define la interfaz de red a utilizar para la captura. Si no se especifica, tcpdump busca automáticamente la interfaz activa con el número más bajo, excluyendo el loopback. En sistemas Linux con kernel 2.2 o superior, se puede utilizar el parámetro "any" para capturar desde todas las interfaces simultáneamente. Es importante notar que la captura en modo "any" no se realiza en modo promiscuo.

-c: Limitar número de paquetes

-c count

Detiene automáticamente la captura después de recibir el número especificado de paquetes.

-n: Evitar resolución de nombres

-n  No convierte direcciones IP a nombres de host (evita búsquedas DNS)
-nn No convierte puertos ni protocolos a nombres
-N  Omite el dominio en los nombres de host

Ejemplo comparativo:

[root@servidor ~]# tcpdump -i ens37 -vv -n -c 3
tcpdump: listening on ens37, link-type EN10MB (Ethernet), capture size 262144 bytes
13:59:28.580896 IP (tos 0x10, ttl 64, id 46658, offset 0, flags [DF], proto TCP (6), length 88)
    192.168.75.200.ssh > 192.168.75.1.57745: Flags [P.], cksum 0x1865 (incorrect -> 0xc3c8), seq 4088702861:4088702909, ack 3151059447, win 501, length 48
13:59:28.581039 IP (tos 0x0, ttl 128, id 24244, offset 0, flags [DF], proto TCP (6), length 40)
    192.168.75.1.57745 > 192.168.75.200.ssh: Flags [.], cksum 0xf4ce (correct), seq 1, ack 48, win 4104, length 0
13:59:28.581199 IP (tos 0x10, ttl 64, id 46659, offset 0, flags [DF], proto TCP (6), length 184)
    192.168.75.200.ssh > 192.168.75.1.57745: Flags [P.], cksum 0x18c5 (incorrect -> 0xa433), seq 48:192, ack 1, win 501, length 144
3 packets captured
3 packets received by filter
0 packets dropped by kernel

[root@servidor ~]# tcpdump -i ens37 -vv -nn -c 3
tcpdump: listening on ens37, link-type EN10MB (Ethernet), capture size 262144 bytes
13:59:35.048566 IP (tos 0x10, ttl 64, id 46671, offset 0, flags [DF], proto TCP (6), length 88)
    192.168.75.200.22 > 192.168.75.1.57745: Flags [P.], cksum 0x1865 (incorrect -> 0xf5c7), seq 4088703645:4088703693, ack 3151059831, win 501, length 48
13:59:35.048714 IP (tos 0x0, ttl 128, id 24269, offset 0, flags [DF], proto TCP (6), length 40)
    192.168.75.1.57745 > 192.168.75.200.22: Flags [.], cksum 0xf041 (correct), seq 1, ack 48, win 4101, length 0
13:59:35.048933 IP (tos 0x10, ttl 64, id 46672, offset 0, flags [DF], proto TCP (6), length 168)
    192.168.75.200.22 > 192.168.75.1.57745: Flags [P.], cksum 0x18b5 (incorrect -> 0x359c), seq 48:176, ack 1, win 501, length 128
3 packets captured
3 packets received by filter
0 packets dropped by kernel

[root@servidor ~]# tcpdump -i ens37 -vv -N -c 3
tcpdump: listening on ens37, link-type EN10MB (Ethernet), capture size 262144 bytes
13:59:47.769377 IP (tos 0x10, ttl 64, id 46686, offset 0, flags [DF], proto TCP (6), length 88)
    servidor.ssh > 192.57745: Flags [P.], cksum 0x1865 (incorrect -> 0x28d1), seq 4088704509:4088704557, ack 3151060311, win 501, length 48
13:59:47.769545 IP (tos 0x0, ttl 128, id 24303, offset 0, flags [DF], proto TCP (6), length 40)
    192.57745 > servidor.ssh: Flags [.], cksum 0xeafe (correct), seq 1, ack 48, win 4104, length 0
13:59:47.769973 IP (tos 0x0, ttl 64, id 24073, offset 0, flags [DF], proto UDP (17), length 71)
    servidor.59205 > public1.domain: [bad udp cksum 0xf199 -> 0xe0cb!] 62457+ PTR? 1.75.168.192.in-addr.arpa. (43)
3 packets captured
9 packets received by filter
0 packets dropped by kernel

-v: Nivel de detalle en la salida

-v     Genera salida más detallada incluyendo TTL, identificación, longitud total y opciones del paquete IP
-vv    Información adicional, como campos adicionales de paquetes de respuesta NFS
-vvv   Máxima verbosidad, mostrando todas las opciones Telnet en formato hexadecimal

-w: Guardar captura en archivo

-w archivo

Guarda los paquetes capturados en formato bruto para análisis posterior con la opción -r. Si se combina con -v, reporta el progreso cada 10 segundos. El archivo se almacena en formato pcap (MIME type: application/vnd.tcpdump.pcap). Se recomienda usar extensión .pcap para compatibilidad.

Ejemplo:

[root@servidor ~]# tcpdump -i ens37 -vv -N -c 3 -w captura.pcap
tcpdump: listening on ens37, link-type EN10MB (Ethernet), capture size 262144 bytes
3 packets captured
15 packets received by filter
0 packets dropped by kernel

[root@servidor ~]# tcpdump -r captura.pcap
reading from file captura.txt, link-type EN10MB (Ethernet)
14:25:03.006770 IP servidor.ssh > 192.168.75.1.57745: Flags [P.], seq 4088721293:4088721357, ack 3151071495, win 501, length 64
14:25:03.006880 IP 192.168.75.1.57745 > servidor.ssh: Flags [.], ack 64, win 4103, length 0
14:25:03.037778 IP servidor.sun-sr-https > nodo2.25461: Flags [.], ack 515136967, win 501, length 0

Filtros avanzados

Operadores lógicos

Capturar tráfico entre múltiples hosts:

tcpdump host equipo1 and \( equipo2 or equipo3 \)

Excluir un host específico:

tcpdump ip host servidor1 and not servidor2

Filtrado por host y puerto

tcpdump host 10.159.32.65 port 443

tcpdump host servidor1 port 80

Filtrado por origen y destino

Capturar solo paquetes destinados a un host:

[root@servidor ~]# tcpdump -i ens37 -vv -nn -c 3 dst 192.168.75.200
tcpdump: listening on ens37, link-type EN10MB (Ethernet), capture size 262144 bytes
14:57:42.981775 IP (tos 0x0, ttl 63, id 17744, offset 0, flags [DF], proto TCP (6), length 40)
    192.168.75.201.30370 > 192.168.75.200.6443: Flags [.], cksum 0xc612 (correct), seq 1185074782, ack 3486725036, win 10385, length 0
14:57:42.981891 IP (tos 0x0, ttl 63, id 17745, offset 0, flags [DF], proto TCP (6), length 75)
    192.168.75.201.30370 > 192.168.75.200.6443: Flags [P.], cksum 0x43dc (correct), seq 0:35, ack 1, win 10385, length 35
14:57:42.983400 IP (tos 0x0, ttl 128, id 28444, offset 0, flags [DF], proto TCP (6), length 40)
    192.168.75.1.57745 > 192.168.75.200.22: Flags [.], cksum 0x43ee (correct), seq 3151077303, ack 4088730333, win 4104, length 0
3 packets captured
5 packets received by filter
0 packets dropped by kernel

Capturar solo paquetes originados en un host:

[root@servidor ~]# tcpdump -i ens37 -vv -nn -c 3 src 192.168.75.200
tcpdump: listening on ens37, link-type EN10MB (Ethernet), capture size 262144 bytes
14:58:14.667205 IP (tos 0x10, ttl 64, id 47165, offset 0, flags [DF], proto TCP (6), length 88)
    192.168.75.200.22 > 192.168.75.1.57745: Flags [P.], cksum 0x1865 (incorrect -> 0x26f9), seq 4088731645:4088731693, ack 3151078599, win 501, length 48
14:58:14.667749 IP (tos 0x10, ttl 64, id 47166, offset 0, flags [DF], proto TCP (6), length 136)
    192.168.75.200.22 > 192.168.75.1.57745: Flags [P.], cksum 0x1895 (incorrect -> 0xc508), seq 48:144, ack 1, win 501, length 96
14:58:14.667967 IP (tos 0x10, ttl 64, id 47167, offset 0, flags [DF], proto TCP (6), length 136)
    192.168.75.200.22 > 192.168.75.1.57745: Flags [P.], cksum 0x1895 (incorrect -> 0x2e8d), seq 144:240, ack 1, win 501, length 96
3 packets captured
3 packets received by filter
0 packets dropped by kernel

Captura de información de conexión de switches

En escenarios donde es necesario identificar qué puerto del switch está conectado al servidor, se pueden utilizar los protocolos LLDP (Link Layer Discovery Protocol) o CDP (Cisco Discovery Protocol) si el switch los tiene habilitados.

Para capturar paquetes LLDP (protocolo 0x88cc):

tcpdump -i eth0 ether proto 0x88cc -A -s0 -t -c 1

Para capturar paquetes CDP (protocolo 0x2000) - principalmente en equipos Cisco:

tcpdump -i eth0 ether proto 0x2000 -A -s0 -t -c 1

Estas capturas revelan información sobre la topología física de la red, incluyendo el identificador del switch y el número de puerto utilizado en la conexión.

Etiquetas: tcpdump linux redes paquetes captura

Publicado el 10-23 16:08