Hoy he tenido que hacer un poco de troubleshooting en la red del trabajo. En ocasiones hay situaciones en las que sabes que algo no está bien en la comunicación de red pero no llegas a detectar la causa exacta. Estos son problemas de conectividad de red que pueden ser difíciles de solucionar. Pero para esas situaciones en Linux tenemos tcpdump.
Tcpdump es una utilidad de línea de comandos que le permite capturar y analizar en vivo el tráfico de red que pasa por su sistema. A menudo se utiliza para ayudar a solucionar problemas de red, así como también es usado como una herramienta para auditar la seguridad de nuestra red. Personalmente creo que se trata de una herramienta para linea de comandos muy potente y versátil. No tiene GUI pero es ideal para trabajar en entorno de servidores en remoto o para programar su ejecución usando cron.
1. Instalación en Linux
Tcpdump se incluye por defecto en la mayoría de las distribuciones de Linux, por lo que es probable que no tengamos que hacer gran cosa aquí. Podemos verificar si la utilidad está instalado con el siguiente comando:
$ which tcpdump
/usr/sbin/tcpdump
Y en caso de que tcpdump no esté instalado, instalarlo mediante sudo apt install tcpdump
2. Captura de paquetes con tcpdump
Para capturar paquetes tcpdump requiere permisos elevados, por lo que en los siguientes ejemplos la mayoría de los comandos tienen el prefijo sudo. Con el comando tcpdump –list-interfaces (o -D para abreviar) podemos ver interfaces están disponibles para la captura:
sudo tcpdump -D
1.wlp3s0 [Up, Running]
2.lo [Up, Running, Loopback]
3.any (Pseudo-device that captures on all interfaces) [Up, Running]
4.enp0s25 [Up]
5.bluetooth-monitor (Bluetooth Linux Monitor) [none]
6.nflog (Linux netfilter log (NFLOG) interface) [none]
7.nfqueue (Linux netfilter queue (NFQUEUE) interface) [none]
En el ejemplo anterior, puede ver todas las interfaces disponibles en mi máquina.
La interfaz especial any permite capturar en cualquier interfaz activa. Por ejemplo, para capturar paquetes desde cualquier interface esto sería así:
sudo tcpdump --interface any
Y el resultado será algo similar a lo siguiente:
14:16:18.070714 IP 192.168.0.14.47631 > 239.255.255.250.1900: UDP, length 94
14:16:18.071780 IP localhost.43006 > localhost.domain: 3678+ PTR? 250.255.255.239.in-addr.arpa. (46)
14:16:18.072187 IP ayanami.59991 > www.wifilowi.es.domain: 50921+ [1au] PTR? 250.255.255.239.in-addr.arpa. (57)
14:16:18.072401 IP 192.168.0.14.47631 > 239.255.255.250.1900: UDP, length 94
14:16:18.172337 IP 192.0.78.22.https > ayanami.33116: Flags [P.], seq 2860138153:2860138177, ack 2522125278, win 65, length 24
14:16:18.172543 IP ayanami.33116 > 192.0.78.22.https: Flags [P.], seq 1:29, ack 24, win 501, length 28
14:16:18.230344 IP 192.0.78.22.https > ayanami.33116: Flags [.], ack 29, win 65, length 0
14:16:33.181219 IP localhost.47352 > localhost.domain: 34934+ PTR? 53.0.0.127.in-addr.arpa. (41)
14:16:39.023171 IP localhost.36863 > localhost.domain: 5130+ PTR? 22.78.0.192.in-addr.arpa. (42)
14:16:39.169457 IP ayanami.33712 > 162.125.19.130.https: Flags [P.], seq 306154017:306154158, ack 4085402873, win 501, options [nop,nop,TS val 2545690530 ecr 1682761596], length 141
Pero claro, TCPdump captura paquetes hasta que reciba una señal de interrupción. ¿Y cual es esta? Para interrumpir la captura podemos presionar Ctrl + C pero podemos limitar la cantidad de paquetes a capturar mediante la opción -c (para contar):
sudo tcpdump -i any -c 50000
De forma predeterminada, tcpdump resuelve las direcciones IP y los puertos en nombres, como se muestra en el ejemplo anterior. Para solucionar problemas de red, a menudo es más fácil utilizar las direcciones IP y los números de puerto por lo que es una buena idea deshabilitar la resolución de nombres usando la opción -n y la resolución de puertos con -nn:
sudo tcpdump -i any -c5000 -nn
3. Filtrado de paquetes
Una de las características más poderosas de tcpdump es su capacidad para filtrar los paquetes capturados usando una variedad de parámetros, como direcciones IP de origen y destino, puertos, protocolos, etc. Por ejemplo, si estamos trabajando en la resolución de un problema de conectividad igual no estamos interesados en el tráfico SSH o si estamos conectándonos mediante RDP pues podemos eliminar de la traza la comunicación que generamos de la captura de datos.
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 con este comando:
sudo tcpdump -i any -c500 icmp
- Host
sudo tcpdump -i any -c500 -nn host 54.204.30.102
- Puerto
sudo tcpdump -i any -c500 -nn port 80
- IP de origen o destino
sudo tcpdump -i any -c500 -nn src 192.168.1.98
sudo tcpdump -i any -c500 -nn dst 192.168.1.98
4. Guardar capturas en un archivo
Otra característica útil proporcionada por tcpdump es la capacidad de guardar la captura en un archivo para que podamos analizar los resultados más tarde. Algo muy recomendable por cierto 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 packet.pcap port 80
Tcpdump crea un archivo en formato binario, por lo que no puede simplemente abrirlo con un editor de texto. Para leer el contenido del archivo, ejecute tcpdump con la opción -r (para lectura):
tcpdump -nn -r packet.pcap
Más información: https://www.tcpdump.org