Para los realmente muy cafeteros, el tcpdump permite hacer filtros a mano, indicando que bytes de la trama queremos pillar y como los queremos interpretar. Cuando queremos definir filtros de esta manera la expresión general es:
expr relop expr
Donde relop puede ser cualquiera de las operaciones de relación de C: >,<, >= <=, = y !=. expr es una expresión aritmética compuesta por una serie de números enteros, los operadores binarios de C, (+, -, *, /, & y |), un operador de longitud, len, y una serie de palabras reservadas que nos permiten el acceso a los diferentes paquetes de datos (ether, fddi, tr, ip, arp, rarp, tcp, udp, icmp e ip6).
Para acceder a los datos dentro de un paquete, usamos los modificadores anteriores y una expresión entera. Opcionalmente podemos especificar el tamaño de los datos que accedemos.
proto [expr : tam]
Asm por ejemplo, el primer byte de la trama ethernet será ether[0], la primera palabra será ether[0:2]. El parámetro tam puede ser 1 (por defecto y no hace falta especificarlo), 2 o 4. Por ejemplo,
Una nota, al menos en la página de manual de la versión 3.6.2 hacen notar que cuando se especifica tcp, udp u otro procolo de nivel superior se hace referencia a IPv4. Esta limitación sin embargo no aparece en OpenBSD.
Otra nota a tener en cuenta: en caso de usar tcp[indice] o udp[indice], implicitamente se aplica una regla para averiguar si es un paquete fragmentado, es decir, usando la notacisn de estos filtros ip[0:2] & 0x1fff = 0. udp[0] o tcp[0] se refieren al primer byte de la cabecera UDP o TCP.
La mayoría de la doc aquí contenida se ha obtenido de la pagina de manual del tcpdump de una Redhat Linux y del OpenBSD. De hecho, la sección de filtros procede en su totalidad de la página de manual del mismo, aunque he cambiado algunos detalles a la hora de expresarlos.