Cómo verificar las conexiones entrantes y salientes con Tcpdump en Linux

27 feb 2021 7 min di lettura
Cómo verificar las conexiones entrantes y salientes con Tcpdump en Linux
Indice dei contenuti

Introducción

tcpdump es una utilidad de línea de comandos que puede utilizar para capturar e inspeccionar el tráfico de red hacia y desde el sistema. Es la herramienta más utilizada por los administradores de red para la resolución de problemas de red y las pruebas de seguridad.

A pesar del nombre, con tcpdump, también es posible capturar tráfico no TCP como UDP, ARP o ICMP. Los paquetes capturados se pueden escribir en un archivo o en una salida estándar. Una de las características más poderosas del tcpdump es su capacidad para usar filtros y capturar solo los datos que desea analizar.

En este artículo, cubriremos los conceptos básicos de cómo usar el tcpdump en Linux.

Si desea instalar Tcpdump en un servidor remoto, continúe leyendo, de lo contrario omita el primer párrafo "Conectando al servidor" y lea el siguiente.

Conexión al servidor

Para acceder al servidor, necesita conocer la dirección IP. También necesitará su nombre de usuario y contraseña para la autenticación. Para conectarse al servidor como root, escriba el siguiente comando:

ssh root@IP_DEL_SERVER

A continuación, deberá ingresar la contraseña del usuario root.

Si no está utilizando el usuario root, puede iniciar sesión con otro nombre de usuario utilizando el mismo comando, luego cambie root a su nombre de usuario:

ssh nome_utente@IP_DEL_SERVER

Luego se le pedirá que ingrese su contraseña de usuario.

El puerto estándar para conectarse a través de ssh es 22, si su servidor usa un puerto diferente, deberá especificarlo usando el parámetro -p, luego escriba el siguiente comando:

ssh nome_utente@IP_DEL_SERVER -p PORTA

Instalar Tcpdump

tcpdump se instala de forma predeterminada en la mayoría de las distribuciones de Linux y macOS. Para verificar si el tcpdump está disponible en su tipo de sistema, use el siguiente comando:

tcpdump --version

Si tcpdump no está presente en su sistema, el comando anterior imprimirá "tcpdump: comando no encontrado". Puede instalar tcpdump fácilmente usando el administrador de paquetes de su distribución.

Instale Tcpdump en Ubuntu y Debian

sudo apt update && sudo apt install tcpdump

Instale Tcpdump en CentOS y Fedora

sudo yum install tcpdump

Instalar Tcpdump en Arch Linux

sudo pacman -S tcpdump

Luego verifique la instalación correcta con el siguiente comando:

tcpdump --version

La salida debería verse así:

tcpdump version 4.9.3
 libpcap version 1.8.1
 OpenSSL 1.1.1d 10 Sep 2019

Adquirir paquetes con tcpdump

La sintaxis general del tcpdump es la siguiente:

tcpdump [options] [expression]
  • El options permite controlar el comportamiento del comando.
  • El expression define qué paquetes se capturarán.

El tcpdump solo puede ser ejecutado por root o por usuarios con privilegios sudo Si intenta ejecutar el comando como un usuario sin privilegios, recibirá un mensaje de error: "No tiene permiso para capturar en ese dispositivo".

El caso de uso más simple es invocar tcpdump sin opciones ni filtros:

sudo tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
 listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
 21:28:50.627720 IP static.78.18.201.195.clients.your-server.de.ssh > 2-226-134-97.ip181.domain.it.65328: Flags [P.], seq 3036272519:3036272647, ack 288322885, win 1452, length 128
 21:28:50.627782 IP static.78.18.201.195.clients.your-server.de.ssh > 2-226-134-97.ip181.domain.it.65328: Flags [P.], seq 128:192, ack 1, win 1452, length 64
 21:28:50.627823 IP static.78.18.201.195.clients.your-server.de.ssh > 2-226-134-97.ip181.domain.it.65328: Flags [P.], seq 192:320, ack 1, win 1452, length 128
 21:28:50.627863 IP static.78.18.201.195.clients.your-server.de.ssh > 2-226-134-97.ip181.domain.it.65328: Flags [P.], seq 320:384, ack 1, win 1452, length 64...

 29 packets captured
 45 packets received by filter
 10 packets dropped by kernel

tcpdump continuará capturando paquetes y escribiendo en la salida estándar hasta que reciba una señal de interrupción. Utilice la combinación de Ctrl+C para enviar una señal de interrupción y abortar el comando.

Para obtener resultados más detallados, use la -v o -vv para obtener resultados aún más detallados:

sudo tcpdump -vv

Puede especificar el número de paquetes a capturar usando la opción -c Por ejemplo, para capturar solo diez paquetes, escriba:

sudo tcpdump -c 10

Después de capturar los paquetes, tcpdump se detendrá.

Cuando no se especifica una interfaz, tcpdump usa la primera interfaz que encuentra y descarga todos los paquetes que pasan por esa interfaz.

Utilice la -D para imprimir una lista de todas las interfaces de red disponibles de las que tcpdump puede recopilar paquetes:

sudo tcpdump -D

Para cada interfaz, el comando imprime el nombre de la interfaz, una breve descripción y un índice asociado (número):

1.eth0 [Up, Running]
 2.any (Pseudo-device that captures on all interfaces) [Up, Running]
 3.lo [Up, Running, Loopback]
 4.nflog (Linux netfilter log (NFLOG) interface)
 5.nfqueue (Linux netfilter queue (NFQUEUE) interface)
 6.usbmon1 (USB bus number 1)
 7.usbmon2 (USB bus number 2)

El resultado anterior muestra que eth0 es la primera interfaz encontrada y utilizada por tcpdump cuando no se proporciona ninguna interfaz al comando. La segunda, any interfaz, es un dispositivo especial que le permite capturar todas las interfaces activas.

Para especificar la interfaz en la que desea capturar el tráfico, invoque el comando con la -i seguida del nombre de la interfaz o el índice asociado. Por ejemplo, para obtener todos los paquetes de todas las interfaces, debe especificar la interfaz any

sudo tcpdump -i any

De forma predeterminada, tcpdump realiza una resolución DNS inversa en direcciones IP y traduce los números de puerto en nombres. Use la -n para deshabilitar la traducción:

sudo tcpdump -n

Omitir la búsqueda de DNS evita generar tráfico de DNS y hace que la salida sea más legible. Se recomienda que utilice esta opción siempre que invoque tcpdump.

En lugar de mostrar la salida en la pantalla, puede redirigirla a un archivo usando los operadores de redirección > y >>

sudo tcpdump -n -i any > file.out

También puede mirar los datos mientras los guarda en un archivo usando el comando tee

sudo tcpdump -n -l | tee file.out

La -l en el comando anterior permite a tcpdump almacenar en búfer la línea de salida. Cuando no se utiliza esta opción, la salida no se escribirá en la pantalla cuando se genere una nueva línea.

Comprender la salida de tcpdump

tcpdump genera información para cada paquete capturado en una nueva línea. Cada línea incluye una marca de tiempo e información sobre ese paquete, según el protocolo.

El formato típico de una línea de protocolo TCP es el siguiente:

[Timestamp] [Protocol] [Src IP].[Src Port] > [Dst IP].[Dst Port]: [Flags], [Seq], [Ack], [Win Size], [Options], [Data Length]

Vamos campo por campo y explicamos la siguiente línea:

15:47:24.248737 IP 192.168.1.27.22 > 192.168.1.15.37445: Flags [P.], seq 201747193:201747301, ack 1226568763, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 108
  • 15:47:24.248737 marca de tiempo del paquete capturado está en la hora local y utiliza el siguiente formato:, hours:minutes:seconds.frac donde frac son fracciones de segundo desde la medianoche.
  • IP: el protocolo del paquete. En este caso, IP significa Protocolo de Internet versión 4 (IPv4).
  • 192.168.1.27.22: la dirección IP de origen y el puerto separados por un punto ( . ).
  • 192.168.1.15.37445: la dirección IP de destino y el puerto separados por un punto ( . ).

Flags [P.] - Campo de bandera de TCP. En este ejemplo, [P.] significa paquete de confirmación de inserción, que se utiliza para reconocer el paquete anterior y enviar datos. Otros valores típicos de los campos de bandera son los siguientes:

  • [.] - ACK (reconocimiento)
  • [S] - SYN (Iniciar conexión)
  • [P] - PSH (datos de inserción)
  • [F] - FIN (Terminar conexión)
  • [R] - RST (restablecer conexión)
  • [S.] - SYN-ACK (paquete SynAcK)
  • seq 201747193:201747301 - El número secuencial está en la first:last notación. Muestra la cantidad de datos contenidos en el paquete. Excepto por el primer paquete en el flujo de datos donde estos números son absolutos, todos los paquetes subsiguientes se usan como posiciones relativas de bytes. En este ejemplo, el número es 201747193:201747301, lo que significa que este paquete contiene bytes de 201747193 a 201747301 del flujo de datos. Utilice la -S para imprimir números de secuencia absolutos.
  • ack 1226568763 El número de acuse de recibo es el número progresivo de los datos posteriores que se esperan del otro extremo de esta conexión.
  • win 402: el número de ventana es el número de bytes disponibles en el búfer de recepción.
  • options [nop,nop,TS val 1051794587 ecr 2679218230] - Opciones de TCP. nop o "sin operación" se utiliza para hacer que el encabezado TCP sea múltiplo de 4 bytes. TS val es una marca de tiempo de TCP y ecr representa una respuesta de eco. Visite la documentación de IANA para obtener más información sobre las opciones de TCP.
  • length 108 - La longitud de los datos de carga útil

Filtros tcpdump

Cuando tcpdump se invoca sin filtrar, captura todo el tráfico y produce una gran cantidad de resultados, lo que dificulta la búsqueda y el análisis de paquetes de interés.

Los filtros son una de las características más poderosas del comando tcpdump Le permiten capturar solo aquellos paquetes que coinciden con la expresión. Por ejemplo, al solucionar problemas de un servidor web, puede utilizar filtros para obtener solo tráfico HTTP.

tcpdump usa la sintaxis de Berkeley Packet Filter (BPF) para filtrar los paquetes capturados usando varios parámetros de procesamiento como protocolos, direcciones IP de origen y destino y puertos, etc.

En este artículo, veremos algunos de los filtros más comunes. Para obtener una lista de todos los filtros disponibles, consulte la página de manual de pcap-filter.

Filtrar por protocolo

Para limitar la adquisición a un protocolo en particular, especifique el protocolo como filtro. Por ejemplo, para capturar tráfico UDP solo debe usar:

sudo tcpdump -n udp

Otra forma de definir el protocolo es utilizar el proto, seguido del número de protocolo. El siguiente comando filtrará el protocolo número 17 y producirá el mismo resultado que el anterior:

sudo tcpdump -n proto 17

Para obtener más información sobre los números, consulte la lista de números de protocolo IP.

Filtrar por host

Para capturar solo los paquetes relacionados con un host específico, use el parámetro de host

sudo tcpdump -n host 192.168.1.22

El host puede ser una dirección IP o un nombre.

También puede filtrar la salida en un rango de IP particular usando el parámetro net Por ejemplo, para volcar solo los paquetes relacionados 10.10.0.0/16, debe usar:

sudo tcpdump -n net 10.10

Filtro de puerta

Para limitar la captura a solo paquetes hacia o desde un puerto específico, use el parámetro de port El siguiente comando adquiere paquetes relacionados con el servicio SSH (puerto 22) usando este comando:

sudo tcpdump -n port 22

El portrange permite capturar tráfico en una serie de puertos:

sudo tcpdump -n portrange 110-150

Filtrar por origen y destino

También puede filtrar paquetes por puerto o host de origen o destino utilizando los parámetros src, dst, src and dst y src or dst

El siguiente comando adquiere paquetes del host con IP 192.168.1.22:

sudo tcpdump -n src host 192.168.1.22

Para encontrar el tráfico de cualquier fuente al puerto 80, deberá utilizar:

sudo tcpdump -n dst port 80

Filtros complejos

Los filtros se pueden combinar utilizando los && and (&&), or (

Support us with a

Successivamente, completa il checkout per l'accesso completo a Noviello.it.
Bentornato! Accesso eseguito correttamente.
Ti sei abbonato con successo a Noviello.it.
Successo! Il tuo account è completamente attivato, ora hai accesso a tutti i contenuti.
Operazione riuscita. Le tue informazioni di fatturazione sono state aggiornate.
La tua fatturazione non è stata aggiornata.