GNU/Linux >> Tutoriales Linux >  >> Linux

Una introducción al uso de tcpdump en la línea de comandos de Linux

En mi experiencia como administrador de sistemas, a menudo he encontrado que los problemas de conectividad de red son difíciles de solucionar. Para esas situaciones, tcpdump es un gran aliado.

La terminal de Linux

  • Los 7 mejores emuladores de terminal para Linux
  • 10 herramientas de línea de comandos para el análisis de datos en Linux
  • Descargar ahora:hoja de referencia de SSH
  • Hoja de trucos de comandos avanzados de Linux
  • Tutoriales de línea de comandos de Linux

Tcpdump es una utilidad de línea de comandos que le permite capturar y analizar el tráfico de red que pasa por su sistema. A menudo se usa para ayudar a solucionar problemas de red, así como también como una herramienta de seguridad.

Una herramienta poderosa y versátil que incluye muchas opciones y filtros, tcpdump puede usarse en una variedad de casos. Dado que es una herramienta de línea de comandos, es ideal para ejecutarse en servidores o dispositivos remotos para los que no se dispone de una GUI, para recopilar datos que se pueden analizar más tarde. También se puede iniciar en segundo plano o como un trabajo programado usando herramientas como cron.

En este artículo, veremos algunas de las características más comunes de tcpdump.

1. Instalación en Linux

Tcpdump se incluye con varias distribuciones de Linux, por lo que es probable que ya lo tenga instalado. Compruebe si tcpdump está instalado en su sistema con el siguiente comando:

$ which tcpdump
/usr/sbin/tcpdump

Si tcpdump no está instalado, puede instalarlo pero usando el administrador de paquetes de su distribución. Por ejemplo, en CentOS o Red Hat Enterprise Linux, así:

$ sudo dnf install -y tcpdump

Tcpdump requiere libpcap , que es una biblioteca para la captura de paquetes de red. Si no está instalado, se agregará automáticamente como una dependencia.

Está listo para comenzar a capturar algunos paquetes.

2. Capturando paquetes con tcpdump

Para capturar paquetes para la resolución de problemas o el análisis, tcpdump requiere permisos elevados, por lo que en los siguientes ejemplos, la mayoría de los comandos tienen el prefijo sudo .

Para comenzar, use el comando tcpdump --list-interfaces (o -D para abreviar) para ver qué interfaces están disponibles para la captura:

$ sudo tcpdump -D
1.eth0
2.virbr0
3.eth1
4.any (Pseudo-device that captures on all interfaces)
5.lo [Loopback]

En el ejemplo anterior, puede ver todas las interfaces disponibles en mi máquina. La interfaz especial any permite capturar en cualquier interfaz activa.

Usémoslo para comenzar a capturar algunos paquetes. Capture todos los paquetes en cualquier interfaz ejecutando este comando:

$ sudo tcpdump --interface any
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
09:56:18.293641 IP rhel75.localdomain.ssh > 192.168.64.1.56322: Flags [P.], seq 3770820720:3770820916, ack 3503648727, win 309, options [nop,nop,TS val 76577898 ecr 510770929], length 196
09:56:18.293794 IP 192.168.64.1.56322 > rhel75.localdomain.ssh: Flags [.], ack 196, win 391, options [nop,nop,TS val 510771017 ecr 76577898], length 0
09:56:18.295058 IP rhel75.59883 > gateway.domain: 2486+ PTR? 1.64.168.192.in-addr.arpa. (43)
09:56:18.310225 IP gateway.domain > rhel75.59883: 2486 NXDomain* 0/1/0 (102)
09:56:18.312482 IP rhel75.49685 > gateway.domain: 34242+ PTR? 28.64.168.192.in-addr.arpa. (44)
09:56:18.322425 IP gateway.domain > rhel75.49685: 34242 NXDomain* 0/1/0 (103)
09:56:18.323164 IP rhel75.56631 > gateway.domain: 29904+ PTR? 1.122.168.192.in-addr.arpa. (44)
09:56:18.323342 IP rhel75.localdomain.ssh > 192.168.64.1.56322: Flags [P.], seq 196:584, ack 1, win 309, options [nop,nop,TS val 76577928 ecr 510771017], length 388
09:56:18.323563 IP 192.168.64.1.56322 > rhel75.localdomain.ssh: Flags [.], ack 584, win 411, options [nop,nop,TS val 510771047 ecr 76577928], length 0
09:56:18.335569 IP gateway.domain > rhel75.56631: 29904 NXDomain* 0/1/0 (103)
09:56:18.336429 IP rhel75.44007 > gateway.domain: 61677+ PTR? 98.122.168.192.in-addr.arpa. (45)
09:56:18.336655 IP gateway.domain > rhel75.44007: 61677* 1/0/0 PTR rhel75. (65)
09:56:18.337177 IP rhel75.localdomain.ssh > 192.168.64.1.56322: Flags [P.], seq 584:1644, ack 1, win 309, options [nop,nop,TS val 76577942 ecr 510771047], length 1060

---- SKIPPING LONG OUTPUT -----

09:56:19.342939 IP 192.168.64.1.56322 > rhel75.localdomain.ssh: Flags [.], ack 1752016, win 1444, options [nop,nop,TS val 510772067 ecr 76578948], length 0
^C
9003 packets captured
9010 packets received by filter
7 packets dropped by kernel
$

Tcpdump continúa capturando paquetes hasta que recibe una señal de interrupción. Puede interrumpir la captura presionando Ctrl+C . Como puede ver en este ejemplo, tcpdump capturó más de 9.000 paquetes. En este caso, ya que estoy conectado a este servidor usando ssh , tcpdump capturó todos estos paquetes. Para limitar la cantidad de paquetes capturados y detener tcpdump , use el -c (para contar ) opción:

$ sudo tcpdump -i any -c 5
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
11:21:30.242740 IP rhel75.localdomain.ssh > 192.168.64.1.56322: Flags [P.], seq 3772575680:3772575876, ack 3503651743, win 309, options [nop,nop,TS val 81689848 ecr 515883153], length 196
11:21:30.242906 IP 192.168.64.1.56322 > rhel75.localdomain.ssh: Flags [.], ack 196, win 1443, options [nop,nop,TS val 515883235 ecr 81689848], length 0
11:21:30.244442 IP rhel75.43634 > gateway.domain: 57680+ PTR? 1.64.168.192.in-addr.arpa. (43)
11:21:30.244829 IP gateway.domain > rhel75.43634: 57680 NXDomain 0/0/0 (43)
11:21:30.247048 IP rhel75.33696 > gateway.domain: 37429+ PTR? 28.64.168.192.in-addr.arpa. (44)
5 packets captured
12 packets received by filter
0 packets dropped by kernel
$

En este caso, tcpdump dejó de capturar automáticamente después de capturar cinco paquetes. Esto es útil en diferentes escenarios, por ejemplo, si está solucionando problemas de conectividad y capturar algunos paquetes iniciales es suficiente. Esto es aún más útil cuando aplicamos filtros para capturar paquetes específicos (como se muestra a continuación).

De forma predeterminada, tcpdump resuelve las direcciones IP y los puertos en nombres, como se muestra en el ejemplo anterior. Al solucionar problemas de red, a menudo es más fácil usar las direcciones IP y los números de puerto; deshabilite la resolución de nombres usando la opción -n y resolución de puerto con -nn :

$ sudo tcpdump -i any -c5 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
23:56:24.292206 IP 192.168.64.28.22 > 192.168.64.1.35110: Flags [P.], seq 166198580:166198776, ack 2414541257, win 309, options [nop,nop,TS val 615664 ecr 540031155], length 196
23:56:24.292357 IP 192.168.64.1.35110 > 192.168.64.28.22: Flags [.], ack 196, win 1377, options [nop,nop,TS val 540031229 ecr 615664], length 0
23:56:24.292570 IP 192.168.64.28.22 > 192.168.64.1.35110: Flags [P.], seq 196:568, ack 1, win 309, options [nop,nop,TS val 615664 ecr 540031229], length 372
23:56:24.292655 IP 192.168.64.1.35110 > 192.168.64.28.22: Flags [.], ack 568, win 1400, options [nop,nop,TS val 540031229 ecr 615664], length 0
23:56:24.292752 IP 192.168.64.28.22 > 192.168.64.1.35110: Flags [P.], seq 568:908, ack 1, win 309, options [nop,nop,TS val 615664 ecr 540031229], length 340
5 packets captured
6 packets received by filter
0 packets dropped by kernel

Como se muestra arriba, la salida de la captura ahora muestra las direcciones IP y los números de puerto. Esto también evita que tcpdump emita búsquedas de DNS, lo que ayuda a reducir el tráfico de red mientras soluciona problemas de red.

Ahora que puede capturar paquetes de red, exploremos qué significa este resultado.

3. Comprender el formato de salida

Tcpdump es capaz de capturar y decodificar muchos protocolos diferentes, como TCP, UDP, ICMP y muchos más. Si bien no podemos cubrirlos todos aquí, para ayudarlo a comenzar, exploremos el paquete TCP. Puede encontrar más detalles sobre los diferentes formatos de protocolo en las páginas del manual de tcpdump. Un paquete TCP típico capturado por tcpdump se ve así:

08:41:13.729687 IP 192.168.64.28.22 > 192.168.64.1.41916: Flags [P.], seq 196:568, ack 1, win 309, options [nop,nop,TS val 117964079 ecr 816509256], length 372

Los campos pueden variar según el tipo de paquete que se envíe, pero este es el formato general.

El primer campo, 08:41:13.729687, representa la marca de tiempo del paquete recibido según el reloj local.

A continuación, IP representa el protocolo de la capa de red; en este caso, IPv4 . Para IPv6 paquetes, el valor es IP6 .

El siguiente campo, 192.168.64.28.22 , es la dirección IP y el puerto de origen. A esto le sigue la dirección IP y el puerto de destino, representado por 192.168.64.1.41916 .

Después del origen y el destino, puede encontrar las banderas TCP Flags [P.] . Los valores típicos para este campo incluyen:

Este campo también puede ser una combinación de estos valores, como [S.] para un SYN-ACK paquete.

El siguiente es el número de secuencia de los datos contenidos en el paquete. Para el primer paquete capturado, este es un número absoluto. Los paquetes subsiguientes usan un número relativo para que sea más fácil de seguir. En este ejemplo, la secuencia es seq 196:568, lo que significa que este paquete contiene los bytes 196 a 568 de este flujo.

Esto es seguido por el número de acuse de recibo:ack 1 . En este caso, es 1 ya que este es el lado que envía datos. Para el lado que recibe datos, este campo representa el siguiente byte esperado (datos) en este flujo. Por ejemplo, el número de acuse de recibo para el próximo paquete en este flujo sería 568.

El siguiente campo es el tamaño de la ventana win 309 , que representa el número de bytes disponibles en el búfer de recepción, seguido de opciones de TCP como MSS (Tamaño máximo de segmento) o Escala de ventana. Para obtener detalles sobre las opciones del protocolo TCP, consulte los parámetros del Protocolo de control de transmisión (TCP).

Finalmente, tenemos la longitud del paquete, length 372 , que representa la longitud, en bytes, de los datos de carga útil. La longitud es la diferencia entre el último y el primer byte del número de secuencia.

Ahora, aprendamos a filtrar paquetes para reducir los resultados y facilitar la resolución de problemas específicos.

4. Filtrado de paquetes

Como se mencionó anteriormente, tcpdump puede capturar demasiados paquetes, algunos de los cuales ni siquiera están relacionados con el problema que está solucionando. Por ejemplo, si está solucionando un problema de conectividad con un servidor web, no está interesado en el tráfico SSH, por lo que eliminar los paquetes SSH de la salida facilita el trabajo en el problema real.

Una de las funciones más potentes de tcpdump es su capacidad para filtrar los paquetes capturados utilizando una variedad de parámetros, como direcciones IP de origen y destino, puertos, protocolos, etc. Veamos algunos de los más comunes.

Protocolo

Para filtrar paquetes según el protocolo, especificando el protocolo en la línea de comando. Por ejemplo, capture paquetes ICMP solo usando este comando:

$ sudo tcpdump -i any -c5 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes

En una terminal diferente, intente hacer ping a otra máquina:

$ ping opensource.com
PING opensource.com (54.204.39.132) 56(84) bytes of data.
64 bytes from ec2-54-204-39-132.compute-1.amazonaws.com (54.204.39.132): icmp_seq=1 ttl=47 time=39.6 ms

De vuelta en la captura de tcpdump, observe que tcpdump captura y muestra solo los paquetes relacionados con ICMP. En este caso, tcpdump no muestra los paquetes de resolución de nombres que se generaron al resolver el nombre opensource.com :

09:34:20.136766 IP rhel75 > ec2-54-204-39-132.compute-1.amazonaws.com: ICMP echo request, id 20361, seq 1, length 64
09:34:20.176402 IP ec2-54-204-39-132.compute-1.amazonaws.com > rhel75: ICMP echo reply, id 20361, seq 1, length 64
09:34:21.140230 IP rhel75 > ec2-54-204-39-132.compute-1.amazonaws.com: ICMP echo request, id 20361, seq 2, length 64
09:34:21.180020 IP ec2-54-204-39-132.compute-1.amazonaws.com > rhel75: ICMP echo reply, id 20361, seq 2, length 64
09:34:22.141777 IP rhel75 > ec2-54-204-39-132.compute-1.amazonaws.com: ICMP echo request, id 20361, seq 3, length 64
5 packets captured
5 packets received by filter
0 packets dropped by kernel

Anfitrión

Limite la captura solo a paquetes relacionados con un host específico mediante el host filtro:

$ sudo tcpdump -i any -c5 -nn host 54.204.39.132
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
09:54:20.042023 IP 192.168.122.98.39326 > 54.204.39.132.80: Flags [S], seq 1375157070, win 29200, options [mss 1460,sackOK,TS val 122350391 ecr 0,nop,wscale 7], length 0
09:54:20.088127 IP 54.204.39.132.80 > 192.168.122.98.39326: Flags [S.], seq 1935542841, ack 1375157071, win 28960, options [mss 1460,sackOK,TS val 522713542 ecr 122350391,nop,wscale 9], length 0
09:54:20.088204 IP 192.168.122.98.39326 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 122350437 ecr 522713542], length 0
09:54:20.088734 IP 192.168.122.98.39326 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 122350438 ecr 522713542], length 112: HTTP: GET / HTTP/1.1
09:54:20.129733 IP 54.204.39.132.80 > 192.168.122.98.39326: Flags [.], ack 113, win 57, options [nop,nop,TS val 522713552 ecr 122350438], length 0
5 packets captured
5 packets received by filter
0 packets dropped by kernel

En este ejemplo, tcpdump captura y muestra solo paquetes hacia y desde el host 54.204.39.132 .

Puerto

Para filtrar paquetes según el servicio o puerto deseado, use el port filtrar. Por ejemplo, capture paquetes relacionados con un servicio web (HTTP) usando este comando:

$ sudo tcpdump -i any -c5 -nn port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
09:58:28.790548 IP 192.168.122.98.39330 > 54.204.39.132.80: Flags [S], seq 1745665159, win 29200, options [mss 1460,sackOK,TS val 122599140 ecr 0,nop,wscale 7], length 0
09:58:28.834026 IP 54.204.39.132.80 > 192.168.122.98.39330: Flags [S.], seq 4063583040, ack 1745665160, win 28960, options [mss 1460,sackOK,TS val 522775728 ecr 122599140,nop,wscale 9], length 0
09:58:28.834093 IP 192.168.122.98.39330 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 122599183 ecr 522775728], length 0
09:58:28.834588 IP 192.168.122.98.39330 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 122599184 ecr 522775728], length 112: HTTP: GET / HTTP/1.1
09:58:28.878445 IP 54.204.39.132.80 > 192.168.122.98.39330: Flags [.], ack 113, win 57, options [nop,nop,TS val 522775739 ecr 122599184], length 0
5 packets captured
5 packets received by filter
0 packets dropped by kernel

IP de origen/nombre de host

También puede filtrar paquetes según la dirección IP o el nombre de host de origen o destino. Por ejemplo, para capturar paquetes del host 192.168.122.98 :

$ sudo tcpdump -i any -c5 -nn src 192.168.122.98
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
10:02:15.220824 IP 192.168.122.98.39436 > 192.168.122.1.53: 59332+ A? opensource.com. (32)
10:02:15.220862 IP 192.168.122.98.39436 > 192.168.122.1.53: 20749+ AAAA? opensource.com. (32)
10:02:15.364062 IP 192.168.122.98.39334 > 54.204.39.132.80: Flags [S], seq 1108640533, win 29200, options [mss 1460,sackOK,TS val 122825713 ecr 0,nop,wscale 7], length 0
10:02:15.409229 IP 192.168.122.98.39334 > 54.204.39.132.80: Flags [.], ack 669337581, win 229, options [nop,nop,TS val 122825758 ecr 522832372], length 0
10:02:15.409667 IP 192.168.122.98.39334 > 54.204.39.132.80: Flags [P.], seq 0:112, ack 1, win 229, options [nop,nop,TS val 122825759 ecr 522832372], length 112: HTTP: GET / HTTP/1.1
5 packets captured
5 packets received by filter
0 packets dropped by kernel

Observe que tcpdumps capturó paquetes con la dirección IP de origen 192.168.122.98 para múltiples servicios como resolución de nombres (puerto 53) y HTTP (puerto 80). Los paquetes de respuesta no se muestran porque su IP de origen es diferente.

Por el contrario, puede utilizar el dst filtrar para filtrar por IP de destino/nombre de host:

$ sudo tcpdump -i any -c5 -nn dst 192.168.122.98
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
10:05:03.572931 IP 192.168.122.1.53 > 192.168.122.98.47049: 2248 1/0/0 A 54.204.39.132 (48)
10:05:03.572944 IP 192.168.122.1.53 > 192.168.122.98.47049: 33770 0/0/0 (32)
10:05:03.621833 IP 54.204.39.132.80 > 192.168.122.98.39338: Flags [S.], seq 3474204576, ack 3256851264, win 28960, options [mss 1460,sackOK,TS val 522874425 ecr 122993922,nop,wscale 9], length 0
10:05:03.667767 IP 54.204.39.132.80 > 192.168.122.98.39338: Flags [.], ack 113, win 57, options [nop,nop,TS val 522874436 ecr 122993972], length 0
10:05:03.672221 IP 54.204.39.132.80 > 192.168.122.98.39338: Flags [P.], seq 1:643, ack 113, win 57, options [nop,nop,TS val 522874437 ecr 122993972], length 642: HTTP: HTTP/1.1 302 Found
5 packets captured
5 packets received by filter
0 packets dropped by kernel

Expresiones complejas

También puede combinar filtros usando los operadores lógicos and y or para crear expresiones más complejas. Por ejemplo, para filtrar paquetes desde la dirección IP de origen 192.168.122.98 y solo servicio HTTP, use este comando:

$ sudo tcpdump -i any -c5 -nn src 192.168.122.98 and port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
10:08:00.472696 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [S], seq 2712685325, win 29200, options [mss 1460,sackOK,TS val 123170822 ecr 0,nop,wscale 7], length 0
10:08:00.516118 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [.], ack 268723504, win 229, options [nop,nop,TS val 123170865 ecr 522918648], length 0
10:08:00.516583 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [P.], seq 0:112, ack 1, win 229, options [nop,nop,TS val 123170866 ecr 522918648], length 112: HTTP: GET / HTTP/1.1
10:08:00.567044 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [.], ack 643, win 239, options [nop,nop,TS val 123170916 ecr 522918661], length 0
10:08:00.788153 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [F.], seq 112, ack 643, win 239, options [nop,nop,TS val 123171137 ecr 522918661], length 0
5 packets captured
5 packets received by filter
0 packets dropped by kernel

Puede crear expresiones más complejas agrupando el filtro con paréntesis. En este caso, encierre toda la expresión de filtro entre comillas para evitar que el shell las confunda con expresiones de shell:

$ sudo tcpdump -i any -c5 -nn "port 80 and (src 192.168.122.98 or src 54.204.39.132)"
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
10:10:37.602214 IP 192.168.122.98.39346 > 54.204.39.132.80: Flags [S], seq 871108679, win 29200, options [mss 1460,sackOK,TS val 123327951 ecr 0,nop,wscale 7], length 0
10:10:37.650651 IP 54.204.39.132.80 > 192.168.122.98.39346: Flags [S.], seq 854753193, ack 871108680, win 28960, options [mss 1460,sackOK,TS val 522957932 ecr 123327951,nop,wscale 9], length 0
10:10:37.650708 IP 192.168.122.98.39346 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 123328000 ecr 522957932], length 0
10:10:37.651097 IP 192.168.122.98.39346 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 123328000 ecr 522957932], length 112: HTTP: GET / HTTP/1.1
10:10:37.692900 IP 54.204.39.132.80 > 192.168.122.98.39346: Flags [.], ack 113, win 57, options [nop,nop,TS val 522957942 ecr 123328000], length 0
5 packets captured
5 packets received by filter
0 packets dropped by kernel

En este ejemplo, estamos filtrando paquetes solo para el servicio HTTP (puerto 80) y las direcciones IP de origen 192.168.122.98 o 54.204.39.132 . Esta es una forma rápida de examinar ambos lados del mismo flujo.

5. Comprobación del contenido del paquete

En los ejemplos anteriores, estamos revisando solo los encabezados de los paquetes para obtener información como el origen, los destinos, los puertos, etc. A veces, esto es todo lo que necesitamos para solucionar los problemas de conectividad de la red. A veces, sin embargo, necesitamos inspeccionar el contenido del paquete para asegurarnos de que el mensaje que enviamos contiene lo que necesitamos o que recibimos la respuesta esperada. Para ver el contenido del paquete, tcpdump proporciona dos banderas adicionales:-X para imprimir contenido en hexadecimal y ASCII o -A para imprimir el contenido en ASCII.

Por ejemplo, inspeccione el contenido HTTP de una solicitud web como esta:

$ sudo tcpdump -i any -c10 -nn -A port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
13:02:14.871803 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [S], seq 2546602048, win 29200, options [mss 1460,sackOK,TS val 133625221 ecr 0,nop,wscale 7], length 0
E..<..@[email protected].'[email protected]............
............................
13:02:14.910734 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [S.], seq 1877348646, ack 2546602049, win 28960, options [mss 1460,sackOK,TS val 525532247 ecr 133625221,nop,wscale 9], length 0
E..<..@./..a6.'...zb.P..o..&...A..q a..........
.R.W.......     ................
13:02:14.910832 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 133625260 ecr 525532247], length 0
E..4..@[email protected].'....P...Ao..'...........
.....R.W................
13:02:14.911808 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 133625261 ecr 525532247], length 112: HTTP: GET / HTTP/1.1
E.....@[email protected].'....P...Ao..'...........
.....R.WGET / HTTP/1.1
User-Agent: Wget/1.14 (linux-gnu)
Accept: */*
Host: opensource.com
Connection: Keep-Alive

................
13:02:14.951199 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [.], ack 113, win 57, options [nop,nop,TS val 525532257 ecr 133625261], length 0
E..4.F@./.."6.'...zb.P..o..'.......9.2.....
.R.a....................
13:02:14.955030 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [P.], seq 1:643, ack 113, win 57, options [nop,nop,TS val 525532258 ecr 133625261], length 642: HTTP: HTTP/1.1 302 Found
E....G@./...6.'...zb.P..o..'.......9.......
.R.b....HTTP/1.1 302 Found
Server: nginx
Date: Sun, 23 Sep 2018 17:02:14 GMT
Content-Type: text/html; charset=iso-8859-1
Content-Length: 207
X-Content-Type-Options: nosniff
Location: https://opensource.com/
Cache-Control: max-age=1209600
Expires: Sun, 07 Oct 2018 17:02:14 GMT
X-Request-ID: v-6baa3acc-bf52-11e8-9195-22000ab8cf2d
X-Varnish: 632951979
Age: 0
Via: 1.1 varnish (Varnish/5.2)
X-Cache: MISS
Connection: keep-alive

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="https://opensource.com/%3C/span%3Ehttps%3A%3Cspan%20class%3D"sy0">//opensource.com/">here</a>.</p>
</body></html>
................
13:02:14.955083 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [.], ack 643, win 239, options [nop,nop,TS val 133625304 ecr 525532258], length 0
E..4..@[email protected].'....P....o..............
.....R.b................
13:02:15.195524 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [F.], seq 113, ack 643, win 239, options [nop,nop,TS val 133625545 ecr 525532258], length 0
E..4..@[email protected].'....P....o..............
.....R.b................
13:02:15.236592 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [F.], seq 643, ack 114, win 57, options [nop,nop,TS val 525532329 ecr 133625545], length 0
E..4.H@./.. 6.'...zb.P..o..........9.I.....
.R......................
13:02:15.236656 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [.], ack 644, win 239, options [nop,nop,TS val 133625586 ecr 525532329], length 0
E..4..@[email protected].'....P....o..............
.....R..................
10 packets captured
10 packets received by filter
0 packets dropped by kernel

Esto es útil para solucionar problemas con las llamadas a la API, suponiendo que las llamadas utilicen HTTP simple. Para conexiones encriptadas, esta salida es menos útil.

6. Guardar capturas en un archivo

Otra característica útil proporcionada por tcpdump es la capacidad de guardar la captura en un archivo para que pueda analizar los resultados más tarde. Esto le permite capturar paquetes en modo por lotes durante la noche, por ejemplo, y verificar los resultados por la mañana. También ayuda cuando hay demasiados paquetes para analizar, ya que la captura en tiempo real puede ocurrir demasiado rápido.

Para guardar paquetes en un archivo en lugar de mostrarlos en la pantalla, use la opción -w (para escribir ):

$ sudo tcpdump -i any -c10 -nn -w webserver.pcap port 80
[sudo] password for ricardo:
tcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
10 packets captured
10 packets received by filter
0 packets dropped by kernel

Este comando guarda la salida en un archivo llamado webserver.pcap . El .pcap extensión significa "captura de paquetes" y es la convención para este formato de archivo.

Como se muestra en este ejemplo, no se muestra nada en la pantalla y la captura finaliza después de capturar 10 paquetes, según la opción -c10 . Si desea recibir comentarios para asegurarse de que se capturan los paquetes, use la opción -v .

Tcpdump crea un archivo en formato binario para que no pueda abrirlo simplemente con un editor de texto. Para leer el contenido del archivo, ejecute tcpdump con -r (para leer ) opción:

$ tcpdump -nn -r webserver.pcap
reading from file webserver.pcap, link-type LINUX_SLL (Linux cooked)
13:36:57.679494 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [S], seq 3709732619, win 29200, options [mss 1460,sackOK,TS val 135708029 ecr 0,nop,wscale 7], length 0
13:36:57.718932 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [S.], seq 1999298316, ack 3709732620, win 28960, options [mss 1460,sackOK,TS val 526052949 ecr 135708029,nop,wscale 9], length 0
13:36:57.719005 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 135708068 ecr 526052949], length 0
13:36:57.719186 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 135708068 ecr 526052949], length 112: HTTP: GET / HTTP/1.1
13:36:57.756979 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [.], ack 113, win 57, options [nop,nop,TS val 526052959 ecr 135708068], length 0
13:36:57.760122 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [P.], seq 1:643, ack 113, win 57, options [nop,nop,TS val 526052959 ecr 135708068], length 642: HTTP: HTTP/1.1 302 Found
13:36:57.760182 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [.], ack 643, win 239, options [nop,nop,TS val 135708109 ecr 526052959], length 0
13:36:57.977602 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [F.], seq 113, ack 643, win 239, options [nop,nop,TS val 135708327 ecr 526052959], length 0
13:36:58.022089 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [F.], seq 643, ack 114, win 57, options [nop,nop,TS val 526053025 ecr 135708327], length 0
13:36:58.022132 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [.], ack 644, win 239, options [nop,nop,TS val 135708371 ecr 526053025], length 0
$

Dado que ya no está capturando los paquetes directamente desde la interfaz de red, sudo no es necesario leer el archivo.

También puede usar cualquiera de los filtros que hemos discutido para filtrar el contenido del archivo, tal como lo haría con datos en tiempo real. Por ejemplo, inspeccione los paquetes en el archivo de captura desde la dirección IP de origen 54.204.39.132 ejecutando este comando:

$ tcpdump -nn -r webserver.pcap src 54.204.39.132
reading from file webserver.pcap, link-type LINUX_SLL (Linux cooked)
13:36:57.718932 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [S.], seq 1999298316, ack 3709732620, win 28960, options [mss 1460,sackOK,TS val 526052949 ecr 135708029,nop,wscale 9], length 0
13:36:57.756979 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [.], ack 113, win 57, options [nop,nop,TS val 526052959 ecr 135708068], length 0
13:36:57.760122 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [P.], seq 1:643, ack 113, win 57, options [nop,nop,TS val 526052959 ecr 135708068], length 642: HTTP: HTTP/1.1 302 Found
13:36:58.022089 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [F.], seq 643, ack 114, win 57, options [nop,nop,TS val 526053025 ecr 135708327], length 0

¿Qué sigue?

Estas características básicas de tcpdump lo ayudarán a comenzar con esta poderosa y versátil herramienta. Para obtener más información, consulte el sitio web de tcpdump y las páginas man.

La interfaz de línea de comandos tcpdump proporciona una gran flexibilidad para capturar y analizar el tráfico de red. If you need a graphical tool to understand more complex flows, look at Wireshark.

One benefit of Wireshark is that it can read .pcap files captured by tcpdump. You can use tcpdump to capture packets in a remote machine that does not have a GUI and analyze the result file with Wireshark, but that is a topic for another day.


This article was originally published in October 2018 and has been updated by Seth Kenlon.


Linux
  1. 8 consejos para la línea de comandos de Linux

  2. Introducción al comando chown de Linux

  3. Usando la fuerza en la línea de comando de Linux

  4. Tener una vaca en la línea de comandos de Linux

  5. Encárguese en la línea de comandos de Linux

Resuelve Wordle usando la línea de comandos de Linux

Uso de más para ver archivos de texto en la línea de comandos de Linux

Uso de less para ver archivos de texto en la línea de comandos de Linux

Usando el comando libre de Linux

Domina la línea de comandos de Linux

Tutorial sobre el uso del comando Timeout en Linux

    Valor Tipo de bandera Descripción
    S SYN Inicio de conexión
    F FIN Finalización de la conexión
    P EMPUJAR Envío de datos
    R PRIMERA Restablecimiento de conexión
    . RECONOCIMIENTO Reconocimiento