Introdução
Bem-vindo ao laboratório de Filtros de Pacotes Berkeley (BPF)!
Imagine tentar encontrar uma conversa específica em um estádio lotado e barulhento. É exatamente essa a sensação de analisar o tráfego de rede bruto. Um servidor ocupado pode processar milhares de pacotes a cada segundo. Para encontrar os dados específicos de que você precisa, é necessário um filtro de alta precisão.
É aqui que entram os Filtros de Pacotes Berkeley (BPF). O BPF é uma tecnologia profundamente integrada e altamente eficiente que permite definir regras — como uma rede de pesca especializada — para capturar apenas o tráfego de rede que lhe interessa, deixando o restante passar despercebido.
O ponto fundamental é que a filtragem não é apenas uma questão de conveniência. Trata-se de reduzir o ruído antes que ele se torne um problema. Sem filtros, a análise de pacotes rapidamente se transforma em sobrecarga de informações. Com filtros, você pode transformar um fluxo enorme e caótico em uma pergunta focada, como "mostre-me o tráfego deste host" ou "mostre-me apenas as requisições web para esta porta". Essa capacidade é uma das principais razões pelas quais o tcpdump continua sendo útil mesmo em grandes ambientes de produção.
Neste laboratório, você usará o tcpdump para praticar a escrita dessas regras BPF. Você aprenderá a filtrar o fluxo caótico da rede por endereços IP específicos, controlar a direção do tráfego (envio vs. recebimento) e direcionar portas de aplicação específicas. Ao final, você saberá como combinar essas regras para extrair cirurgicamente os eventos exatos de que precisa.
Filtrar por Endereço IP (Host/Rede)
A maneira mais básica de filtrar o tráfego é focando em uma máquina específica, identificada pelo seu endereço IP. Quando você executa o tcpdump sem filtros, ele captura implacavelmente todos os pacotes que vê. Para instruí-lo a ignorar tudo, exceto o tráfego envolvendo uma máquina específica, você usa a palavra-chave host seguida pelo endereço IP.
Este é um bom momento para separar dois conceitos que os iniciantes costumam confundir: uma interface é onde você está ouvindo, enquanto um filtro de IP descreve quais conversas você deseja a partir desse ponto de escuta. Em outras palavras, -i lo decide onde seu microfone está posicionado, e host 127.0.0.1 decide qual orador na sala você deseja ouvir.
Para garantir que tenhamos tráfego para observar, um script em segundo plano já está sendo executado em seu ambiente. Ele está enviando dados continuamente para sua máquina local, que sempre possui o endereço IP interno 127.0.0.1 (também conhecido como localhost).
Vamos capturar 5 pacotes que envolvam este host local. Usaremos -i lo para ouvir na interface de loopback local e -c 5 para parar automaticamente.
Execute o seguinte comando em seu terminal:
sudo tcpdump -i lo -c 5 host 127.0.0.1
Sua tela exibirá uma saída semelhante a esta:
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
10:15:32.123456 IP localhost.45678 > localhost.http-alt: Flags [S], seq 123456789, win 65495, options [mss 65495,sackOK,TS val 123456 ecr 0,nop,wscale 7], length 0
10:15:32.123489 IP localhost.http-alt > localhost.45678: Flags [S.], seq 987654321, ack 123456790, win 65483, options [mss 65495,sackOK,TS val 123456 ecr 123456,nop,wscale 7], length 0
10:15:32.124000 IP localhost > localhost: ICMP echo request, id 1234, seq 1, length 64
...
5 packets captured
Observe que em cada pacote listado, localhost (que é o nome amigável para 127.0.0.1) está presente. O filtro host é altamente inclusivo: ele captura o pacote independentemente de o endereço IP especificado ter enviado ou recebido os dados.
Se você precisar monitorar um grupo inteiro de computadores em vez de uma única máquina, pode substituir a palavra-chave host por net (por exemplo, net 192.168.1.0/24). Por enquanto, focaremos em explorar nosso host único.
Filtrar por Direção (Origem/Destino)
Saber que um computador específico está envolvido em uma conversa é útil, mas às vezes você precisa de mais precisão. Imagine uma agência de correios: você pode querer olhar apenas para as cartas que uma pessoa está enviando, ignorando completamente as cartas que ela está recebendo.
A direção importa porque o tráfego de envio e recebimento geralmente responde a perguntas investigativas diferentes. O tráfego de saída pode revelar o que um host está tentando contatar, o que é útil ao caçar callbacks de malware ou exfiltração de dados. O tráfego de entrada pode revelar quais serviços estão sendo visados, o que é útil ao investigar varreduras ou ataques contra um servidor.
O BPF oferece os modificadores src (origem) e dst (destino) para ditar a direção exata do tráfego.
Vamos refinar nosso filtro para capturar apenas os pacotes que se originam de 127.0.0.1. Ao combinar o modificador src com nossa palavra-chave host anterior, dizemos ao tcpdump exatamente o que procurar.
Execute o seguinte comando:
sudo tcpdump -i lo -c 3 src host 127.0.0.1
Uma dica rápida: escrever src 127.0.0.1 também funciona, pois a palavra host é assumida, mas escrevê-la como src host é considerado uma boa prática, pois torna seu comando incrivelmente fácil de ler.
Sua saída será assim:
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
10:20:15.555111 IP localhost.54321 > localhost.http-alt: Flags [P.], seq 1:85, ack 1, win 512, options [nop,nop,TS val 234567 ecr 234567], length 84
10:20:15.555888 IP localhost.http-alt > localhost.54321: Flags [.], ack 85, win 512, options [nop,nop,TS val 234568 ecr 234567], length 0
10:20:16.111222 IP localhost > localhost: ICMP echo request, id 5678, seq 1, length 64
3 packets captured
Se você observar atentamente a saída, a primeira parte da descrição do pacote (a seção antes do símbolo >) representa o remetente (origem). Como estamos capturando na interface de loopback interna, ambos os lados dizem localhost, mas em um cenário real abrangendo vários computadores, src garante que você esteja visualizando apenas o tráfego de saída daquele endereço específico.
Por outro lado, se você quisesse atuar como um receptor e observar apenas o tráfego de entrada chegando à máquina, você simplesmente usaria dst host 127.0.0.1.
Filtrar por Porta e Protocolo
Filtrar por endereços IP nos leva à máquina certa, mas os servidores modernos realizam muitas tarefas simultaneamente. Um único servidor pode atuar ao mesmo tempo como servidor web, servidor de e-mail e ponto de acesso seguro. Esses diferentes serviços são mantidos separados usando "portas" numeradas.
Portas não são soquetes físicos. São números lógicos usados pelo sistema operacional para manter muitas conversas separadas ao mesmo tempo. É por isso que "mesmo host" não significa necessariamente "mesma aplicação". Uma máquina pode estar envolvida em muitas atividades de rede não relacionadas, e a filtragem de porta ajuda a isolar o serviço exato que você pretende estudar.
Por exemplo, o tráfego web comum quase sempre flui pela porta 80. Para focar em um serviço específico e ignorar o resto, usamos a palavra-chave port.
Nosso script em segundo plano está gerando silenciosamente tráfego web na porta 8080. Vamos configurar o tcpdump para capturar apenas os dados que passam por essa porta específica.
Execute o seguinte comando:
sudo tcpdump -i lo -c 4 port 8080
Exemplo de saída:
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
10:25:10.123456 IP localhost.34567 > localhost.http-alt: Flags [S], seq 1122334455, win 65495, options [mss 65495,sackOK,TS val 345678 ecr 0,nop,wscale 7], length 0
10:25:10.123489 IP localhost.http-alt > localhost.34567: Flags [S.], seq 5544332211, ack 1122334456, win 65483, options [mss 65495,sackOK,TS val 345678 ecr 345678,nop,wscale 7], length 0
10:25:10.123501 IP localhost.34567 > localhost.http-alt: Flags [.], ack 1, win 512, options [nop,nop,TS val 345678 ecr 345678], length 0
10:25:10.124111 IP localhost.34567 > localhost.http-alt: Flags [P.], seq 1:85, ack 1, win 512, options [nop,nop,TS val 345679 ecr 345678], length 84
4 packets captured
Você deve se lembrar das etapas anteriores que havia pacotes ICMP (ping) circulando. No entanto, nesta saída, não há sinal deles. O filtro port 8080 ignorou com sucesso todo o ruído não relacionado, fornecendo uma visão limpa apenas do serviço web.
Além das portas, você também pode filtrar pelo protocolo de rede amplo diretamente, apenas nomeando-o, usando palavras-chave como tcp, udp ou icmp. Vamos testar isso capturando apenas os pacotes ICMP (ping), ignorando efetivamente o tráfego web intenso.
Execute este comando:
sudo tcpdump -i lo -c 2 icmp
Exemplo de saída:
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
10:28:05.999111 IP localhost > localhost: ICMP echo request, id 9012, seq 1, length 64
10:28:05.999133 IP localhost > localhost: ICMP echo reply, id 9012, seq 1, length 64
2 packets captured
Usar as palavras-chave port e de protocolo permite que você corte o ruído e foque exatamente na aplicação que está tentando investigar.
Combinar Filtros com Lógica (AND/OR)
Para dominar verdadeiramente os Filtros de Pacotes Berkeley, devemos aprender a combinar várias regras. Investigações no mundo real raramente são diretas; muitas vezes você precisa definir cenários altamente específicos.
É aqui que o BPF começa a parecer menos uma lista de palavras-chave e mais uma pequena linguagem de consulta para pacotes. Você está descrevendo o tráfego que deseja de uma maneira estruturada e lógica. Mais adiante no curso, essa forma de pensar reaparecerá em muitas ferramentas: pesquisas em SIEM, regras de detecção de intrusão e até consultas de log estilo banco de dados dependem do mesmo hábito de restringir um conjunto de dados amplo a uma condição precisa.
O BPF permite que você conecte condições usando operadores lógicos padrão:
and(ambas as regras devem ser verdadeiras)or(pelo menos uma regra deve ser verdadeira)not(a regra deve ser explicitamente falsa)
Uma dica importante: ao usar operadores lógicos como esses no terminal Linux, é um excelente hábito envolver toda a sua expressão BPF entre aspas (como "port 80 and tcp"). Isso garante que o shell do Linux não confunda acidentalmente seus comandos de filtro com comandos do sistema.
Vamos testar isso. Queremos capturar o tráfego que usa estritamente o protocolo TCP e que está ativamente direcionado para a porta de destino 8080.
Execute o seguinte comando:
sudo tcpdump -i lo -c 4 "tcp and dst port 8080"
Exemplo de saída:
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
10:32:15.111222 IP localhost.45678 > localhost.http-alt: Flags [S], seq 2233445566, win 65495, options [mss 65495,sackOK,TS val 456789 ecr 0,nop,wscale 7], length 0
10:32:15.111255 IP localhost.45678 > localhost.http-alt: Flags [.], ack 3344556678, win 512, options [nop,nop,TS val 456789 ecr 456789], length 0
...
4 packets captured
Neste resultado personalizado, localhost.http-alt aparece apenas no lado direito da seta >, provando que capturamos apenas pacotes destinados a essa porta exata.
Finalmente, vamos olhar para o operador not. Ele é incrivelmente útil para filtrar o "ruído conhecido" para que você possa focar no desconhecido. Imagine que queremos monitorar todo o tráfego na interface de loopback, exceto nosso tráfego web ruidoso na porta 8080.
Execute este comando:
sudo tcpdump -i lo -c 2 "not port 8080"
Exemplo de saída:
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
10:35:22.333444 IP localhost > localhost: ICMP echo request, id 3456, seq 1, length 64
10:35:22.333466 IP localhost > localhost: ICMP echo reply, id 3456, seq 1, length 64
2 packets captured
Como dissemos explicitamente ao tcpdump para banir a porta 8080 dos resultados, ele capturou pacificamente os pacotes de ping ICMP de fundo subjacentes. Ao encadear estrategicamente and, or e not, você pode forjar uma lente incrivelmente precisa para ver exatamente o que precisa em qualquer rede.
Resumo
Parabéns! Você entrou com sucesso no mundo da filtragem avançada de pacotes.
Você aprendeu a peneirar um fluxo de rede caótico para encontrar exatamente o que precisa. Você praticou o direcionamento para computadores específicos usando a palavra-chave host e controlou a direção do fluxo com src e dst. Você isolou aplicações específicas filtrando por uma port e protocolo distintos. Mais importante ainda, você aprendeu a combinar todas essas peças individuais usando operadores lógicos (and, or, not) para construir pesquisas cirúrgicas e altamente específicas.
Essas habilidades são indispensáveis. Seja você um administrador de sistemas caçando uma conexão suspeita ou um analista de segurança rastreando um ataque sofisticado, dominar os Filtros de Pacotes Berkeley garante que você nunca mais será sobrecarregado pelo ruído da rede. Continue experimentando com diferentes combinações!

