Entendendo o BPF no Linux: do Básico ao avançado

Escrito por
Emanuel Negromonte
Emanuel Negromonte é Jornalista, Mestre em Tecnologia da Informação e atualmente cursa a segunda graduação em Engenharia de Software. Com 14 anos de experiência escrevendo sobre...

Guia completo para entender o BPF no Linux, do básico ao avançado

Imagine o kernel Linux como um grande maestro conduzindo uma orquestra de processos, rede e I/O. Tradicionalmente, alterar o comportamento desse maestro exigia escrever trechos de código no kernel — arriscado e complicado. O BPF (Berkeley Packet Filter) mudou esse jogo: é como permitir que você escreva pequenos “scripts” seguros e eficientes que podem ser carregados em pontos-chave do kernel, sem precisar recompilar nada. Em vez de contratar um maestro inteiro, você entrega ao kernel instruções precisas sobre como tocar uma nota aqui ou ali, reduzindo latência e ganhando controle refinado.

Para iniciantes: O que é e como começar

1. A ideia por trás do BPF

  • Observação e reconfiguração em tempo real: Você consegue inspecionar pacotes de rede, chamadas de sistema e eventos de trace sem parar o sistema.
  • Sandbox seguro: O código BPF passa por uma verificação (verifier) antes de ser executado, evitando loops infinitos e acessos indevidos.
  • Alta performance: Após carregado, o código BPF é compilado em JIT e roda quase tão rápido quanto código C nativo.

2. Glossário essencial

  • eBPF (extended BPF): Versão moderna que vai além de filtros de pacotes, suportando tracing, métricas e políticas de segurança.
  • Mapas BPF: Estruturas de dados chave-valor compartilhadas entre kernel e usuáriospace, usadas para armazenar contadores, estatísticas ou configurações.
  • Helpers: Funções pré-definidas que o BPF pode chamar (por exemplo, bpf_map_lookup_elem), garantindo acesso controlado a serviços do kernel.

3. Primeiro exemplo prático

A seguir, veja como rodar um exemplo simples de eBPF em diferentes distribuições Linux. O objetivo é monitorar processos executados em tempo real usando a ferramenta execsnoop.

Ubuntu/Debian

sudo apt update
sudo apt install bpfcc-tools
sudo /usr/share/bcc/tools/execsnoop

Fedora

sudo dnf install bcc-tools
sudo /usr/share/bcc/tools/execsnoop

Arch Linux

sudo pacman -S bcc
sudo /usr/share/bcc/tools/execsnoop

CentOS/RHEL (8+)

sudo dnf install bcc-tools
sudo /usr/share/bcc/tools/execsnoop

Dica: Se preferir usar o bloco de código nativo do WordPress, basta copiar e colar o comando acima dentro do bloco “Código” do editor Gutenberg. Assim, o formato e a legibilidade serão mantidos para seus leitores.

Esse comando irá exibir, em tempo real, cada processo que for iniciado no sistema, mostrando o poder do eBPF para observabilidade sem precisar modificar o kernel.

Para usuários avançados: Explorando o poder total

1. Tracing estruturado com BPF

Ferramentas como bcc e bpftrace permitem definir probes em funções do kernel ou usuáriospace. Por exemplo, em bpftrace:

sudo bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("openat: %s\n", str(args->filename)); }'

Esse comando monitora todas as chamadas openat(), mostrando o nome do arquivo acessado e ajudando a diagnosticar gargalos de I/O.

2. Programas BPF em C puro com libbpf

Para máxima performance e flexibilidade, escreva BPF em C e use:

struct bpf_program *prog = bpf_object__find_program_by_name(obj, "handle_event");
bpf_program__load(prog, );
bpf_program__attach(prog, );

Essa abordagem exige entender seções ELF (.text, .maps) e lidar manualmente com mapas e sequestros de eventos, mas permite pipelines complexos de coleta e filtragem.

3. Aplicações reais

  • Segurança: projetos como Cilium usam eBPF para firewall de nível 7 em Kubernetes, substituindo iptables com regras dinâmicas.
  • Observabilidade: sistemas como Falco criam regras que disparam alertas em eventos suspeitos (execução de scripts, montagem de dispositivos).
  • Networking de Alta Performance: XDP (eXpress Data Path) permite processar milhões de pacotes por segundo antes mesmo da pilha de rede tradicional.

4. Boas práticas e desafios

  • Verificação de Recursos: mapas podem vazar memória se não forem cuidadosamente destruídos no userspace.
  • Limites de Complexidade: programas BPF têm restrições de loops e tamanho de stack; designs recursivos ou demasiado grandes falham no verifier.
  • Compatibilidade de Kernel: algumas helpers só existem em versões recentes; mantenha teste de feature-gating para máxima portabilidade.

Conclusão

Do primeiro execsnoop até pipelines de segurança em larga escala, o BPF se transformou na ferramenta definitiva para quem quer explorar, medir e moldar o comportamento do kernel sem riscos de reboot ou recompilação. Para iniciantes, as ferramentas de alto nível permitem mergulhar e já obter valor; para usuários avançados, a API libbpf abre um universo de possibilidades de otimização, segurança e observabilidade. O próximo passo é explorar: qual será o seu primeiro programa BPF?

Compartilhe este artigo