Você está conectado a uma máquina por SSH. Não há ambiente gráfico, não há Wireshark, e alguma coisa na rede está conversando com um endereço que ninguém sabe explicar. Aprender a usar o tcpdump é aprender a responder essa pergunta com a única ferramenta que já está instalada, em um terminal de 80 colunas.
O tcpdump imprime pacotes. É esse o produto inteiro. Ele faz isso desde 1988, está presente em praticamente todo sistema Linux e BSD em que você vai logar, e continua sendo a forma mais rápida de descobrir o que uma máquina realmente envia. É uma habilidade central para penetration testing, para resposta a incidentes e para a parte forense de qualquer CTF. Abra o lab Packet Pursuit em outra aba enquanto lê: é um arquivo de captura com uma flag dividida entre três protocolos, e tudo o que vem a seguir se aplica a ele diretamente.
TL;DR: o tcpdump é uma ferramenta de captura de pacotes em linha de comando construída sobre a libpcap. O comando que você mais vai digitar é sudo tcpdump -i eth0 -n 'tcp port 80': escolha a interface com -i, desligue a resolução de nomes com -n e coloque um filtro BPF entre aspas simples no final. Adicione -c 100 para parar depois de 100 pacotes, ou -w capture.pcap para salvá-los e abrir no Wireshark. A habilidade de verdade é ler uma linha da saída e escrever um filtro que remove tudo o que não interessa.
O que é o tcpdump?
O tcpdump é uma ferramenta de linha de comando que captura pacotes de uma interface de rede e imprime um resumo de uma linha para cada um. Ele também grava os pacotes brutos em um arquivo .pcap, o mesmo formato que o Wireshark lê, então uma captura feita em um servidor sem interface gráfica abre perfeitamente no seu notebook.
Van Jacobson, Sally Floyd, Vern Paxson e Steven McCanne o escreveram em 1988 no Lawrence Berkeley Laboratory. Ele roda sobre a libpcap, a biblioteca de captura que também move o Wireshark, o Nmap, o Snort e o Suricata, e o "formato pcap" nada mais é do que o arquivo que a libpcap escreve.
A versão estável atual no tcpdump.org é a 4.99.7 (setembro de 2026), com a libpcap 1.10.7. As distribuições andam um pouco atrás: o Ubuntu 24.04 LTS traz a 4.99.4, e para tudo o que este artigo cobre as versões 4.99.x se comportam de forma idêntica.
O tcpdump não decodifica protocolos de aplicação como o Wireshark faz. Ele entende cabeçalhos muito bem: Ethernet, IP, TCP, UDP, ICMP, DNS, ARP. Acima disso, ele basicamente devolve bytes. Não existe "Follow HTTP Stream" nem árvore de protocolos. O que você ganha em troca é velocidade, uma linguagem de filtros que roda no kernel e um binário que já está no alvo.
Instalando o tcpdump e o problema de permissão que ninguém avisa
No Kali ele já vem instalado. No Debian ou Ubuntu é um comando só:
sudo apt update
sudo apt install tcpdump
Confira o que você recebeu:
tcpdump --version
tcpdump version 4.99.4
libpcap version 1.10.4 (with TPACKET_V3)
OpenSSL 3.0.13 30 Jan 2024
Capturar pacotes exige root, ou as capacidades de socket bruto que normalmente vêm junto, por isso todo comando de captura abaixo começa com sudo. Se preferir evitar, conceda ao binário as duas capacidades de que ele realmente precisa e rode com o seu próprio usuário:
sudo setcap cap_net_raw,cap_net_admin+eip $(which tcpdump)
Agora a parte que derruba quase todo mundo no Debian e no Ubuntu: essas versões abrem mão dos privilégios e passam para uma conta sem privilégios chamada tcpdump. A página de manual oficial documenta isso em -Z: a troca acontece "after opening the capture device or input savefile, but before opening any savefiles for output". Resultado: sudo tcpdump -w /root/capture.pcap falha com erro de permissão mesmo você sendo root, e quando a gravação funciona, o arquivo não é seu:
-rw-r--r-- 1 tcpdump tcpdump 3115 Sep 14 07:18 cap.pcap
Na prática: grave as capturas em um lugar que o usuário tcpdump alcance, como /tmp, e depois use sudo chown $USER capture.pcap. Ou peça ao tcpdump para continuar como root com -Z root. Dois minutos de confusão na primeira vez, nunca mais depois disso.
Antes de capturar qualquer coisa, descubra onde dá para capturar:
tcpdump -D
1.eth0 [Up, Running, Connected]
2.any (Pseudo-device that captures on all interfaces) [Up, Running]
3.lo [Up, Running, Loopback]
eth0 é a rede de verdade, lo é o loopback, onde você observa um serviço conversar com um banco de dados na mesma máquina, e any captura em tudo ao mesmo tempo. Comece por any quando ainda não souber por onde passa o tráfego.
Como usar o tcpdump na sua primeira captura
Todo comando do tcpdump tem o mesmo formato: opções e depois um filtro entre aspas simples.
sudo tcpdump -i lo -n 'tcp port 8000'
Isso imprime um cabeçalho e fica parado até você apertar Ctrl+C:
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
^C
25 packets captured
50 packets received by filter
0 packets dropped by kernel
Três contadores no final, e o terceiro é o que você precisa observar. "Dropped by kernel" significa que os pacotes chegaram mais rápido do que o tcpdump conseguia processar e o kernel os descartou. Acima de zero, a sua captura tem buracos, e a correção é um filtro mais apertado ou -w para um arquivo em vez de imprimir no terminal. (No loopback, "received by filter" conta cada pacote duas vezes, na saída e na entrada, então 50 para 25 é normal.)
Quatro opções carregam quase todo o peso:
-i eth0escolhe a interface. Use-i anyquando estiver em dúvida.-nimpede o tcpdump de converter endereços e números de porta em nomes. Use sempre. Sem isso, cada endereço novo dispara uma consulta DNS que arrasta a saída, polui a sua captura e conta ao servidor DNS o que você está olhando. Guias antigos mandam usar-nnpara manter as portas numéricas também; nas versões atuais, um único-njá faz as duas coisas.-c 100encerra depois de 100 pacotes.sudo tcpdump -i eth0 -n -c 100captura 100 pacotes da eth0, imprime um resumo de cada um e para sozinho.-w capture.pcapgrava os pacotes brutos em um arquivo em vez de imprimi-los.
Outras três merecem virar reflexo:
-v,-vv,-vvvdecodificam mais de cada pacote: TTL, ID do IP, tamanho total e verificação de checksums com-v, SMB totalmente decodificado e campos extras de NFS com-vv.-eacrescenta o cabeçalho de enlace, então você vê os endereços MAC. Essencial para investigar problemas de ARP.-ttttimprime a data completa antes do horário, o que você quer em tudo que vai parar em um relatório.
Não existe -s0 nessas listas de propósito. Tutoriais antigos mandam adicioná-lo porque o tcpdump guardava só os primeiros 68 bytes de cada pacote. Pacotes inteiros são o padrão desde a versão 4.1 (2010), e o cabeçalho acima mostra o tamanho de captura atual de 262144 bytes.
Como ler a saída do tcpdump
Esta é a habilidade sobre a qual todo o resto se apoia. Aqui está uma linha real da captura acima:
07:18:27.260675 IP 127.0.0.1.56730 > 127.0.0.1.8000: Flags [S], seq 1533482769, win 65495, options [mss 65495,sackOK,TS val 12321087 ecr 0,nop,wscale 10], length 0
Da esquerda para a direita:
07:18:27.260675é o horário, até o microssegundo. O ritmo costuma ser o achado em si: uma requisição a cada 60,0 segundos é um beacon, não um usuário.IPé o protocolo da camada externa. Você também vai verIP6eARP.127.0.0.1.56730 > 127.0.0.1.8000mostra origem e depois destino, e o número após o último ponto é a porta. O tcpdump não usa dois-pontos para portas, o que pega todo mundo uma vez.Flags [S]é o campo de flags TCP, e é a informação mais útil da linha.length 0é o tamanho dos dados, não o do pacote. Um pacote de handshake não carrega dado algum.
A notação das flags é compacta e vale a pena memorizar:
[S]SYN, alguém está abrindo uma conexão[S.]SYN-ACK, e o ponto sempre significa ACK. Tem alguma coisa escutando.[.]um ACK simples, em geral uma confirmação sem mais nada a dizer[P.]PSH-ACK, o que carrega os dados de verdade[F.]FIN-ACK, um encerramento educado[R]ou[R.]RST, uma recusa. Nada está escutando naquela porta, ou um firewall rejeitou.
Agora leia três linhas seguidas da mesma captura (opções TCP cortadas para caber na tela) e o handshake aparece sozinho:
07:18:27.260675 IP 127.0.0.1.56730 > 127.0.0.1.8000: Flags [S], seq 1533482769, win 65495, length 0
07:18:27.261001 IP 127.0.0.1.8000 > 127.0.0.1.56730: Flags [S.], seq 62299410, ack 1533482770, win 65483, length 0
07:18:27.261018 IP 127.0.0.1.56730 > 127.0.0.1.8000: Flags [.], ack 1, win 64, length 0
SYN, SYN-ACK, ACK. Quando você reconhece esse padrão de relance, um port scan, uma conexão que falhou e um serviço funcionando se leem direto no terminal. Um scan parece centenas de pacotes [S] com [R.] voltando de cada porta fechada, que é exatamente a cara de um scan do Nmap visto do lado que o recebe.
Repare também nos números de sequência. O primeiro pacote de cada sentido mostra o valor real, e a partir daí o tcpdump imprime números relativos a ele, por isso a terceira linha diz ack 1. Use -S para manter os valores absolutos.
Filtros do tcpdump: a habilidade que vale aprender
Uma captura sem filtro em uma interface real fica ilegível em dois segundos. Aqui os filtros não são otimização, são a ferramenta.
O tcpdump usa BPF, a linguagem Berkeley Packet Filter, documentada na página de manual do pcap-filter. O filtro é compilado e roda no kernel, então os pacotes que você não pediu são descartados antes mesmo de serem copiados para o tcpdump. É por isso que um bom filtro também resolve o problema de pacotes perdidos.
Uma expressão BPF é montada a partir de três tipos de palavra:
- Tipo:
host,net,port,portrange - Direção:
src,dst, ou nenhum dos dois, o que aceita qualquer sentido - Protocolo:
tcp,udp,icmp,arp,ip,ip6
Combine tudo com and, or e not, e envolva sempre a expressão inteira em aspas simples para o shell deixar os parênteses em paz.
sudo tcpdump -i any -n 'host 192.0.2.10'
sudo tcpdump -i any -n 'dst port 443'
sudo tcpdump -i any -n 'net 10.0.0.0/8'
sudo tcpdump -i any -n 'portrange 8000-8100'
sudo tcpdump -i any -n 'src 192.0.2.10 and not port 22'
O último é o filtro que você mais vai digitar na vida real. Por SSH, uma captura sem filtro mostra a sua própria sessão SSH, que gera mais pacotes, que imprimem mais linhas. Excluir a porta 22 é a diferença entre uma captura legível e um terminal desgovernado.
Uma armadilha pega até quem tem experiência: and e or têm a mesma precedência e são lidos da esquerda para a direita. 'host 192.0.2.10 and port 80 or port 443' significa "(aquele host na porta 80) ou qualquer tráfego na porta 443, de qualquer um", e em uma interface movimentada a segunda metade afoga a primeira. Escreva o que você quer dizer:
sudo tcpdump -i any -n 'host 192.0.2.10 and (port 80 or port 443)'
Filtros que respondem a uma pergunta
'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack == 0'mostra apenas tentativas de conexão, sem respostas e sem dados. É assim que você enxerga um port scan em andamento, ou confirma que um host está mesmo tentando alcançar um serviço que nunca responde.'udp port 53'é DNS, e o DNS é onde se esconde uma quantidade surpreendente de problemas.'port 80 or port 8080 or port 8000'pega HTTP em texto claro nas portas que as pessoas realmente usam.'arp'mostra a rede local perguntando quem é dono de qual endereço. Acrescente-ee a falsificação de ARP fica visível: um mesmo IP reivindicado por dois endereços MAC.
A confusão que vale esclarecer: filtros de captura BPF e filtros de exibição do Wireshark são duas linguagens diferentes que se parecem e não são intercambiáveis. host 192.0.2.10 é BPF. ip.addr == 192.0.2.10 é um filtro de exibição do Wireshark. Digitar a versão do Wireshark no tcpdump dá erro de sintaxe, e digitar a versão do tcpdump na barra de filtro de exibição do Wireshark deixa a barra vermelha. O Wireshark só aceita BPF nas opções de captura. Nosso guia rápido do Wireshark mostra as duas sintaxes lado a lado.
Gravando capturas em arquivo e abrindo no Wireshark
Imprimir no terminal serve para observar. Tudo o que você pretende analisar deve ir para um arquivo.
sudo tcpdump -i eth0 -n -w /tmp/capture.pcap 'port 80 or port 443'
Nada aparece enquanto isso roda, o que sempre parece defeito na primeira vez; acrescente -v para ver um contador de pacotes. A captura de 25 pacotes deste artigo ficou com 3.115 bytes, mas um link movimentado produz gigabytes por hora, e a correção é rotação:
sudo tcpdump -i eth0 -n -w /tmp/cap.pcap -C 100 -W 10
-C 100 começa um arquivo novo a cada 100 MB (milhões de bytes), e -W 10 mantém dez deles antes de sobrescrever o mais antigo: um buffer circular limitado a 1 GB que você pode deixar rodando por dias. Para um arquivo por hora, use -G 3600 e coloque um formato de data no nome do arquivo, senão cada rotação sobrescreve a anterior:
sudo tcpdump -i eth0 -n -G 3600 -w '/tmp/cap-%Y%m%d-%H%M.pcap'
Releia um arquivo salvo com -r, o que não exige root nenhum. Os filtros funcionam na leitura tanto quanto na captura, e é esse hábito que torna capturas grandes administráveis: capture de forma ampla uma vez, depois filtre o arquivo quantas vezes precisar.
tcpdump -r capture.pcap -n 'host 192.0.2.10 and port 443'
Agora o comando que transforma tcpdump e Wireshark em uma ferramenta só. Se o tráfego de que você precisa está em um servidor remoto sem interface gráfica, pule o ciclo de capturar, copiar e abrir. Mande por um pipe:
ssh [email protected] 'sudo tcpdump -i eth0 -U -w - not port 22' | wireshark -k -i -
-w - escreve a captura na saída padrão, -U descarrega cada pacote imediatamente, e wireshark -k -i - começa a capturar da entrada padrão na hora. Você ganha toda a decodificação de protocolos do Wireshark, ao vivo, sobre pacotes de uma máquina que nunca ouviu falar de gerenciador de janelas. Dois detalhes importam: not port 22 mantém o seu próprio tráfego SSH fora da captura, e o sudo remoto não pode pedir senha, porque não há terminal para digitá-la.
Lendo os dados com -A e -X: tirando uma flag de um pcap
Desafios de forense entregam um pcap e uma pergunta. Com mais duas opções, o tcpdump leva você até lá mais rápido do que uma interface gráfica.
Saída ASCII com -A
-A imprime os dados de cada pacote em ASCII. Em protocolos sem criptografia, chega perto de ler a conversa:
tcpdump -r capture.pcap -nA 'tcp port 8000'
07:18:27.261121 IP 127.0.0.1.56730 > 127.0.0.1.8000: Flags [P.], seq 1:88, ack 1, win 64, length 87
E....+@.@..?...........@[g.........@.......
[email protected] /index.html HTTP/1.1
Host: 127.0.0.1:8000
User-Agent: curl/8.5.0
Accept: */*
A linha de ruído antes da requisição é o cabeçalho IP e TCP renderizado como ASCII, sem sentido por natureza. Tudo depois dela é a requisição HTTP como ela passou pelo cabo. Continue pela mesma captura e aparece um POST:
POST /login HTTP/1.1
Host: 127.0.0.1:8000
User-Agent: curl/8.5.0
Accept: */*
Content-Length: 26
Content-Type: application/x-www-form-urlencoded
user=dana&password=hunter2
Lá está, em texto claro, porque o formulário foi enviado por HTTP. Esse é o achado mais comum em desafios de forense para iniciantes, e ainda aparece em redes internas reais em 2026, normalmente em alguma interface de administração que ninguém toca há anos.
Saída hexadecimal com -X
-X imprime hexadecimal ao lado do ASCII, que é o que você quer quando os dados não são texto (-XX inclui também o cabeçalho de enlace):
tcpdump -r capture.pcap -nX -c 1
07:18:27.260675 IP 127.0.0.1.56730 > 127.0.0.1.8000: Flags [S], seq 1533482769, win 65495, options [mss 65495,sackOK,TS val 12321087 ecr 0,nop,wscale 10], length 0
0x0000: 4500 003c a829 4000 4006 9490 7f00 0001 E..<.)@.@.......
0x0010: 7f00 0001 dd9a 1f40 5b67 1711 0000 0000 .......@[g......
0x0020: a002 ffd7 fe30 0000 0204 ffd7 0402 080a .....0..........
0x0030: 00bc 013f 0000 0000 0103 030a ...?........
É ali que se escondem cabeçalhos de arquivo. 4500 no deslocamento zero é o começo de um cabeçalho IPv4, e 1f40 em 0x0016 é a porta 8000. Mais adiante dentro dos dados, 504b 0304 é um arquivo ZIP e 8950 4e47 é um PNG. Identificar uma assinatura dessas é como você descobre que há um arquivo para extrair da captura.
O caminho em um desafio tem três passos. Pegue o formato geral do tráfego com tcpdump -r capture.pcap -nq, que imprime uma linha curta por pacote. Reduza ao protocolo de que trata o desafio. Depois despeje os dados com -A e jogue tudo no grep:
tcpdump -r capture.pcap -nA | grep -i -E 'flag|password|user='
Observando DNS com o tcpdump
O DNS merece um olhar à parte, porque ele tira dados de redes que bloqueiam todo o resto. Uma consulta normal não tem nada de notável:
sudo tcpdump -i any -n 'udp port 53'
07:20:43.478932 eth0 Out IP 192.0.2.2.43351 > 8.8.8.8.53: 24085+ AAAA? hackerdna.com. (31)
07:20:43.494090 eth0 In IP 8.8.8.8.53 > 192.0.2.2.43351: 24085 3/0/0 AAAA 2606:4700:20::681a:f29, AAAA 2606:4700:20::681a:e29, AAAA 2606:4700:20::ac43:4840 (115)
O tipo da consulta, o nome e as respostas aparecem sem opção extra (3/0/0 significa três respostas, nenhum registro de autoridade ou adicional), e -i any acrescenta a interface e o sentido. Em uma investigação, observe o formato dos nomes: subdomínios longos com cara de aleatório, centenas de nomes únicos sob um mesmo domínio pai, consultas que nunca se repetem. São dados codificados em nomes de host, e o lab DNS Tunneling Detective entrega uma captura com isso acontecendo.
Tcpdump ou Wireshark: qual e quando
Não é uma rivalidade. Os dois compartilham a libpcap e leem o mesmo formato de arquivo, e na maioria dos dias a resposta certa é usar os dois.
| Recurso | Tcpdump | Wireshark |
|---|---|---|
| Roda por SSH em servidor sem interface gráfica | Sim | Não |
| Já instalado no alvo | Geralmente | Raramente |
| Decodificação de protocolos de aplicação | Só cabeçalhos | Centenas de protocolos |
| Remontar uma conversa TCP inteira | Não | Follow TCP Stream |
| Extrair arquivos de uma captura | Não | Export Objects |
| Capturas longas sem supervisão | Buffer circular com -C e -W | Possível, mais pesado |
| Automatizável em um pipeline | Sim | Via tshark |
Capture com tcpdump, porque ele está na máquina, é leve e ainda vai estar rodando amanhã. Analise no Wireshark, porque remontar fluxos e extrair arquivos na mão é trabalho que ninguém deveria fazer. Nosso guia do Wireshark cobre em detalhe a metade da análise.
A exceção é real: quando você sabe o que está procurando, tcpdump mais grep ganha de carregar um pcap de 2 GB em uma interface gráfica todas as vezes. "Essa máquina falou com aquele endereço em algum momento" é uma pergunta de uma linha. Não abra o Wireshark para respondê-la.
Considerações legais e éticas
Lembrete essencial: sempre obtenha autorização escrita explícita antes de capturar tráfego em qualquer rede. Captura de pacotes é interceptação: nos Estados Unidos ela cai sob o Wiretap Act, no Reino Unido sob o Investigatory Powers Act, e no Brasil a interceptação de comunicações telemáticas é regida pela Lei 9.296/1996, com o Marco Civil da Internet tratando da proteção do fluxo de comunicações. Você não precisa alterar nada para cometer um crime. Ler o tráfego dos outros já é o crime.
- Capture apenas em redes suas ou nomeadas em um documento de escopo assinado
- O Wi-Fi de cafeteria e de hotel é a rede de outra pessoa, carregando o tráfego privado de outra pessoa. Não é ambiente de treino.
- Filtre já na captura para se limitar ao escopo. Coletar tudo prometendo ignorar a maior parte não é defesa.
- Um arquivo de captura contém credenciais, cookies e mensagens privadas. Criptografe em repouso e apague ao fim do trabalho.
- Em rede compartilhada ou corporativa, avise quem a administra antes de começar. Uma interface em modo promíscuo aparece no monitoramento e é idêntica a um ataque.
Capturas de laboratório e desafios de CTF existem justamente para você construir esses reflexos sem nada disso pesando.
Perguntas frequentes
Para que serve o tcpdump?
Para capturar e inspecionar tráfego de rede pela linha de comando. Administradores o usam para provar qual lado de uma conexão está falhando, equipes de resposta a incidentes para ver com o que uma máquina comprometida conversa, pentesters para encontrar credenciais em texto claro e mapear a rede, e jogadores de CTF para ler os arquivos pcap que os desafios de forense entregam.
Como capturar um número definido de pacotes com o tcpdump?
Use -c. sudo tcpdump -i eth0 -n -c 100 captura 100 pacotes da eth0, imprime um resumo de uma linha para cada um e para sozinho. Acrescente -w capture.pcap para gravar exatamente esses 100 pacotes em um arquivo.
Como gravar uma captura do tcpdump em um arquivo?
Use -w: sudo tcpdump -i eth0 -n -w /tmp/capture.pcap. Nada é impresso no terminal enquanto roda, e isso é normal. Releia com tcpdump -r ou abra no Wireshark. No Debian e no Ubuntu, grave em /tmp ou em outro diretório que o usuário sem privilégios tcpdump alcance.
O tcpdump enxerga tráfego UDP?
Sim. O tcpdump captura todos os protocolos que a interface vê, incluindo UDP, ICMP e ARP. O nome é um acidente histórico de 1988. Filtre com udp, ou refine: sudo tcpdump -i any -n 'udp port 53' mostra o DNS, e o tcpdump decodifica as consultas e respostas para você.
O tcpdump precisa de root?
Para capturar, sim, porque ele precisa de acesso a sockets brutos; para ler um arquivo com -r, não. Para capturar sem sudo, rode uma vez sudo setcap cap_net_raw,cap_net_admin+eip $(which tcpdump).
O tcpdump consegue ler tráfego HTTPS?
Não. O TLS criptografa os dados, então -A mostra bytes aleatórios. Você ainda obtém os metadados: endereços, portas, ritmo, volume e, em geral, o nome do host solicitado no handshake TLS (a menos que o Encrypted Client Hello o esconda). Isso responde "quem falou com o quê e quando", nunca "o que foi dito".
Seus próximos passos
Saber usar o tcpdump leva uma tarde para as opções e algumas capturas reais para a leitura. Não existe atalho que dispense fazê-las.
Então vá fazer uma. Resolva o lab Packet Pursuit e encontre uma flag dividida de propósito entre três protocolos, depois faça o capítulo de forense de rede do nosso curso de DFIR, que leva as mesmas capturas adiante: beaconing, túneis DNS e fingerprinting de TLS. Tudo roda no navegador, e você pode começar no plano gratuito da HackerDNA, sem cartão de crédito. Depois rode o tcpdump na sua própria máquina por cinco minutos e veja com quem o seu notebook conversa quando você acha que ele está parado. Costuma ser uma surpresa.
Parte da série Penetration Testing
Artigos relacionados: