O que é XDP (Express Data Path) no Linux

Starship Prompt (1)

XDP (ou Express Data Path) é uma utilidade de rede disponível no kernel do Linux. O XDP é utilizado em muitas empresas populares para resolver sérios problemas de rede que enfrentam ao lidar com milhões de requisições por segundo. Este é um programa de código aberto licenciado sob MIT, fundido ao kernel do Linux a partir da versão 4.8.

O XDP é um processador de pacotes de dados de rede programável e de alto desempenho. Ele foi criado para mitigar alguns problemas sérios do lado do servidor, como ataques DDoS (Serviço de Negação Distribuído) ou como um balanceador de carga.

Sumário

  • Necessidade de XDP
  • Por que o XDP é muito rápido
  • Conectar a Pilha de Rede com XDP
  • Tipos de Operação que o XDP Realiza
  • XDP e eBPF
  • Casos de Uso Comuns do XDP e eBPF
  • Perguntas Frequentes

Leia também: 5 Dicas Úteis ao Compilar Seu Próprio Kernel Linux

Necessidade de XDP

A necessidade de um caminho de dados de rede de alto desempenho é sempre um recurso necessário para servidores Linux. Mas a programabilidade desses caminhos de dados também deve estar presente para que os desenvolvedores possam criar algo utilizável a partir disso. Embora o XDP tenha um caminho de aprendizado bastante acentuado, devido ao recente desenvolvimento de muitas ferramentas e estruturas, escrever código XDP é bastante acessível atualmente.

A enorme vantagem do XDP é sua velocidade. A funcionalidade primária do XDP é que os desenvolvedores podem construir novas funcionalidades para filtrar pacotes sem modificar o próprio kernel.

Existem alguns cenários em que alguns pacotes não precisam passar por toda a pilha de rede apenas para decidir se devem ser encaminhados ou descartados. Isso deve ser feito na primeira camada da pilha de rede, colocando alguns filtros. Esses filtros devem ser programados de tal forma que consigam reconhecer facilmente um pacote malicioso e descartá-lo logo no início da pilha. Isso pode economizar muito poder de processamento e tempo.

Com o XDP, essa filtragem é possível exatamente na frente da pilha de rede.

Agora, usando o XDP, o desenvolvedor pode filtrar quaisquer pacotes que possam ser enviados por qualquer hacker para fazer um ataque DDoS. Isso pode reduzir muito a sobrecarga na pilha de rede normal do kernel. Esse recurso foi recentemente demonstrado pela Cloudflare em sua demonstração de proteção contra DDoS.

Xdp 1

Algumas características notáveis do XDP são as seguintes:

  1. Não requer hardware especializado: O XDP pode rodar em qualquer hardware que você utilizar. Sim, a velocidade pode ser comprometida se você não tiver o dispositivo ou seus drivers otimizados, mas para fins de teste, você não precisa de hardware especializado.
  2. Não requer bypass do kernel: O XDP é executado antes que o pacote atinja a pilha de rede do kernel. Uma função de retorno é acionada quando um pacote é recebido e o XDP o processa o mais rápido possível.
  3. Não substitui a pilha TCP/IP: O XDP está presente no nível mais baixo da pilha de rede. Quando ele passa o pacote, o pacote entra na pilha normal de rede do kernel, que inclui a pilha TCP/IP.
  4. Funciona em conjunto com TCP/IP com todos os recursos do BPF (Berkeley Packet Filter): O XDP não substitui nada. Ele até usa eBPF para processar pacotes e dar ao desenvolvedor um tempo mais fácil para escrever código.

Leia também: Como Compilar e Instalar um Kernel Personalizado no Ubuntu

Por que o XDP é Muito Rápido

O XDP é um caminho de dados de rede programável e de alto desempenho baseado em eBPF no kernel do Linux. O ganho de desempenho do XDP se deve ao processamento de pacotes em nível bare metal no nível mais baixo da pilha de software. Isso significa que o pacote de dados que vem da rede atinge o XDP primeiro antes de qualquer outro processo do kernel.

Portanto, os engenheiros podem programar o XDP para otimizá-lo para vários casos de uso. Desde proteção contra DDoS até balanceamento de carga.

O XDP é carregado diretamente na pilha de rede. Quando um pacote é recebido pela pilha de rede, ele recebe um retorno e processa os pacotes o mais rápido possível. O XDP pode descartar 26 milhões de pacotes por segundo por núcleo em hardware comum.

A principal razão pela qual o XDP é muito rápido é que o usuário pode ler ou fazer alterações diretamente nos dados do pacote de rede e tomar decisões sobre como lidar com o pacote em uma fase anterior. Isso requer muito menos sobrecarga de processo e resulta em melhor velocidade.

Conectar a Pilha de Rede com XDP

Você pode se conectar à rede com o XDP por vários meios, mas estou mencionando alguns métodos populares aqui.

  1. XDP Genérico: Nesse processo, o XDP é carregado no kernel, mas obtém muito pouco benefício de desempenho. Esta é a maneira fácil de executar um programa XDP sem qualquer suporte do hardware.
  2. XDP Nativo: O XDP Nativo é carregado pelo próprio driver de rede. Isso exige suporte do driver da placa de rede.

Leia também: Como Corrigir o Erro de Entrada de Dados do Kernel no Windows

Tipos de Operação que o XDP Realiza

Algumas das operações que o XDP pode realizar uma vez que um pacote é recebido pela interface de rede são:

  1. XDP_DROP: Ele descarta os pacotes e não os processa. Usando um programa eBPF para analisar o padrão de tráfego e pode descartar pacotes em tempo real.
  2. XDP_PASS: Ele encaminha os pacotes para a pilha de rede para processamento adicional. Pode modificar o conteúdo do pacote antes que isso ocorra.
  3. XDP_ABORTED: Ele descarta o pacote de dados de rede, deixando uma exceção de ponto de rastreamento.
  4. XDP_TX: Encaminha os pacotes para a mesma interface de rede que os recebeu. Os pacotes podem ser modificados ou não.
  5. XDP_REDIRECT: Redireciona o pacote para outro NIC (controlador de interface de rede).

Xdp 2 1

XDP e eBPF

eBPF é a versão estendida do Berkeley Packet Filter. É como uma máquina virtual abstrata rodando dentro do kernel do Linux. O eBPF é usado para executar um programa definido pelo usuário dentro de um ambiente sandbox no kernel do Linux. Geralmente, é usado para executar ferramentas de rede e monitoramento em servidores Linux para garantir desempenho ideal.

O XDP é uma estrutura usada para escrever um processamento de pacotes de muito alta velocidade em aplicações BPF. Para torná-lo ainda mais rápido, o XDP executa BPF imediatamente após um pacote ser recebido pela pilha de rede.

O XDP tem uma curva de aprendizado bastante acentuada. Portanto, os desenvolvedores estão criando ferramentas e estruturas para facilitar a programação usando eBPF. Isso torna muito fácil escrever código para processar redes de alta frequência usando XDP e eBPF. A principal vantagem do XDP é que ele não exige que você modifique o kernel, o que era uma grande dor de cabeça para os engenheiros.

Mas como as pessoas dizem, um grande poder vem com uma grande responsabilidade. Como o XDP executa o eBPF o mais cedo possível, antes que os pacotes sejam analisados pelo próprio kernel, os programas eBPF têm que fazer toda a análise sozinhos e não podem contar com o kernel para fazer algo por eles.

Como programador, a maior parte do seu tempo você está trabalhando com terminal. Este é um guia para decorar seu prompt de terminal. Confira!

Leia também: Como Reverter o Kernel no Linux

Casos de Uso Comuns do XDP e eBPF

  1. Ataque DDoS: O principal caso de uso do XDP é a proteção contra DDoS (Serviço de Negação Distribuído). Durante um ataque DDoS, o atacante tenta usar o máximo de recursos do servidor possível, não deixando nenhum processo para o usuário final. Usando o XDP como a camada muito rápida da pilha de rede, não há custo de processamento associado ao descartar um pacote de dados de rede. Após a filtragem do XDP, o pacote passa por todos os outros métodos de filtragem que o kernel do Linux fornece.
  2. Balanceador de carga: O XDP também é usado como um balanceador de carga para lidar com uma enorme quantidade de tráfego para o servidor. Incluindo o Facebook, muitas grandes empresas de tecnologia usam essa tecnologia. Anteriormente, os engenheiros utilizavam um servidor dedicado como balanceador de carga. O que é muito difícil de gerenciar e precisa ter um bom desempenho para atender milhões de clientes. Mas imagine usar a camada do XDP como um balanceador de carga sem um servidor central, como resultado, não há um único ponto de falha.
  3. Firewall: O XDP com eBPF pode ser utilizado para escrever várias regras de firewall para proteger o sistema com uma sobrecarga muito mínima.

Leia também: Como Usar o Comando Rm no Linux

Perguntas Frequentes

O que é BCC em eBPF?

BCC é construído sobre eBPF. É um conjunto de ferramentas ou estrutura para rastreamento e manipulação de programas do kernel que vem com uma interface de linha de comando muito útil. O BCC ajuda a escrever instruções de kernel em C. Ele também inclui um envoltório em torno do LLVM.

O que é libBPF?

LibBPF é um conjunto alternativo de ferramentas para criar uma aplicação BPF. É escrito na linguagem de programação C.