Comando tcpdump: capture e analise pacotes na rede

Terminal Linux a mostrar pacotes de rede capturados pelo comando tcpdump com filtros BPF

Há um momento em que os logs deixam de chegar. O serviço diz que está a funcionar, a firewall diz que deixou passar, e mesmo assim alguma coisa na rede não bate certo. É nesse momento que se abre o tcpdump: o utilitário que mostra, pacote a pacote, o que está realmente a circular no cabo — sem interpretações intermédias, sem resumos, apenas os factos.

Neste artigo percorremos as opções e os filtros que realmente interessam, mostramos como o tcpdump se usa para detetar scans de portas e tráfego suspeito, e deixamos um simulador interativo para praticar sem precisar de uma rede de laboratório.

O que faz o tcpdump

O tcpdump captura pacotes diretamente da interface de rede, usando a biblioteca libpcap, e imprime uma linha de resumo por cada um: hora com precisão de microssegundos, endereços e portos de origem e destino, flags TCP, números de sequência e tamanho. Apesar do nome, não se limita ao TCP — captura UDP, ICMP, ARP e tudo o resto que passar na interface. Como precisa de pôr a placa de rede a entregar tráfego que não lhe é destinado, requer privilégios de root (ou a capability CAP_NET_RAW).

A forma geral combina opções com uma expressão de filtro BPF (Berkeley Packet Filter), que decide que pacotes são capturados:

tcpdump [opções] [expressão de filtro]

O detalhe importante: o filtro é aplicado no kernel, antes de os pacotes chegarem ao programa. Filtrar bem não é só uma questão de legibilidade — é o que torna possível capturar numa rede com tráfego intenso sem perder pacotes.

As opções que interessam

Interface e apresentação

  • -i eth0 — escolhe a interface a escutar; -i any apanha todas ao mesmo tempo. Sem -i, o tcpdump usa a primeira interface ativa que encontrar, que nem sempre é a pretendida. -D lista as interfaces disponíveis.
  • -n — desliga a resolução de nomes: IPs e portos em número. Além de ser mais rápido, evita que a própria captura gere consultas DNS — que iriam aparecer na captura. É quase sempre a primeira opção a acrescentar.
  • -c 10 — para automaticamente ao fim de 10 pacotes, em vez de esperar por Ctrl+C. Indispensável em scripts e em redes movimentadas.
  • -v, -vv — mais detalhe por pacote (TTL, checksums, campos DNS); -q faz o contrário. -tttt acrescenta data e hora completas, útil para correlacionar com logs.

Filtros BPF: escolher o que se captura

Os filtros são a alma do comando. Combinam protocolos, endereços e portos com os operadores and, or e not:

# Só o tráfego de/para uma máquina
tcpdump -n -i eth0 host 192.0.2.7

# Todo o SSH, nos dois sentidos
tcpdump -n -i eth0 port 22

# TCP, excluindo a nossa própria sessão SSH
tcpdump -n -i eth0 tcp and not port 22

# Uma rede inteira e um intervalo de portos
tcpdump -n -i eth0 net 192.0.2.0/24 and portrange 8000-8100
  • tcp / udp / icmp — filtram por protocolo.
  • host, net — endereço ou rede, em qualquer direção; src e dst restringem ao sentido (src host, dst port).
  • port, portrange — porto único ou intervalo, como origem ou destino.
  • tcp[tcpflags] — filtra pelas flags TCP. Por exemplo, 'tcp[tcpflags] == tcp-syn' apanha apenas os pacotes SYN puros — a matéria-prima da deteção de scans.

Ver o payload

  • -A — imprime o conteúdo de cada pacote em ASCII. Protocolos em claro, como HTTP ou SMTP, tornam-se legíveis linha a linha; tráfego cifrado aparece como ruído.
  • -X — o mesmo conteúdo em hexadecimal e ASCII lado a lado, para inspecionar protocolos binários.
  • -e — mostra os cabeçalhos Ethernet, com os endereços MAC — útil para investigar ARP spoofing ou máquinas com identidades trocadas.
  • -s — define o snaplen, o número de bytes capturados por pacote. O valor por omissão moderno (262144) captura o pacote inteiro; valores baixos truncam o payload.

Guardar e reler capturas

Analisar em direto é útil, mas o verdadeiro fluxo de trabalho profissional é capturar primeiro e analisar depois:

# Gravar os pacotes em bruto (sem descodificar no ecrã)
tcpdump -n -i eth0 -w captura.pcap tcp and not port 22

# Reler a captura, com outro filtro se for preciso
tcpdump -n -r captura.pcap host 203.0.113.66

O -w grava os pacotes completos em formato pcap, que qualquer ferramenta de análise de tráfego consegue abrir; o -r relê o ficheiro, aceitando filtros como se fosse tráfego ao vivo. Para capturas longas, -C roda os ficheiros por tamanho, -G por tempo e -W limita o número de ficheiros — evitando o clássico disco cheio a meio da noite.

tcpdump em cibersegurança

Deteção de scans de portas. Um scan tem uma assinatura inconfundível: pacotes SYN em rajada, do mesmo endereço de origem, para portos sucessivos, cada um respondido com RST quando o porto está fechado. Um tcpdump -n tcp and not port 22 numa máquina exposta revela o padrão em segundos; com 'tcp[tcpflags] == tcp-syn' isola-se apenas a primeira metade do handshake.

DNS suspeito e exfiltração. O DNS é um canal de saída favorito dos atacantes, porque quase nunca é bloqueado. Consultas TXT em volume, subdomínios longos com aspeto hexadecimal ou aleatório e respostas NXDomain em série são sinais de tunneling ou de exfiltração de dados. Um tcpdump -n udp port 53 mostra cada consulta tal como saiu da máquina.

Tráfego em claro. Correr -A sobre tráfego HTTP interno é um exercício de sensibilização instantâneo: pedidos, cookies e formulários legíveis por quem estiver no caminho — o argumento mais convincente para impor TLS também nas redes internas.

Evidência forense. Durante um incidente, uma captura com -w preserva os pacotes em bruto, com carimbos temporais, antes de qualquer contenção alterar o cenário. O ficheiro pcap junta-se ao relatório e permite reanalisar o tráfego as vezes que forem precisas.

Uma nota que não é opcional: capturar tráfego é intercetar comunicações. Só se faz em redes próprias ou com autorização escrita de quem as administra — em formação, em auditoria ou em resposta a incidentes, o enquadramento legal vem sempre antes do comando.

Experimente no simulador interativo

O simulador abaixo recria uma interface eth0 com tráfego realista: uma sessão SSH, pedidos web, DNS, pings — e um scan de portas escondido no meio. À esquerda vê o tráfego a fluir; à direita, o terminal captura apenas o que passa no filtro escolhido. Clique nas opções para as combinar (os filtros BPF compõem-se entre si), use Demonstrar tudo para seguir a investigação guiada passo a passo, ou navegue com Anterior e Seguinte. A tabela de referência no fundo resume todas as opções.

Erros comuns e boas práticas

  • Capturar a própria sessão SSH. Em administração remota, cada linha que o tcpdump imprime gera tráfego SSH… que o tcpdump captura e imprime. O ciclo enche o ecrã em segundos. Acrescente sempre not port 22 (ou o porto da sua sessão).
  • Esquecer o -n. A resolução de nomes atrasa a captura e gera consultas DNS que contaminam os resultados.
  • -w sem limites. Uma captura sem filtro nem rotação enche o disco. Combine -w com um filtro BPF e com -C/-W em capturas prolongadas.
  • Payload truncado. Se definir um snaplen baixo com -s, o conteúdo dos pacotes vem cortado e a análise posterior fica comprometida. Na dúvida, deixe o valor por omissão.
  • Confundir «não capturado» com «não existe». O filtro BPF descarta no kernel: se o filtro estiver mal escrito, o tráfego existe mas nunca chega ao ecrã. Teste o filtro primeiro sem -w.
  • Capturar sem autorização. Intercetar comunicações de terceiros sem enquadramento legal é crime. Redes próprias ou autorização escrita — sem exceções.

Conclusão

O tcpdump é a testemunha mais fiável do que se passa numa rede: sem agentes, sem consolas, apenas os pacotes tal como circulam. Dominar meia dúzia de filtros BPF — host, port, protocolo e os operadores and/not — chega para diagnosticar a maioria dos problemas de rede e para reconhecer um scan ou uma exfiltração em curso. Se quer levar estas competências mais longe, com formação prática em segurança de redes e resposta a incidentes, conheça o catálogo de serviços de formação e consultoria da HJFR — e espreite também o artigo sobre o useradd, outro clássico da administração de sistemas.

Este artigo faz parte da série “Comandos Linux, um a um” do blog HJFR — fique atento aos próximos comandos.