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 -nn em 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

OpcaoDescricao
-i eth0Capturar em interface especifica
-i anyCapturar em todas as interfaces
-c 100Parar apos 100 pacotes
-nNao resolver hostnames
-nnNao resolver hostnames nem portas
-v / -vv / -vvvAumentar verbosidade
-AMostrar payload como ASCII
-XMostrar payload como hex + ASCII
-w file.pcapGravar pacotes em arquivo
-r file.pcapLer pacotes de arquivo
-s 0Capturar pacotes completos
-s 96Capturar apenas headers
-C 100Rotacionar arquivos a cada 100MB
-W 5Manter no maximo 5 arquivos rotacionados
-ttTimestamps Unix absolutos
-tttTimestamps delta
-ttttTimestamps legiveis

Expressoes de Filtro Comuns

FiltroCaptura
host 10.0.1.5Trafego de/para IP
src host 10.0.1.5Trafego a partir do IP
dst host 10.0.1.5Trafego para o IP
port 443Trafego na porta
portrange 8000-9000Faixa de portas
tcp / udp / icmpProtocolo
net 10.0.1.0/24Sub-rede
not port 22Excluir SSH
host A and port 80Combinado
port 80 or port 443Qualquer porta

Resumo

O tcpdump e a ferramenta essencial de captura de pacotes para solucao de problemas de rede no Linux:

  • Sempre use -nn para 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 -w e analise depois com o Wireshark
  • Use -c para limitar o tamanho da captura e evitar lotar o disco
  • Combine filtros com and, or, not para 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.