Quando problemas de rede surgem — conexoes expirando, servicos inacessiveis ou padroes de trafego inesperados — voce precisa ver o que realmente esta acontecendo no fio. O tcpdump e a ferramenta padrao de captura de pacotes via linha de comando no Linux, instalada em praticamente todos os servidores e capaz de interceptar, filtrar e registrar trafego de rede no nivel do pacote. E a maneira mais rapida de diagnosticar problemas de rede diretamente em um servidor de producao.
Este guia cobre o uso pratico do tcpdump, desde capturas basicas ate filtragem avancada, analise de protocolos e integracao com o Wireshark para inspecao visual.
Pre-requisitos
Antes de comecar, certifique-se de que voce tem:
- Um sistema Linux (Ubuntu, Debian, RHEL/CentOS, Fedora ou similar)
- Acesso ao terminal com privilegios sudo (o tcpdump requer root para captura de pacotes)
- Conhecimento basico de redes TCP/IP (enderecos IP, portas, TCP vs UDP)
Instalando o tcpdump
O tcpdump ja vem pre-instalado na maioria das distribuicoes Linux. Verifique ou instale:
# Debian/Ubuntu
sudo apt update && sudo apt install tcpdump
# RHEL/Fedora/CentOS
sudo dnf install tcpdump
# Verify installation
tcpdump --version
Identificando Interfaces de Rede
Antes de capturar, identifique qual interface carrega o trafego que voce deseja inspecionar:
# List all interfaces tcpdump can capture on
sudo tcpdump -D
# Or use ip to show interfaces
ip link show
Saida tipica:
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]
Use any para capturar em todas as interfaces simultaneamente, ou especifique uma unica interface para uma saida mais limpa.
Captura Basica
Capturar Todo o Trafego em uma Interface
sudo tcpdump -i eth0
Isso exibe cada pacote em tempo real. Pressione Ctrl+C para parar. A saida mostra uma linha por pacote:
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: timestamp, protocolo, IP.porta de origem, IP.porta de destino, flags TCP, numeros de sequencia/ack, tamanho da janela e comprimento do payload.
Limitar o Numero de Pacotes
# Stop after capturing 50 packets
sudo tcpdump -i eth0 -c 50
Saida Detalhada
# 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 Enderecos IP em Vez de Hostnames
# Don't resolve hostnames (faster output)
sudo tcpdump -i eth0 -n
# Don't resolve hostnames or port names
sudo tcpdump -i eth0 -nn
Dica: Sempre use
-nnem producao. A resolucao DNS para cada pacote torna a captura mais lenta e pode gerar trafego adicional.
Filtros de Captura
Filtros sao o recurso mais importante do tcpdump. Eles usam a sintaxe BPF (Berkeley Packet Filter) e sao aplicados durante a captura, reduzindo o ruido antes que ele chegue a sua tela.
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 Porta
# 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 Rede (Sub-rede)
# 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
Combinando Filtros
Use and, or e not (ou &&, ||, !) para combinar condicoes:
# 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'
Faixas de Portas
# 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'
Salvando e Lendo Arquivos de Captura
Gravar em um Arquivo 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
Ler um Arquivo 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 para o Wireshark
O formato pcap e universal. Copie o arquivo para sua estacao de trabalho e abra no 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 -
Exibindo o Conteudo dos Pacotes
Mostrar Payload do Pacote como ASCII
# Print packet content in ASCII
sudo tcpdump -i eth0 -A port 80
Isso e util para inspecionar requisicoes e respostas HTTP em texto claro.
Mostrar Payload como Hex e 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 o Tamanho da 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
Exemplos Praticos de Solucao de Problemas
Diagnosticar Problemas de Resolucao 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
Observe: consultas sem respostas (servidor DNS inacessivel), respostas NXDOMAIN (nome nao existe) ou tempos de resposta anormalmente lentos.
Depurar Problemas de Conexao 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 Conexoes Excessivas
# 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
Monitorar Trafego de Banco de Dados
# 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 de 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'
Observe: respostas “unreachable”, TTL exceeded ou echo replies ausentes.
Depurar 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)'
Consideracoes de Desempenho
Reduzir Overhead de Saida
# 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 Longas
# Rotate files: 10 files of 50MB each (500MB total ring buffer)
sudo tcpdump -i eth0 -w /tmp/cap.pcap -C 50 -W 10
Quando o arquivo 10 fica cheio, ele sobrescreve o arquivo 1, criando um buffer circular que mantem os 500MB mais recentes de trafego.
Opcoes de Timestamp
# 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 Rapida do tcpdump
| Opcao | Descricao |
|---|---|
-i eth0 | Capturar em interface especifica |
-i any | Capturar em todas as interfaces |
-c 100 | Parar apos 100 pacotes |
-n | Nao resolver hostnames |
-nn | Nao resolver hostnames nem portas |
-v / -vv / -vvv | Aumentar verbosidade |
-A | Mostrar payload como ASCII |
-X | Mostrar payload como hex + ASCII |
-w file.pcap | Gravar pacotes em arquivo |
-r file.pcap | Ler pacotes de arquivo |
-s 0 | Capturar pacotes completos |
-s 96 | Capturar apenas headers |
-C 100 | Rotacionar arquivos a cada 100MB |
-W 5 | Manter no maximo 5 arquivos rotacionados |
-tt | Timestamps Unix absolutos |
-ttt | Timestamps delta |
-tttt | Timestamps legiveis |
Expressoes de Filtro Comuns
| Filtro | Captura |
|---|---|
host 10.0.1.5 | Trafego de/para IP |
src host 10.0.1.5 | Trafego a partir do IP |
dst host 10.0.1.5 | Trafego para o IP |
port 443 | Trafego na porta |
portrange 8000-9000 | Faixa de portas |
tcp / udp / icmp | Protocolo |
net 10.0.1.0/24 | Sub-rede |
not port 22 | Excluir SSH |
host A and port 80 | Combinado |
port 80 or port 443 | Qualquer porta |
Resumo
O tcpdump e a ferramenta essencial de captura de pacotes para solucao de problemas de rede no Linux:
- Sempre use
-nnpara desabilitar a resolucao DNS e obter uma saida mais rapida e limpa - Aplique filtros de captura para reduzir o ruido:
host,port,tcp,not port 22 - Salve capturas longas em arquivos pcap com
-we analise depois com o Wireshark - Use
-cpara limitar o tamanho da captura e evitar lotar o disco - Combine filtros com
and,or,notpara isolamento preciso de trafego - Use filtros de flags TCP para diagnosticar problemas de conexao (SYN floods, problemas de RST)
- Ring buffers (
-C+-W) permitem capturas de longa duracao em servidores de producao - Transfira arquivos pcap para o Wireshark para analise visual detalhada de protocolos
Para topicos relacionados, consulte nossos guias sobre Configurar Firewall UFW no Ubuntu Server e Hardening SSH para Servidores Linux.