Tcpdump es un comando utilizado en varios sistemas operativos Linux (SOs) que reúne paquetes TCP/IP que pasan a través de un adaptador de red. Al igual que una herramienta de rastreo de paquetes, tcpdump no sólo puede analizar el tráfico de red sino también guardarlo en un archivo.
A diferencia de algunos comandos que el sistema operativo proporciona por defecto, es posible que no pueda usar tcpdump porque no está instalado. Para instalar tcpdump, ejecute apt-get install tcpdump o yum install tcpdump , dependiendo de su SO.
Índice de contenidos
Cómo funciona Tcpdump
Tcpdump imprime las cabeceras de los paquetes en una interfaz de red que coinciden con la expresión booleana . También puede ejecutarse con el indicador -w , que hace que guarde los datos del paquete en un archivo para su posterior análisis, y/o con el indicador -r , que hace que lea desde un archivo de paquetes guardado en lugar de leer los paquetes desde una interfaz de red. En todos los casos, sólo los paquetes que coincidan con expression serán procesados por tcpdump.
Tcpdump, si no se ejecuta con la bandera -c , continuará capturando paquetes hasta que sea interrumpido por una señal SIGINT (generada, por ejemplo, escribiendo su carácter de interrupción, típicamente Ctrl+C ) o una señal SIGTERM (generada típicamente con el comando kill (1)); si se ejecuta con el indicador -c , capturará los paquetes hasta que sean interrumpidos por una señal SIGINT o SIGTERM o hasta que se haya procesado el número especificado de paquetes.
Los interruptores mencionados anteriormente se explican en detalle más adelante en esta sección.
Cuando tcpdump termine de capturar paquetes, reportará las cuentas de:
- Paquetes «recibidos por filtro».
- El significado de esto depende del sistema operativo en el que se esté ejecutando tcpdump, y posiblemente de la forma en que se haya configurado el sistema operativo. Si se especificó un filtro en la línea de comandos, en algunos SOs cuenta los paquetes independientemente de si fueron coincidentes con la expresión del filtro, y en otros sólo cuenta los paquetes que fueron coincidentes con la expresión del filtro y fueron procesados por tcpdump.
- Los paquetes «dejados por el kernel».
- Este es el número de paquetes que fueron eliminados, debido a la falta de espacio en el búfer, por el mecanismo de captura de paquetes en el SO en el que tcpdump se está ejecutando, si el SO reporta esa información a las aplicaciones. Si no, será reportado como 0.
En plataformas que soportan la señal SIGINFO, como la mayoría de BSDs (Berkeley Software Distributions), reportará esos conteos cuando reciba una señal SIGINFO (generada, por ejemplo, escribiendo el carácter «status», típicamente Ctrl+T ) y continuará capturando paquetes.
Compatibilidad con Tcpdump
La lectura de paquetes desde una interfaz de red con el comando tcpdump puede requerir que tenga privilegios especiales ( leer un archivo de paquetes guardado no requiere tales privilegios):
- SunOS 3.x o 4.x con NIT o BPF : Debe tener acceso de lectura a /dev/nit or dev/bpf*.
- Solaris con DLPI : Debe tener acceso de lectura/escritura al pseudodispositivo de red, como /dev/le. Sin embargo, al menos en algunas versiones de Solaris, esto no es suficiente para permitir que tcpdump capture en modo promiscuo; en esas versiones de Solaris, debe ser root, o tcpdump debe instalarse setuid a root, para poder capturar en modo promiscuo. Tenga en cuenta que, en muchas (quizás en todas) las interfaces, si no captura en modo promiscuo, no verá ningún paquete saliente, por lo que una captura no realizada en modo promiscuo puede no ser muy útil.
- HP-UX con DLPI : Debe ser root o tcpdump debe instalarse setuid a root.
- IRIX con snoop : Debe ser root o tcpdump debe instalarse setuid a root.
- Linux : Debe ser root o tcpdump debe instalarse setuid a root.
- Ultrix y Digital UNIX / Tru64 UNIX : Cualquier usuario puede capturar tráfico de red con tcpdump. Sin embargo, ningún usuario (ni siquiera el superusuario) puede capturar en modo promiscuo en una interfaz a menos que el superusuario haya habilitado la operación en modo promiscuo en esa interfaz utilizando pfconfig(8), y ningún usuario (ni siquiera el superusuario) puede capturar tráfico unidifusión recibido o enviado por la máquina en una interfaz a menos que el superusuario haya habilitado la operación en modo copia en esa interfaz utilizando pfconfig, por lo que useful la captura de paquetes en una interfaz probablemente requiera que se habilite la operación en modo promiscuo o en modo copia en modo copia en modo copia, o que se habiliten ambos modos de operación en esa interfaz.
- BSD : Debe tener acceso de lectura a /dev/bpf*.
Sintaxis del comando Tcpdump
Como todos los comandos del ordenador, el comando tcpdump funciona correctamente sólo si la sintaxis es correcta:
tcpdump [ -adeflnNOpqRStuvxX ] [ -c count ]
-C file_size ] [ -F file ]
[ -i interfaz ] [ [ -m módulo [ -r archivo ]
[ -s snaplen ] [ -T type [ -U user [ [ -w file ]
-E algo:secret ] [ expression ]
Opciones de comando de Tcpdump
Estas son todas las opciones que puede usar con el comando tcpdump:
- -a : Intenta convertir direcciones de red y de difusión en nombres.
- -c : Salir después de recibir cuenta paquetes.
- -C : Antes de escribir un paquete sin procesar en un archivo guardar, compruebe si el archivo es actualmente mayor que file_size y, si es así, cierre el archivo guardar actual y abra uno nuevo. Los archivos guardados después del primer archivo guardado tendrán el nombre especificado con la bandera -w , con un número después, comenzando en 2 y continuando hacia arriba. Las unidades de file_size son millones de bytes (1.000.000 bytes, no 1.048.576 bytes).
- -d : Volcar el código de emparejamiento de paquetes compilado en una forma legible por el ser humano a la salida estándar y detenerlo.
- -dd : Código de correspondencia de paquetes de volcado como un fragmento de programa C .
- -ddd : Código de correspondencia de paquetes de volcado como números decimales (precedidos de un recuento).
- -e : Imprime el encabezado de nivel de enlace en cada línea de volcado.
- -E : Utilice algo:secret para descifrar paquetes ESP de IPsec. Los algoritmos pueden ser des-cbc , 3des-cbc , blowfish-cbc , rc3-cbc , cast128-cbc , o ninguno . El valor predeterminado es des-cbc . La capacidad de descifrar paquetes sólo está presente si tcpdump fue compilado con criptografía habilitada. «secret» es el texto ASCII para la tecla ESP «secret». La opción asume RFC2406 ESP, no RFC1827 ESP. La opción es sólo para propósitos de depuración, y se desaconseja el uso de esta opción con una verdadera clave «secreta». Al presentar la clave «secreta» IPsec en la línea de comandos, la hace visible para los demás, a través de ps(1) y en otras ocasiones.
- -f : Imprimir las direcciones de Internet «extranjeras» numéricamente en lugar de simbólicamente (esta opción está pensada para evitar fallos en el servidor YP de Sun – normalmente se cuelga mientras se traducen los números de Internet no locales).
- -F : Utilice file como entrada para la expresión del filtro. Una expresión adicional dada en la línea de comandos es ignorada.
- -i : Escuchar en interfaz. Si no se especifica, tcpdump busca en la lista de interfaces del sistema la interfaz configurada y numerada más baja (excluyendo loopback). Los empates se rompen eligiendo la primera coincidencia. En sistemas Linux con núcleos 2.2 o posteriores, se puede usar un argumento interface de «any» para capturar paquetes desde todas las interfaces. Tenga en cuenta que las capturas en el dispositivo «any»’ no se realizarán en modo promiscuo.
- -l : Hacer que la línea de stdout sea tamponada. Útil si desea ver los datos mientras los captura. Por ejemplo, «tcpdump -l | tee dat» o «tcpdump -l> dat & tail -f dat».
- -m : Cargar las definiciones de los módulos MIB SMI desde el archivo module. Esta opción puede utilizarse varias veces para cargar varios módulos MIB en tcpdump.
- -n : No convierta direcciones de host en nombres. Esto se puede utilizar para evitar las búsquedas de DNS.
- -nn : Tampoco convierta protocolos y números de puerto, etc., a nombres.
- -N : No imprima la calificación del nombre de dominio de los nombres de host. Por ejemplo, si da esta bandera, entonces tcpdump imprimirá «nic» en lugar de «nic.ddn.mil».
- -O : No ejecute el optimizador de código de correspondencia de paquetes. Esto es útil sólo si sospecha de un error en el optimizador.
- -p : No ponga la interfaz en modo promiscuo. Tenga en cuenta que la interfaz puede estar en modo promiscuo por alguna otra razón; por lo tanto, «-p» no puede utilizarse como abreviatura de «ether host {local-hw-addr} or ether broadcast».
- -q : Salida rápida (silenciosa). Imprima menos información de protocolo para que las líneas de salida sean más cortas.
- -R : Suponga que los paquetes ESP/AH se basan en especificaciones antiguas: RFC1825 a RFC1829. Si se especifica, tcpdump no imprimirá el campo de prevención de repetición. Puesto que no hay ningún campo de versión de protocolo en la especificación ESP/AH, tcpdump no puede deducir la versión del protocolo ESP/AH.
- -r : Leer paquetes de archivo (que fue creado con la opción -w). La entrada estándar se utiliza si file es «-».
- -S : Imprime números de secuencia TCP absolutos, en lugar de relativos.
- -s : Snarf snaplen bytes de datos de cada paquete en lugar del valor predeterminado de 68; con NIT de SunOS, el mínimo es en realidad 96. Sesenta y ocho bytes es adecuado para IP, ICMP, TCP y UDP, pero puede truncar la información de protocolo del servidor de nombres y los paquetes NFS (véase más abajo). Los paquetes truncados debido a una instantánea limitada se indican en la salida con «[| proto]]’, donde proto es el nombre del nivel de protocolo en el que se ha producido el truncamiento. Tenga en cuenta que tomar instantáneas más grandes aumenta la cantidad de tiempo que se tarda en procesar los paquetes y, de forma efectiva, disminuye la cantidad de almacenamiento en búfer de paquetes. Esto puede causar la pérdida de paquetes. Debe limitar snaplen al número más pequeño que capture la información de protocolo que le interesa. Ajustar snaplen a 0 significa usar la longitud requerida para capturar paquetes enteros.
- -T : Forzar paquetes seleccionados por » expression» para interpretar el tipo especificado . Los tipos actualmente conocidos son cnfp (Cisco NetFlow protocol), rpc (Remote Procedure Call), rtp (Real-Time Applications protocol), rtcp (Real-Time Applications control protocol), snmp (Simple Network Management Protocol), vat (Visual Audio Tool), y wb (Pizarra distribuida).
- -t : No imprima una marca de tiempo en cada línea de volcado.
- -tt : Imprime una marca de tiempo sin formato en cada línea de volcado.
- -U : Suelta privilegios de root y cambia el ID de usuario a user y el ID de grupo al grupo primario de user.
- Nota : Red Hat Linux elimina automáticamente los privilegios al usuario «pcap» si no se especifica nada más.
- -ttt : Imprime un delta (en microsegundos) entre la línea actual y la anterior en cada línea de volcado.
- -tt : Imprime una marca de tiempo en formato predeterminado precedida por la fecha en cada línea de volcado.
- -u : Imprimir mangos NFS sin decodificar.
- -v : (Un poco más) salida verbosa. Por ejemplo, se imprimen el tiempo de vida, la identificación, la longitud total y las opciones de un paquete IP. También permite realizar comprobaciones adicionales de la integridad de los paquetes, como la verificación de la IP y la suma de comprobación de la cabecera ICMP.
- -vvv : Salida aún más verbosa. Por ejemplo, se imprimen campos adicionales desde paquetes de respuesta NFS y los paquetes SMB se decodifican completamente.
- -vvvv : Salida aún más verbosa. Por ejemplo, telnet SB …. Las opciones SE se imprimen en su totalidad. Con -X las opciones de telnet también se imprimen en hexadecimal.
- -w : Escribe los paquetes sin procesar en file en lugar de analizarlos e imprimirlos. Posteriormente se pueden imprimir con la opción -r. La salida estándar se utiliza si file es «-».
- -x : Imprime cada paquete (menos su encabezado de nivel de enlace) en hexadecimal. Se imprimirá el más pequeño de todos los bytes del paquete o snaplen. Tenga en cuenta que éste es el paquete de capa de enlace completo, por lo que para las capas de enlace que rellenan (por ejemplo, Ethernet), los bytes de relleno también se imprimirán cuando el paquete de capa superior sea más corto que el relleno requerido.
- -X : Cuando imprima un hexágono, imprima también ASCII. Por lo tanto, si -x también está configurado, el paquete se imprime en hex/ASCII. Esto es muy útil para analizar nuevos protocolos. Incluso si -x no está también configurado, algunas partes de algunos paquetes pueden imprimirse en hex/ASCII.
- expression: Selecciona qué paquetes serán volcados. Si no se da ninguna expresión , todos los paquetes en la red serán volcados. De lo contrario, sólo los paquetes para los que expression es ‘true’ serán volcados. La expresión consiste en una o más primitivas. Las primitivas consisten normalmente en una id (nombre o número) precedida por una o más calificadoras. Hay tres tipos diferentes de calificadores:
- type: Los calificadores dicen a qué tipo de cosas se refiere el nombre o número de identificación. Los tipos posibles son host , net , y port -por ejemplo, ‘host foo’, ‘net 128.3’, ‘port 20’. Si no hay ningún calificador de tipo, se asume host .
- dir: Los calificadores especifican una dirección de transferencia particular hacia y/o desde id. Las posibles direcciones son src , dst , src o dst y src y dst (p. ej., ‘src foo’, ‘dst net 128.3’, ‘src o dst port ftp-data’). Si no hay ningún calificador dir, se asume src o dst . Para las capas de enlace’nulas’ (es decir, protocolos punto a punto como slip) se pueden utilizar los calificadores inbound y outbound para especificar la dirección deseada.
- proto: Los partidos de clasificación restringen el partido a un protocolo en particular. Los posibles prototipos lo son: éter , fddi , tr , ip , ip6 , arp , rarp , , decnet , tcp , , y udp -por ejemplo, ‘ether src foo’, ‘arp net 128.3’, ‘tcp puerto 21’. Si no hay un proto-calificador, se asumen todos los protocolos consistentes con el tipo. Por ejemplo, ‘src foo’ significa ‘(ip o arp o rarp) src foo’ (excepto que este último no es sintaxis legal), ‘net bar’ significa ‘(ip o arp o rarp) net bar’ y `port 53′ significa ‘(tcp o udp) port 53’.
- [‘fddi’ es en realidad un alias para’éter’; el analizador los trata idénticamente como si significaran «el nivel de enlace de datos utilizado en la interfaz de red especificada.». Las cabeceras FDDI contienen direcciones de origen y destino similares a las de Ethernet, y a menudo contienen tipos de paquetes similares a los de Ethernet, por lo que puede filtrar en estos campos FDDI de la misma forma que con los campos Ethernet análogos. Las cabeceras FDDI también contienen otros campos, pero no se pueden nombrar explícitamente en una expresión de filtro.
- Del mismo modo,’tr’ es un alias para’éter’; las afirmaciones del párrafo anterior sobre las cabeceras FDDI también se aplican a las cabeceras de los timbres de los tokens].
Además de lo anterior, hay algunas palabras clave especiales «primitivas» que no siguen el patrón: gateway , broadcast , menos , expresiones mayores , y aritméticas . Todo esto se describe a continuación.
Expresiones de filtro más complejas se construyen usando las palabras y , o , , y no para combinar primitivas-por ejemplo, «host foo y no port ftp y no port ftp-data». Para guardar la escritura, se pueden omitir listas de calificadores idénticas (por ejemplo, «tcp dst port ftp o ftp-data o domain» es exactamente lo mismo que «tcp dst port ftp o tcp dst port ftp-data o tcp dst port domain»).
Estos son los primitivos permitidos con el comando tcpdump:
- dst host host
- True si el campo de destino IPv4/v6 del paquete es host, que puede ser una dirección o un nombre.
- host src host
- True si el campo fuente IPv4/v6 del paquete es host.
- host host
- True si el origen o destino IPv4/v6 del paquete es host. Cualquiera de las expresiones de host anteriores se puede preparar con las palabras clave, ip , ar
- True si el origen o destino IPv4/v6 del paquete es host. Cualquiera de las expresiones de host anteriores se puede preparar con las palabras clave, ip , ar