Fundamentos do tcpdump: Capturando e Lendo Pacotes

Fundamentos do tcpdump: Capturando e Lendo Pacotes

O Que Você Vai Aprender

  • A forma mais rápida de começar a capturar pacotes com tcpdump
  • Como filtrar apenas o tráfego que interessa com filtros BPF
  • O fluxo de trabalho para salvar um pcap e lê-lo no Wireshark
  • Como diagnosticar "não consigo conectar" e "resposta lenta" no nível de pacotes

Resumo Rápido

  • Comece com sudo tcpdump -i any -nn para observar o tráfego ao vivo
  • Quando houver muito ruído, filtre com host / port
  • Para análise posterior, salve com -w cap.pcap e abra no Wireshark
  • Sempre adicione -nn (para que consultas DNS nunca travem a saída)

Pré-requisitos

  • SO: Ubuntu / Linux típico
  • Captura de pacotes requer privilégios root (CAP_NET_RAW), então os comandos assumem sudo
  • Se não estiver instalado: sudo apt install tcpdump

O Que é o tcpdump?

Conclusão: tcpdump é uma ferramenta de captura de pacotes em linha de comando. Ele captura e imprime os pacotes brutos que cruzam uma NIC, para que você veja exatamente o que está (ou não está) no fio.

tcpdump captura os pacotes passando por uma interface de rede (NIC) e os imprime como estão. Quando uma resposta web nunca volta ou uma conexão TCP não se estabelece, ele permite raciocinar a partir de fatos: o pacote chegou ao servidor, e uma resposta voltou?

Ele compartilha seu motor de captura (libpcap / BPF) com a ferramenta GUI Wireshark - tcpdump é essencialmente a contraparte CLI. Sua força é que você pode executá-lo instantaneamente em um servidor via SSH.

Captura de pacotes observa o conteúdo do tráfego (às vezes incluindo credenciais). Execute apenas em sistemas que você possui ou está autorizado a inspecionar.

Como Iniciar uma Captura Rapidamente?

Conclusão: sudo tcpdump -i any -nn é seu ponto de partida. Domine apenas três coisas - interface -i, sem resolução de nomes -nn, e limite de contagem -c - e você já pode trabalhar.

Observe o tráfego ao vivo primeiro

$ sudo tcpdump -i any -nn
  • -i any: capturar em todas as interfaces (use -i eth0 para uma específica)
  • -nn: não resolver nomes de host nem nomes de porta (sem espera por DNS, e números são mais rápidos de ler)

Listar interfaces disponíveis

Quando não tiver certeza de qual interface escolher, liste-as.

$ tcpdump -D
1.eth0 [Up, Running, Connected]
2.any (Pseudo-device that captures on all interfaces) [Up, Running]
3.lo [Up, Running, Loopback]

Parar após uma contagem fixa

tcpdump continua executando até você parar. -c limita o número de pacotes, o que é mais fácil de controlar.

$ sudo tcpdump -i any -nn -c 20

Pressione Ctrl + C para parar manualmente. Ao sair, ele imprime estatísticas "received / dropped by kernel" - uma contagem alta de dropped significa que pacotes foram perdidos.

Como Ler uma Única Linha?

Conclusão: Cada linha lê-se como "hora origem destino flags/seq/comprimento". A direção de > mais as flags TCP (S/F/P/R/.) indicam o fluxo e estado.

Uma linha TCP típica se parece com isto.

10:11:12.345678 IP 192.168.1.10.54322 > 93.184.216.34.443: Flags [S], seq 123456, win 64240, length 0
Elemento Significado
10:11:12.345678 Timestamp
192.168.1.10.54322 IP e porta de origem (parte final)
> Direção (esquerda para direita)
93.184.216.34.443 IP e porta de destino (443 = HTTPS)
Flags [S] Flags TCP (veja abaixo)
length 0 Comprimento do payload

Lendo flags TCP

Notação Flag Significado
S SYN Solicitação de conexão
S. SYN/ACK Resposta a solicitação
. ACK Apenas confirmação
P PSH Enviar dados
F FIN Fechar a conexão
R RST Resetar a conexão forcadamente

Se o three-way handshake for bem-sucedido, você verá [S] depois [S.] depois [.]. Se você envia [S] e recebe [R] (RST), ou nada, a porta provavelmente está fechada ou o caminho está sendo bloqueado.

Como Capturar Apenas o Que Você Quer? (Filtros BPF)

Conclusão: Adicione uma expressão BPF para restringir a captura. host / port / src / dst combinados com and / or / not cobrem quase tudo.

A expressão de condição no final dos argumentos do tcpdump é um BPF (Berkeley Packet Filter). Um punhado de palavras-chave é suficiente para trabalho real.

# Apenas trafego com um host especifico
$ sudo tcpdump -i any -nn host 93.184.216.34

# Apenas uma porta especifica (HTTPS)
$ sudo tcpdump -i any -nn port 443

# Limitar por origem / destino
$ sudo tcpdump -i any -nn src 192.168.1.10
$ sudo tcpdump -i any -nn dst port 53

# Limitar por protocolo
$ sudo tcpdump -i any -nn udp port 53

Combinar condições

# host A e porta 443
$ sudo tcpdump -i any -nn host 192.168.1.10 and port 443

# Tudo exceto porta 22 (SSH)
$ sudo tcpdump -i any -nn not port 22

# DNS ou HTTPS
$ sudo tcpdump -i any -nn 'port 53 or port 443'

Quando uma expressão usa and / or / not ou parênteses, envolva toda a expressão em aspas simples para evitar que o shell a interprete (ex: 'tcp port 80 and host 10.0.0.1').

Palavras-chave comuns: host / net 192.168.1.0/24 / port / portrange 8000-8100 / src / dst / tcp / udp / icmp / arp.

Como Ver o Payload?

Conclusão: -A imprime ASCII e -X imprime hex + ASCII. Útil para inspecionar cabeçalhos HTTP em texto puro ou consultas DNS. Ajuste a verbosidade com -v / -vv.

Use estes quando precisar mais que cabeçalhos - o conteúdo real de um pacote.

# Imprimir payload como ASCII (bom para cabecalhos HTTP, etc.)
$ sudo tcpdump -i any -nn -A port 80

# Hex + ASCII (bom para analise binaria)
$ sudo tcpdump -i any -nn -X port 80

# Aumentar verbosidade (TTL, opcoes, etc.)
$ sudo tcpdump -i any -nn -vv host 192.168.1.10

Tráfego HTTPS (443) é criptografado, então -A / -X não revelarão o conteúdo (embora o handshake TLS e parte do SNI sejam visíveis). Texto puro só é legível para tráfego não criptografado como HTTP e DNS.

Guias antigos dizem que você precisa de -s 0 para capturar pacotes completos, mas o tcpdump moderno já usa um snap length padrão grande (262144 bytes), então normalmente não é necessário.

Como Salvar uma Captura para Análise Posterior?

Conclusão: -w arquivo.pcap grava uma captura binária e -r arquivo.pcap a lê de volta. Um pcap salvo abre diretamente no Wireshark, permitindo capturar no servidor e analisar no seu laptop.

Gravar e ler de volta

# Salvar em formato pcap (grava em arquivo em vez da tela)
$ sudo tcpdump -i any -nn -w capture.pcap

# Ler um arquivo salvo (nao precisa de sudo apenas para ler)
$ tcpdump -nn -r capture.pcap

# Voce tambem pode aplicar um filtro ao ler
$ tcpdump -nn -r capture.pcap port 443

Capture no servidor, analise no seu laptop

  1. No servidor: sudo tcpdump -i any -nn -w /tmp/cap.pcap port 443 -c 1000
  2. Transfira localmente (scp user@server:/tmp/cap.pcap .)
  3. Abra cap.pcap no Wireshark

Os filtros e rastreamento de stream do Wireshark tornam a análise profunda rápida, então essa divisão é o caminho mais rápido para qualquer coisa complicada.

Rotacionar arquivos para não acumular

Uma captura longa pode encher o disco. Você pode rotacionar por tamanho ou contagem.

# Dividir a cada ~100MB, mantendo no maximo 10 arquivos em rotacao
$ sudo tcpdump -i any -nn -w cap.pcap -C 100 -W 10
  • -C 100: rotacionar em aproximadamente 100MB por arquivo
  • -W 10: limite no número de arquivos retidos (mais antigos são sobrescritos)

Um Caso Real: Não Consigo Conectar

Conclusão: Observar se um SYN recebe resposta (ou um RST) resolve acessibilidade e estado da porta de uma só vez.

Verificando por que você não consegue alcançar um host na porta 443.

$ sudo tcpdump -i any -nn host 93.184.216.34 and port 443

Como interpretar:

  • Envia [S], recebe [S.] -> acessível e a porta está aberta (o problema está na camada de aplicação)
  • Envia [S], recebe [R] (RST) -> chega ao host mas a porta está fechada
  • Envia [S] mas não recebe nada -> algo no caminho (firewall, roteamento) está descartando
  • Seu próprio [S] nem aparece -> suspeite de roteamento local, resolução de nomes ou o próprio aplicativo

Combinar isso com verificações de acessibilidade com ping / traceroute torna o diagnóstico mais rápido. Veja os artigos relacionados para detalhes.

Opções Úteis em um Relance

Conclusão: Domine estas sete - -i / -nn / -c / -w / -r / -A / -v - e você cobriu o troubleshooting do dia a dia.

Opção Função
-i IF Interface para capturar (any e permitido)
-nn Não resolver nomes de host ou porta
-c N Parar após N pacotes
-w FILE Gravar em formato pcap
-r FILE Ler um arquivo pcap
-A Imprimir payload como ASCII
-X Imprimir hex + ASCII
-v/-vv Aumentar verbosidade
-e Também imprimir a camada de enlace (endereços MAC)
-D Listar interfaces disponíveis

Templates para copiar e colar

# Observe primeiro
sudo tcpdump -i any -nn -c 50

# Filtre
sudo tcpdump -i any -nn host 192.168.1.10 and port 443

# Salve e analise depois
sudo tcpdump -i any -nn -w /tmp/cap.pcap port 443 -c 1000
tcpdump -nn -r /tmp/cap.pcap

Próximas Leituras