bpfilter - Filtragem de Pacotes Linux Baseada em BPF
bpfilter é um daemon que converte regras de firewall familiares em programas BPF otimizados. O problema de longa data que ele aborda: iptables tem sintaxe bem compreendida mas um teto de desempenho de avaliação sequencial de regra, enquanto eBPF/XDP bruto é rápido mas requer escrever e manter código BPF. bpfilter os conecta — você expressa regras de um jeito familiar, e ele as compila em BPF eficiente anexado no hook certo (incluindo XDP, que processa pacotes antes deles entrarem na stack de rede).
Mudanças de firewall podem trancá-lo do acesso a um host remoto. Teste em um sistema acessível por console e mantenha um caminho de rollback.
Requisitos
- Kernel Linux moderno com suporte BPF (6.4+ recomendado)
- Privilégios de root (carrega programas BPF)
libbpf disponível
Instalação
| Método | Como |
|---|
| Do source | git clone https://github.com/facebook/bpfilter && make && sudo make install |
| Pacote distro | Disponível em algumas distribuições mais novas |
| Iniciar daemon | sudo bpfilter (ou via systemd) |
| Verificar | bpfilter --version |
Arquitetura
| Peça | Papel |
|---|
bpfilter daemon | Recebe regras, gera e carrega BPF |
bfcli | CLI nativa para expressar regras |
| Front-end de iptables/nftables | Traduzir regras existentes em bpfilter |
| Programas BPF | O filtro compilado anexado a um hook |
Hooks de Anexação
| Hook | Onde pacotes são processados |
|---|
| XDP | Mais cedo — no driver, antes da stack (mais rápido) |
| TC (traffic control) | Após análise básica, ingress/egress |
| cgroup | Filtragem de socket por-cgroup |
| Netfilter | Colocação compatível no caminho clássico |
Escolher XDP dá o maior ganho de desempenho, particularmente para derrotar tráfego indesejado (mitigação de DDoS), porque pacotes rejeitados nunca atravessam a stack.
# Conceitual ruleset: drop padrão, permitir SSH e tráfego estabelecido
sudo bfcli ruleset set --from-str '
chain BF_HOOK_XDP policy DROP
rule
ip4.proto tcp
tcp.dport 22
ACCEPT
rule
ip4.saddr 10.0.0.0/8
ACCEPT
'
| Comando | Descrição |
|---|
bfcli ruleset set --from-file F | Carregar regras de um arquivo |
bfcli ruleset get | Mostrar o ruleset ativo |
bfcli ruleset flush | Remover todas as regras |
bfcli chain set | Gerenciar uma chain única |
Matchers
| Matcher | Corresponde |
|---|
ip4.saddr / ip4.daddr | IPv4 fonte/destino (CIDR suportado) |
ip6.saddr / ip6.daddr | Endereços IPv6 |
ip4.proto | Protocolo (tcp, udp, icmp) |
tcp.dport / tcp.sport | Portas TCP |
udp.dport / udp.sport | Portas UDP |
tcp.flags | Combinações de flag TCP |
meta.ifindex | Interface |
Verdicts
| Verdict | Efeito |
|---|
ACCEPT | Permitir o pacote |
DROP | Descartar silenciosamente |
CONTINUE | Cair através para a próxima regra |
Usando Regras iptables Existentes
bpfilter vem com front-ends de tradução para que você possa manter ferramentas existentes:
# Apontar o front-end compatível com iptables para bpfilter
sudo iptables-bpfilter -A INPUT -p tcp --dport 22 -j ACCEPT
Este é o caminho de migração: mantenha sua sintaxe de regra e scripts de gerenciamento, ganhe execução de BPF por baixo.
Verificando
| Verificação | Comando |
|---|
| Ruleset ativo | sudo bfcli ruleset get |
| Programas BPF carregados | sudo bpftool prog list |
| XDP anexado | ip link show <iface> |
| Contadores | Contadores de regra em bfcli ruleset get |
| Overhead | sudo bpftop para ver custo do programa |
bpfilter vs Alternativas
| Aspecto | bpfilter | iptables | nftables | XDP/eBPF bruto |
|---|
| Desempenho | Alto (BPF/XDP) | Menor (sequencial) | Melhor que iptables | Maior |
| Sintaxe | Familiar ou bfcli | Familiar | Moderno, unificado | Escrever código BPF |
| Maturidade | Mais novo | Muito maduro | Maduro | Depende de você |
| Melhor para | Velocidade de BPF com regras familiares | Compatibilidade legada | Netfilter moderno | Datapaths customizados |
Inspecione seu custo de runtime com bpftop; compare com iptables para o caminho clássico.
Recursos