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 -nnpara observar o trafego ao vivo - Quando houver muito ruido, filtre com
host/port - Para analise posterior, salve com
-w cap.pcape 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 assumemsudo - 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 -nne 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 eth0para 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/dstcombinados comand/or/notcobrem 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:
-Aimprime ASCII e-Ximprime 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.pcapgrava uma captura binaria e-r arquivo.pcapa 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
- No servidor:
sudo tcpdump -i any -nn -w /tmp/cap.pcap port 443 -c 1000 - Transfira localmente (
scp user@server:/tmp/cap.pcap .) - Abra
cap.pcapno 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