Cuando surgen problemas de red — conexiones que expiran, servicios inalcanzables o patrones de tráfico inesperados — necesitas ver qué está sucediendo realmente en el cable. tcpdump es la herramienta estándar de captura de paquetes por línea de comandos en Linux, instalada en prácticamente todos los servidores y capaz de interceptar, filtrar y registrar tráfico de red a nivel de paquete. Es la forma más rápida de diagnosticar problemas de red directamente en un servidor de producción.
Esta guía cubre el uso práctico de tcpdump desde capturas básicas hasta filtrado avanzado, análisis de protocolos e integración con Wireshark para inspección visual.
Requisitos Previos
Antes de comenzar, asegúrate de tener:
- Un sistema Linux (Ubuntu, Debian, RHEL/CentOS, Fedora o similar)
- Acceso a la terminal con privilegios sudo (tcpdump requiere root para la captura de paquetes)
- Comprensión básica de redes TCP/IP (direcciones IP, puertos, TCP vs UDP)
Instalación de tcpdump
tcpdump viene preinstalado en la mayoría de las distribuciones Linux. Verifica o instálalo:
# Debian/Ubuntu
sudo apt update && sudo apt install tcpdump
# RHEL/Fedora/CentOS
sudo dnf install tcpdump
# Verify installation
tcpdump --version
Identificación de Interfaces de Red
Antes de capturar, identifica qué interfaz transporta el tráfico que deseas inspeccionar:
# List all interfaces tcpdump can capture on
sudo tcpdump -D
# Or use ip to show interfaces
ip link show
Salida típica:
1.eth0 [Up, Running, Connected]
2.lo [Up, Running, Loopback]
3.docker0 [Up, Running, Connected]
4.any (Pseudo-device that captures on all interfaces) [Up, Running]
Usa any para capturar en todas las interfaces simultáneamente, o especifica una sola interfaz para obtener una salida más limpia.
Captura Básica
Capturar Todo el Tráfico en una Interfaz
sudo tcpdump -i eth0
Esto muestra cada paquete en tiempo real. Presiona Ctrl+C para detener. La salida muestra una línea por paquete:
14:23:45.123456 IP 10.0.1.5.22 > 10.0.1.1.54321: Flags [P.], seq 1:53, ack 1, win 502, length 52
Campos: marca de tiempo, protocolo, IP origen.puerto, IP destino.puerto, flags TCP, números de secuencia/confirmación, tamaño de ventana y longitud de la carga útil.
Limitar el Número de Paquetes
# Stop after capturing 50 packets
sudo tcpdump -i eth0 -c 50
Salida Detallada
# More detail (TTL, IP options, checksum)
sudo tcpdump -i eth0 -v
# Even more detail
sudo tcpdump -i eth0 -vv
# Maximum verbosity
sudo tcpdump -i eth0 -vvv
Mostrar Direcciones IP en Lugar de Nombres de Host
# Don't resolve hostnames (faster output)
sudo tcpdump -i eth0 -n
# Don't resolve hostnames or port names
sudo tcpdump -i eth0 -nn
Consejo: Usa siempre
-nnen producción. La resolución DNS para cada paquete ralentiza la captura y puede generar tráfico adicional.
Filtros de Captura
Los filtros son la característica más importante de tcpdump. Utilizan la sintaxis BPF (Berkeley Packet Filter) y se aplican durante la captura, reduciendo el ruido antes de que llegue a tu pantalla.
Filtrar por Host
# Traffic to or from a specific IP
sudo tcpdump -i eth0 host 10.0.1.5
# Only traffic FROM a specific IP
sudo tcpdump -i eth0 src host 10.0.1.5
# Only traffic TO a specific IP
sudo tcpdump -i eth0 dst host 10.0.1.5
Filtrar por Puerto
# HTTP traffic
sudo tcpdump -i eth0 port 80
# HTTPS traffic
sudo tcpdump -i eth0 port 443
# SSH traffic
sudo tcpdump -i eth0 port 22
# DNS traffic
sudo tcpdump -i eth0 port 53
# Source port only
sudo tcpdump -i eth0 src port 443
# Destination port only
sudo tcpdump -i eth0 dst port 8080
Filtrar por Protocolo
# Only TCP packets
sudo tcpdump -i eth0 tcp
# Only UDP packets
sudo tcpdump -i eth0 udp
# Only ICMP (ping) packets
sudo tcpdump -i eth0 icmp
# Only ARP packets
sudo tcpdump -i eth0 arp
Filtrar por Red (Subred)
# All traffic to or from a subnet
sudo tcpdump -i eth0 net 10.0.1.0/24
# Traffic between two subnets
sudo tcpdump -i eth0 src net 10.0.1.0/24 and dst net 10.0.2.0/24
Combinación de Filtros
Usa and, or y not (o &&, ||, !) para combinar condiciones:
# HTTPS traffic to a specific host
sudo tcpdump -i eth0 host 10.0.1.5 and port 443
# HTTP or HTTPS traffic
sudo tcpdump -i eth0 port 80 or port 443
# All traffic except SSH
sudo tcpdump -i eth0 not port 22
# Complex filter: HTTP traffic from one host, excluding a specific IP
sudo tcpdump -i eth0 'src host 10.0.1.5 and port 80 and not dst host 10.0.1.1'
Rangos de Puertos
# Ports 8000 through 8999
sudo tcpdump -i eth0 portrange 8000-8999
Filtrar por Flags TCP
# Only SYN packets (new connections)
sudo tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn) != 0'
# Only SYN-ACK packets (connection responses)
sudo tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn|tcp-ack) == (tcp-syn|tcp-ack)'
# Only RST packets (connection resets)
sudo tcpdump -i eth0 'tcp[tcpflags] & (tcp-rst) != 0'
# Only FIN packets (connection closures)
sudo tcpdump -i eth0 'tcp[tcpflags] & (tcp-fin) != 0'
Guardar y Leer Archivos de Captura
Escribir en un Archivo pcap
# Save all traffic to a file
sudo tcpdump -i eth0 -w /tmp/capture.pcap
# Save with a filter
sudo tcpdump -i eth0 -w /tmp/https.pcap port 443
# Rotate files every 100MB, keeping 5 files
sudo tcpdump -i eth0 -w /tmp/capture-%Y%m%d-%H%M%S.pcap -C 100 -W 5
Leer un Archivo pcap
# Read all packets from a file
tcpdump -r /tmp/capture.pcap
# Read with filters (applied on display)
tcpdump -r /tmp/capture.pcap port 443
# Read with full detail
tcpdump -r /tmp/capture.pcap -nn -vvv
Transferir a Wireshark
El formato pcap es universal. Copia el archivo a tu estación de trabajo y ábrelo en Wireshark:
# Copy from server to local machine
scp user@server:/tmp/capture.pcap ~/Desktop/
# Or capture remotely and pipe directly to Wireshark
ssh user@server 'sudo tcpdump -i eth0 -w - port 443' | wireshark -k -i -
Visualización del Contenido de Paquetes
Mostrar la Carga Útil como ASCII
# Print packet content in ASCII
sudo tcpdump -i eth0 -A port 80
Esto es útil para inspeccionar solicitudes y respuestas HTTP en texto plano.
Mostrar la Carga Útil como Hex y ASCII
# Hex + ASCII dump
sudo tcpdump -i eth0 -X port 80
# Hex + ASCII with link-layer header
sudo tcpdump -i eth0 -XX port 80
Controlar el Tamaño de Captura
# Capture only first 96 bytes (headers only)
sudo tcpdump -i eth0 -s 96
# Capture full packets (no truncation)
sudo tcpdump -i eth0 -s 0
Ejemplos Prácticos de Solución de Problemas
Diagnosticar Problemas de Resolución DNS
# Capture all DNS traffic
sudo tcpdump -i eth0 -nn port 53
# Watch for DNS queries and responses with detail
sudo tcpdump -i eth0 -nn -vv port 53
Busca: consultas sin respuestas (servidor DNS inalcanzable), respuestas NXDOMAIN (el nombre no existe) o tiempos de respuesta inusualmente lentos.
Depurar Problemas de Conexión HTTP
# See TCP handshake and HTTP requests
sudo tcpdump -i eth0 -nn -A 'host example.com and port 80'
# Check if connections are being reset
sudo tcpdump -i eth0 -nn 'host example.com and tcp[tcpflags] & (tcp-rst) != 0'
Identificar Conexiones Excesivas
# Count connections to port 443 per source IP
sudo tcpdump -i eth0 -nn dst port 443 -c 10000 2>/dev/null | \
awk '{print $3}' | cut -d. -f1-4 | sort | uniq -c | sort -rn | head -20
Monitorear Tráfico de Base de Datos
# MySQL traffic (port 3306)
sudo tcpdump -i eth0 -nn port 3306
# PostgreSQL traffic (port 5432)
sudo tcpdump -i eth0 -nn port 5432 -c 100
Verificar Ataques de SYN Flood
# Count SYN packets per second
sudo tcpdump -i eth0 -nn 'tcp[tcpflags] == tcp-syn' 2>/dev/null | \
awk '{print substr($1,1,8)}' | uniq -c
Capturar Problemas ICMP (Ping)
# All ICMP traffic
sudo tcpdump -i eth0 -nn icmp
# Specific: ping to a host
sudo tcpdump -i eth0 -nn 'icmp and host 10.0.1.1'
Busca: respuestas “unreachable”, TTL excedido o echo replies faltantes.
Depurar el Handshake TLS/SSL
# Capture TLS Client Hello (first message of TLS handshake)
sudo tcpdump -i eth0 -nn 'tcp port 443 and (tcp[((tcp[12:1] & 0xf0) >> 2):1] = 0x16)'
Consideraciones de Rendimiento
Reducir la Sobrecarga de Salida
# Disable DNS resolution (-nn)
# Limit capture length (-s 96) if you only need headers
# Write to file (-w) instead of displaying on screen
sudo tcpdump -i eth0 -nn -s 96 -w /tmp/capture.pcap port 443
Ring Buffer para Capturas Prolongadas
# Rotate files: 10 files of 50MB each (500MB total ring buffer)
sudo tcpdump -i eth0 -w /tmp/cap.pcap -C 50 -W 10
Cuando el archivo 10 se llena, sobrescribe el archivo 1, creando un buffer circular que mantiene los 500MB más recientes de tráfico.
Opciones de Marca de Tiempo
# Microsecond timestamps (default)
sudo tcpdump -i eth0 -tt
# Human-readable timestamps
sudo tcpdump -i eth0 -tttt
# Delta from previous packet
sudo tcpdump -i eth0 -ttt
Referencia Rápida de tcpdump
| Opción | Descripción |
|---|---|
-i eth0 | Capturar en una interfaz específica |
-i any | Capturar en todas las interfaces |
-c 100 | Detenerse después de 100 paquetes |
-n | No resolver nombres de host |
-nn | No resolver nombres de host ni puertos |
-v / -vv / -vvv | Aumentar la verbosidad |
-A | Mostrar la carga útil como ASCII |
-X | Mostrar la carga útil como hex + ASCII |
-w file.pcap | Escribir paquetes en un archivo |
-r file.pcap | Leer paquetes desde un archivo |
-s 0 | Capturar paquetes completos |
-s 96 | Capturar solo cabeceras |
-C 100 | Rotar archivos cada 100MB |
-W 5 | Mantener un máximo de 5 archivos rotados |
-tt | Marcas de tiempo Unix absolutas |
-ttt | Marcas de tiempo delta |
-tttt | Marcas de tiempo legibles |
Expresiones de Filtro Comunes
| Filtro | Captura |
|---|---|
host 10.0.1.5 | Tráfico hacia/desde IP |
src host 10.0.1.5 | Tráfico desde IP |
dst host 10.0.1.5 | Tráfico hacia IP |
port 443 | Tráfico en un puerto |
portrange 8000-9000 | Rango de puertos |
tcp / udp / icmp | Protocolo |
net 10.0.1.0/24 | Subred |
not port 22 | Excluir SSH |
host A and port 80 | Combinado |
port 80 or port 443 | Cualquiera de los puertos |
Resumen
tcpdump es la herramienta esencial de captura de paquetes para la solución de problemas de red en Linux:
- Usa siempre
-nnpara desactivar la resolución DNS y obtener una salida más rápida y limpia - Aplica filtros de captura para reducir el ruido:
host,port,tcp,not port 22 - Guarda capturas prolongadas en archivos pcap con
-wy analízalas después con Wireshark - Usa
-cpara limitar el tamaño de la captura y evitar llenar el disco - Combina filtros con
and,or,notpara aislar tráfico de forma precisa - Usa filtros de flags TCP para diagnosticar problemas de conexión (SYN floods, problemas de RST)
- Los ring buffers (
-C+-W) permiten capturas de larga duración en servidores de producción - Transfiere archivos pcap a Wireshark para un análisis visual detallado de protocolos
Para temas relacionados, consulta nuestras guías sobre Configurar el Firewall UFW en Ubuntu Server y Hardening SSH para Servidores Linux.