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 -nnpara observar o tráfego ao vivo - Quando houver muito ruído, filtre com
host/port - Para análise posterior, salve com
-w cap.pcape 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 assumemsudo - 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 eth0para 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/dstcombinados comand/or/notcobrem 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:
-Aimprime ASCII e-Ximprime 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.pcapgrava uma captura binária e-r arquivo.pcapa 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
- 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 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