Red Hat Training

A Red Hat training course is available for RHEL 8

Capítulo 48. Entendendo as características da rede eBPF na RHEL

O Filtro de Pacotes Berkeley estendido (eBPF) é uma máquina virtual no kernel que permite a execução do código no espaço do kernel. Este código é executado em um ambiente restrito de sandbox com acesso apenas a um conjunto limitado de funções.

Em rede, você pode usar o eBPF para complementar ou substituir o processamento de pacotes de kernel. Dependendo do gancho usado, os programas eBPF têm, por exemplo:

  • Acesso de leitura e escrita aos dados e metadados dos pacotes
  • Pode procurar soquetes e rotas
  • Pode definir opções de soquetes
  • Pode redirecionar pacotes

48.1. Visão geral das características de rede eBPF na RHEL

Você pode anexar programas ampliados de rede Berkeley Paket Filter (eBPF) aos seguintes ganchos no RHEL:

  • eXpress Data Path (XDP): Fornece acesso antecipado aos pacotes recebidos antes que a pilha do kernel em rede os processe.
  • tc Classificador eBPF com bandeira de ação direta: Fornece um poderoso processamento de pacotes na entrada e na saída.
  • Grupos de controle versão 2 (cgroup v2): Permite filtrar e sobrepor operações baseadas em soquetes realizadas por programas em um grupo de controle.
  • Filtragem de soquetes: Permite a filtragem de pacotes recebidos de soquetes. Esta característica também estava disponível no clássico Berkeley Packet Filter (cBPF), mas foi estendida para suportar programas eBPF.
  • Stream parser: Permite dividir os fluxos em mensagens individuais, filtrá-las e redirecioná-las para soquetes.
  • SO_REUSEPORT seleção do soquete: Fornece uma seleção programável de um soquete receptor de um grupo de soquetes reuseport.
  • Dissecador de fluxo: Permite anular o modo como os cabeçalhos de pacotes de análise do núcleo em determinadas situações.
  • Controle de congestionamento TCP: Permite a implementação de um algoritmo personalizado de controle de congestionamento TCP.
  • Rotas com encapsulamento: Permite criar encapsulamento personalizado de túneis.

Note que a Red Hat não suporta todas as funcionalidades do eBPF que estão disponíveis no RHEL e descritas aqui. Para mais detalhes e o status de suporte dos ganchos individuais, consulte as Notas de Lançamento do RHEL 8 e a seguinte visão geral.

XDP

Você pode anexar programas do tipo BPF_PROG_TYPE_XDP a uma interface de rede. O kernel então executa o programa nos pacotes recebidos antes que a pilha de rede do kernel comece a processá-los. Isto permite o encaminhamento rápido de pacotes em determinadas situações, tais como queda rápida de pacotes para evitar ataques de Negação de Serviço Distribuída (DDoS) e redirecionamentos rápidos de pacotes para cenários de balanceamento de carga.

Você também pode usar o XDP para diferentes formas de monitoramento e amostragem de pacotes. O kernel permite que os programas XDP modifiquem os pacotes e os passem para processamento posterior na pilha de rede do kernel.

Os seguintes modos XDP estão disponíveis:

  • Nativo (motorista) XDP: O kernel executa o programa a partir do ponto mais próximo possível durante a recepção do pacote. Neste momento, o kernel não analisou o pacote e, portanto, nenhum metadado fornecido pelo kernel está disponível. Este modo requer que o driver da interface de rede suporte XDP, mas nem todos os drivers suportam este modo nativo.
  • Genéricos XDP: A pilha de rede do núcleo executa o programa XDP no início do processamento. Naquele momento, as estruturas de dados do kernel foram alocadas, e o pacote foi pré-processado. Se um pacote deve ser descartado ou redirecionado, ele requer uma sobrecarga significativa em comparação com o modo nativo. Entretanto, o modo genérico não requer suporte de driver de interface de rede e funciona com todas as interfaces de rede.
  • XDP descarregado: O kernel executa o programa XDP na interface de rede ao invés de na CPU do host. Note que isto requer hardware específico, e somente certas características do eBPF estão disponíveis neste modo.

Na RHEL, carregue todos os programas XDP usando a biblioteca libxdp. Esta biblioteca permite o uso controlado pelo sistema do XDP.

Nota

Atualmente, há algumas limitações na configuração do sistema para programas XDP. Por exemplo, é necessário desativar certos recursos de descarregamento de hardware na interface de recepção. Além disso, nem todas as características estão disponíveis com todos os drivers que suportam o modo nativo.

No RHEL 8.3, a Red Hat suporta o recurso XDP somente se todas as seguintes condições se aplicarem:

  • Você carrega o programa XDP em uma arquitetura AMD ou Intel de 64 bits.
  • Você usa a biblioteca libxdp para carregar o programa no kernel.
  • O programa XDP utiliza um dos seguintes códigos de retorno: XDP_ABORTED, XDP_DROP, ou XDP_PASS.
  • O programa XDP não utiliza a descarga de hardware XDP.

Além disso, a Red Hat fornece o seguinte uso das características do XDP como uma visualização tecnológica não suportada:

  • Carregamento de programas XDP em arquiteturas que não AMD e Intel 64 bits. Note que a biblioteca libxdp não está disponível para outras arquiteturas que não AMD e Intel 64 bits.
  • Os códigos de retorno XDP_TX e XDP_REDIRECT.
  • A descarga de hardware do XDP.

AF_XDP

Usando um programa XDP que filtra e redireciona os pacotes para um determinado soquete AF_XDP, você pode usar um ou mais soquetes da família de protocolos AF_XDP para copiar rapidamente os pacotes do kernel para o espaço do usuário.

No RHEL 8.3, a Red Hat fornece esta característica como uma prévia tecnológica não suportada.

Controle de tráfego

O subsistema de Controle de Tráfego (tc) oferece os seguintes tipos de programas de eBPF:

  • BPF_PROG_TYPE_SCHED_CLS
  • BPF_PROG_TYPE_SCHED_ACT

Estes tipos permitem escrever classificadores personalizados tc e ações tc no eBPF. Juntamente com as partes do ecossistema tc, isto proporciona a capacidade de processamento poderoso de pacotes e é a parte central de várias soluções de orquestração em rede de contêineres.

Na maioria dos casos, somente o classificador é usado, como com a bandeira de ação direta, o classificador eBPF pode executar ações diretamente do mesmo programa eBPF. A Disciplina de Enfileiramento clsact (qdisc) foi projetada para permitir isso no lado da entrada.

Note que o uso de um programa de dissecador de fluxo eBPF pode influenciar a operação de alguns outros classificadores qdiscs e tc, tais como flower.

O recurso eBPF para tc é totalmente suportado no RHEL 8.2 e posteriores.

Filtro de soquetes

Vários utilitários usam ou já usaram o clássico Berkeley Packet Filter (cBPF) para filtrar os pacotes recebidos em um soquete. Por exemplo, o utilitário tcpdump permite que o usuário especifique expressões, que tcpdump então se traduz em código cBPF.

Como alternativa ao cBPF, o kernel permite programas eBPF do tipo BPF_PROG_TYPE_SOCKET_FILTER para o mesmo propósito.

No RHEL 8.3, a Red Hat fornece esta característica como uma prévia tecnológica não suportada.

Grupos de controle

Na RHEL, você pode usar vários tipos de programas eBPF que você pode anexar a um cgroup. O kernel executa estes programas quando um programa no cgroup em questão executa uma operação. Note que você pode usar apenas a versão 2 do cgroups.

Os seguintes programas de cgroup eBPF relacionados à rede estão disponíveis na RHEL:

  • BPF_PROG_TYPE_SOCK_OPS: O kernel chama este programa durante um TCP connect e permite a configuração de operações TCP por soquete.
  • BPF_PROG_TYPE_CGROUP_SOCK_ADDR: O kernel chama este programa durante connect, bind, sendto, e recvmsg operações. Este programa permite a mudança de endereços IP e portas.
  • BPF_PROG_TYPE_CGROUP_SOCKOPT: O kernel chama este programa durante as operações em setsockopt e getsockopt e permite mudar as opções.
  • BPF_PROG_TYPE_CGROUP_SOCK: O kernel chama este programa durante a criação de soquetes e a vinculação a endereços. Você pode usar estes programas para permitir ou negar a operação, ou apenas para inspecionar a criação de soquetes para estatísticas.
  • BPF_PROG_TYPE_CGROUP_SKB: Este programa filtra pacotes individuais na entrada e na saída, e pode aceitar ou rejeitar pacotes.
  • BPF_PROG_TYPE_CGROUP_SYSCTL: Este programa permite a filtragem do acesso aos controles do sistema (sysctl).

No RHEL 8.3, a Red Hat fornece esta característica como uma prévia tecnológica não suportada.

Stream Parser

Um analisador de fluxo opera em um grupo de tomadas que são adicionadas a um mapa especial de eBPF. O programa eBPF processa então os pacotes que o kernel recebe ou envia nesses soquetes.

Os seguintes programas de análise de fluxos eBPF estão disponíveis na RHEL:

  • BPF_PROG_TYPE_SK_SKB: Um programa eBPF analisa os pacotes recebidos do soquete em mensagens individuais, e instrui o kernel a soltar essas mensagens ou enviá-las para outro soquete do grupo.
  • BPF_PROG_TYPE_SK_MSG: Este programa filtra as mensagens de saída. Um programa eBPF analisa os pacotes em mensagens individuais e os aprova ou rejeita.

No RHEL 8.3, a Red Hat fornece esta característica como uma prévia tecnológica não suportada.

SO_REUSEPORT seleção de soquetes

Usando esta opção de soquete, você pode ligar vários soquetes ao mesmo endereço IP e porta. Sem o eBPF, o kernel seleciona o soquete receptor com base em um hash de conexão. Com o programa BPF_PROG_TYPE_SK_REUSEPORT, a seleção do soquete receptor é totalmente programável.

No RHEL 8.3, a Red Hat fornece esta característica como uma prévia tecnológica não suportada.

Dissecador de fluxo

Quando o kernel precisa processar cabeçalhos de pacotes sem passar pela decodificação do protocolo completo, eles são dissected. Por exemplo, isto acontece no subsistema tc, em roteamento multipath, em bonding, ou ao calcular um hash de pacote. Nesta situação o kernel analisa os cabeçalhos dos pacotes e preenche as estruturas internas com as informações dos cabeçalhos dos pacotes. Você pode substituir este analisador interno usando o programa BPF_PROG_TYPE_FLOW_DISSECTOR. Note que você só pode dissecar TCP e UDP sobre IPv4 e IPv6 no eBPF no RHEL.

No RHEL 8.3, a Red Hat fornece esta característica como uma prévia tecnológica não suportada.

Controle de Congestionamento TCP

Você pode escrever um algoritmo de controle de congestionamento TCP personalizado usando um grupo de programas BPF_PROG_TYPE_STRUCT_OPS que implementam struct tcp_congestion_oops callbacks. Um algoritmo que é implementado desta forma está disponível para o sistema junto com os algoritmos de kernel embutidos.

No RHEL 8.3, a Red Hat fornece esta característica como uma prévia tecnológica não suportada.

Rotas com encapsulamento

Você pode anexar um dos seguintes tipos de programa eBPF a rotas na tabela de rotas como um atributo de encapsulamento de túnel:

  • BPF_PROG_TYPE_LWT_IN
  • BPF_PROG_TYPE_LWT_OUT
  • BPF_PROG_TYPE_LWT_XMIT

A funcionalidade de tal programa eBPF é limitada a configurações específicas de túneis e não permite criar uma solução genérica de encapsulamento ou decapsulamento.

No RHEL 8.3, a Red Hat fornece esta característica como uma prévia tecnológica não suportada.