BLOG | ESCRITÓRIO DO DIRETOR DE TECNOLOGIA

eBPF: É tudo sobre observabilidade

Miniatura de James Hendergart
James Hendergart
Publicado em 14 de junho de 2022


De vez em quando, uma tecnologia interessante atinge um ponto de inflexão em que as necessidades reais do negócio se cruzam com os pontos fortes dessa tecnologia. Isso torna a tecnologia não apenas plausível, mas prática. O Berkeley Packet Filter (BPF) atingiu recentemente esse ponto entre os desenvolvedores Linux. O BPF é um ponto de interceptação e processamento extremamente eficiente em um host Linux que promete se expandir para servidores Windows em breve. A gama de dados disponíveis é vasta, aumentando diretamente a visibilidade completa das tarefas operacionais de Engenharia de Confiabilidade do Site (SRE). Também se alinha naturalmente com a resolução de desafios relacionados à segurança e ao gerenciamento de tráfego. A gama de ganchos é igualmente vasta, fornecendo uma gama atraente de pontos de gatilho úteis para aplicativos BPF que atraem especialistas em observabilidade, segurança e rede. O BPF é a tecnologia certa para permitir a observabilidade sem gastar muito. E tudo começa com a observabilidade.

O design fundamental do BPF o torna um método de trabalho computacional quase tão eficiente quanto possível (US$ por watt). Melhor ainda, as cadeias de ferramentas produzem o bytecode para você, para que você possa se concentrar no resultado desejado e não na programação de linguagem assembly de baixo nível. Como? Essas duas características de design fazem o BPF brilhar:

Design do conjunto de instruções

O design do software do BPF foi propositalmente modelado com base nas arquiteturas de CPU modernas emergentes. Na verdade, a terminologia do processador é usada porque descreve com precisão os elementos e o uso do BPF. O BPF possui registros e instruções. Eles são projetados para consumo direto por CPUs. O BPF, baseado no projeto do Filtro de Pacotes BSD (1992), é uma máquina de filtro de captura de pacotes redesenhada, mais adequada às arquiteturas atuais de CPU baseadas em registros. Este design recebeu um impulso natural em 2014, quando o “Enhanced Berkeley Packet Filter” ou eBPF foi lançado na versão 3.18 do kernel Linux. O eBPF foi uma distinção importante do Classic Berkeley Packet Filter (cBPF) nos primeiros dias após seu lançamento. Hoje, a distinção é menos crucial, já que todas as versões suportadas do kernel contêm os aprimoramentos de 2014. Vale a pena destacar: Registradores mais amplos (de 32 bits para 64 bits significa que mais trabalho é feito por linha de cache/ciclo de clock), mais registradores (de 2 para 10 significa mais mapeamento 1 para 1 entre registradores de CPU modernos e ABIs do kernel) e um punhado de melhorias adicionais no conjunto de instruções que tornam os programas BPF mais seguros e úteis.

Camada de Link

O BPF consiste em um tap de rede e um filtro de pacotes. O tap opera na camada de enlace de dados quando os pacotes saem do fio para uma determinada interface de rede. Ele copia pacotes para o filtro interrogar. Este ponto de inserção oferece visibilidade total no caminho de rede do host Linux. Para tráfego de entrada, isso significa antes que o processador do host comece a trabalhar nele, e para tráfego de saída, significa pouco antes de atingir o fio para deixar o host. Este diagrama mostra o BPF cruzando o caminho do pacote de entrada na Camada de Enlace de Dados .

Caminho de entrada

A gama de dados disponíveis é vasta, aumentando diretamente a visibilidade completa das tarefas operacionais do SRE. Neste exemplo, nos concentramos em alguns dos campos mais comumente usados do cabeçalho IPv4 .

Caminho de entrada

Usando esses dados, políticas podem ser definidas para personalizar a filtragem de pacotes. A política a seguir filtra pacotes TCP destinados a um endereço IP de destino específico.

Caminho de entrada

Aproveitar o eBPF para observabilidade tem um benefício BOGO (compre um, leve outro): Os dados observados podem ser usados para outros propósitos além da observação. Por exemplo, roteamento de tráfego ou segurança.

Voltando ao conjunto de dados que compartilhamos anteriormente, partes desse conjunto de dados usadas para observar o caminho de entrada do tráfego de um host Linux são úteis para outras coisas. Por exemplo, IP de origem, IP de destino, host de destino e porta são úteis para roteamento de tráfego de entrada e também para limitar o acesso.

Independentemente do uso, tudo começa com a cópia do pacote pelo tap BPF. Depois que a cópia é feita, os dados podem ser colocados na memória (veja mais em Mapas BPF ) e então exportados como um fluxo de telemetria, além de aproveitados simultaneamente por outros programas BPF que especificam ações de política e filtragem. É aqui que ocorre a ramificação da observabilidade para o gerenciamento de tráfego e segurança. Para capitalizar a extrema eficiência do BPF, o ponto de partida é uma imagem clara de quais dados são necessários e como esses dados são usados. No próximo post desta série, meu colega, Muhammad Waseem Sarwar, explorará opções para programação BPF em vários locais na pilha de rede Linux.