Entender los filtros de tcpdump
tcpdump usa la sintaxis de filtros de libpcap, a menudo llamada sintaxis BPF (Berkeley Packet Filter). La misma sintaxis vale para los filtros de captura de Wireshark, tshark y dumpcap. Un filtro se compone de primitivas sencillas que se combinan con and, or y not.
Las primitivas: tipo, dirección, protocolo
- Tipo:
host(una dirección),net(una red en notación CIDR),portyportrange. - Dirección:
src(emisor) odst(receptor). Sin indicarla, vale cualquiera de los dos. - Protocolo:
tcp,udp,icmp,ip,ip6,arp,ethery otros.
tcp dst port 443 src net 10.0.0.0/8 ether host 00:11:22:33:44:55
Combinar y usar paréntesis
En libpcap, and y or tienen la misma precedencia y se evalúan de izquierda a derecha. Por eso a or b and c significa (a or b) and c. Usa paréntesis en cuanto mezcles ambos. En el generador, cada par de paréntesis sale de un grupo.
Pon siempre el filtro entre comillas simples; si no, la shell interpreta por su cuenta los paréntesis y los caracteres especiales:
sudo tcpdump -nn -i eth0 'host 10.0.0.5 and (port 80 or port 443)'
Filtrar flags TCP
Con tcp[tcpflags] accedes a los flags de la cabecera TCP. tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn solo captura el primer paquete de cada conexión: SYN activado, ACK desactivado. Esto solo funciona con IPv4, porque libpcap no encuentra la cabecera TCP detrás de las cabeceras de extensión de IPv6.
Filtros habituales
| Objetivo | Filtro |
|---|---|
| Tráfico de un host | host 192.168.1.10 |
| Tráfico entre dos hosts | host 10.0.0.5 and host 10.0.0.20 |
| Web sin tu propia sesión SSH | (port 80 or port 443) and not port 22 |
| DNS | port 53 |
| DHCP | udp portrange 67-68 |
| Inicio de conexión | tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn |
| Conexiones reiniciadas | tcp[tcpflags] & tcp-rst != 0 |
| Ping | icmp[icmptype] == icmp-echo |
| Paquetes en la VLAN 100 | vlan 100 and host 10.1.1.1 |
| Paquetes grandes (problemas de MTU) | greater 1400 |
Consejos prácticos
-nndesactiva la resolución DNS y de nombres de puerto. La salida aparece al instante y tcpdump no genera tráfico DNS propio.-i anycaptura en todas las interfaces a la vez (Linux).- Si estás conectado por SSH, excluye tu propia sesión con
not port 22; si no, verás sobre todo tu propia salida. -w archivo.pcapguarda los paquetes en bruto. Después abres el archivo en Wireshark o contcpdump -r.- En tráfico VLAN,
vlandebe ir antes del resto de condiciones, porque desplaza la posición de las cabeceras siguientes. - Para capturas largas, rota los archivos con
-C(tamaño) o-G(tiempo) y limita su número con-W.
FAQ
¿Cómo guardo una captura para Wireshark?
Indica un nombre de archivo en Opciones, en «Escribir en archivo (-w)», por ejemplo captura.pcap. tcpdump escribe entonces los paquetes en bruto en ese archivo, que puedes abrir directamente en Wireshark.
¿Por qué tcpdump muestra «syntax error»?
Casi siempre la shell interpreta los paréntesis o caracteres especiales porque el filtro no va entre comillas. Por eso el generador siempre pone el filtro entre comillas simples. Otras causas son erratas en las palabras clave o paréntesis sin cerrar.
¿El filtro funciona también en Wireshark?
Sí, como filtro de captura, porque Wireshark también usa libpcap para eso. Los filtros de visualización de Wireshark usan otra sintaxis, por ejemplo ip.addr == 10.0.0.5 en lugar de host 10.0.0.5.
¿Por qué mi filtro no encuentra nada en el tráfico VLAN?
Con una etiqueta VLAN, la cabecera IP se desplaza 4 bytes. Pon la regla VLAN al principio, por ejemplo vlan 100 and host 10.0.0.5. En algunos sistemas Linux la tarjeta de red quita la etiqueta antes; entonces no necesitas vlan.
¿Se envían mis datos a algún sitio?
No. El generador funciona por completo en tu navegador. El enlace para compartir guarda el filtro en la parte tras el #, y el navegador no envía esa parte al servidor.