Fundamentos do tcpdump: Capturando e Lendo Pacotes

Fundamentos do tcpdump: Capturando e Lendo Pacotes

O Que Voce Vai Aprender

  • A forma mais rapida de comecar a capturar pacotes com tcpdump
  • Como filtrar apenas o trafego que interessa com filtros BPF
  • O fluxo de trabalho para salvar um pcap e le-lo no Wireshark
  • Como diagnosticar "nao consigo conectar" e "resposta lenta" no nivel de pacotes

Resumo Rapido

  • Comece com sudo tcpdump -i any -nn para observar o trafego ao vivo
  • Quando houver muito ruido, filtre com host / port
  • Para analise posterior, salve com -w cap.pcap e abra no Wireshark
  • Sempre adicione -nn (para que consultas DNS nunca travem a saida)

Pre-requisitos

  • SO: Ubuntu / Linux tipico
  • Captura de pacotes requer privilegios root (CAP_NET_RAW), entao os comandos assumem sudo
  • Se nao estiver instalado: sudo apt install tcpdump

O Que e o tcpdump?

Conclusao: tcpdump e uma ferramenta de captura de pacotes em linha de comando. Ele captura e imprime os pacotes brutos que cruzam uma NIC, para que voce veja exatamente o que esta (ou nao esta) no fio.

tcpdump captura os pacotes passando por uma interface de rede (NIC) e os imprime como estao. Quando uma resposta web nunca volta ou uma conexao TCP nao 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 e essencialmente a contraparte CLI. Sua forca e que voce pode executa-lo instantaneamente em um servidor via SSH.

Captura de pacotes observa o conteudo do trafego (as vezes incluindo credenciais). Execute apenas em sistemas que voce possui ou esta autorizado a inspecionar.

Como Iniciar uma Captura Rapidamente?

Conclusao: sudo tcpdump -i any -nn e seu ponto de partida. Domine apenas tres coisas - interface -i, sem resolucao de nomes -nn, e limite de contagem -c - e voce ja pode trabalhar.

Observe o trafego ao vivo primeiro

$ sudo tcpdump -i any -nn
  • -i any: capturar em todas as interfaces (use -i eth0 para uma especifica)
  • -nn: nao resolver nomes de host nem nomes de porta (sem espera por DNS, e numeros sao mais rapidos de ler)

Listar interfaces disponiveis

Quando nao 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 apos uma contagem fixa

tcpdump continua executando ate voce parar. -c limita o numero de pacotes, o que e mais facil de controlar.

$ sudo tcpdump -i any -nn -c 20

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

Como Ler uma Unica Linha?

Conclusao: Cada linha le-se como "hora origem destino flags/seq/comprimento". A direcao de > mais as flags TCP (S/F/P/R/.) indicam o fluxo e estado.

Uma linha TCP tipica 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)
> Direcao (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

Notacao Flag Significado
S SYN Solicitacao de conexao
S. SYN/ACK Resposta a solicitacao
. ACK Apenas confirmacao
P PSH Enviar dados
F FIN Fechar a conexao
R RST Resetar a conexao forcadamente

Se o three-way handshake for bem-sucedido, voce vera [S] depois [S.] depois [.]. Se voce envia [S] e recebe [R] (RST), ou nada, a porta provavelmente esta fechada ou o caminho esta sendo bloqueado.

Como Capturar Apenas o Que Voce Quer? (Filtros BPF)

Conclusao: Adicione uma expressao BPF para restringir a captura. host / port / src / dst combinados com and / or / not cobrem quase tudo.

A expressao de condicao no final dos argumentos do tcpdump e um BPF (Berkeley Packet Filter). Um punhado de palavras-chave e 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 condicoes

# 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 expressao usa and / or / not ou parenteses, envolva toda a expressao 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?

Conclusao: -A imprime ASCII e -X imprime hex + ASCII. Util para inspecionar cabecalhos HTTP em texto puro ou consultas DNS. Ajuste a verbosidade com -v / -vv.

Use estes quando precisar mais que cabecalhos - o conteudo 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

Trafego HTTPS (443) e criptografado, entao -A / -X nao revelarao o conteudo (embora o handshake TLS e parte do SNI sejam visiveis). Texto puro so e legivel para trafego nao criptografado como HTTP e DNS.

Guias antigos dizem que voce precisa de -s 0 para capturar pacotes completos, mas o tcpdump moderno ja usa um snap length padrao grande (262144 bytes), entao normalmente nao e necessario.

Como Salvar uma Captura para Analise Posterior?

Conclusao: -w arquivo.pcap grava uma captura binaria e -r arquivo.pcap a le 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 analise profunda rapida, entao essa divisao e o caminho mais rapido para qualquer coisa complicada.

Rotacionar arquivos para nao acumular

Uma captura longa pode encher o disco. Voce 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 numero de arquivos retidos (mais antigos sao sobrescritos)

Um Caso Real: Nao Consigo Conectar

Conclusao: Observar se um SYN recebe resposta (ou um RST) resolve acessibilidade e estado da porta de uma so vez.

Verificando por que voce nao consegue alcancar um host na porta 443.

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

Como interpretar:

  • Envia [S], recebe [S.] -> acessivel e a porta esta aberta (o problema esta na camada de aplicacao)
  • Envia [S], recebe [R] (RST) -> chega ao host mas a porta esta fechada
  • Envia [S] mas nao recebe nada -> algo no caminho (firewall, roteamento) esta descartando
  • Seu proprio [S] nem aparece -> suspeite de roteamento local, resolucao de nomes ou o proprio aplicativo

Combinar isso com verificacoes de acessibilidade com ping / traceroute torna o diagnostico mais rapido. Veja os artigos relacionados para detalhes.

Opcoes Uteis em um Relance

Conclusao: Domine estas sete - -i / -nn / -c / -w / -r / -A / -v - e voce cobriu o troubleshooting do dia a dia.

Opcao Funcao
-i IF Interface para capturar (any e permitido)
-nn Nao resolver nomes de host ou porta
-c N Parar apos 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 Tambem imprimir a camada de enlace (enderecos MAC)
-D Listar interfaces disponiveis

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

Proximas Leituras