Aller au contenu

bpfilter - Filtrage de paquets Linux basé sur BPF

bpfilter - Filtrage de paquets Linux basé sur BPF

bpfilter est un daemon qui convertit les règles de pare-feu familières en programmes BPF optimisés. Le problème de longue date qu’il adresse : iptables a une syntaxe bien comprise mais un plafond de performance de l’évaluation des règles séquentielles, tandis que le eBPF/XDP brut est rapide mais nécessite d’écrire et de maintenir le code BPF. bpfilter les rapproche — vous exprimez les règles de manière familière, et il les compile en BPF efficace attaché au bon crochet (incluant XDP, qui traite les paquets avant qu’ils n’entrent dans la pile réseau).

Les changements de pare-feu peuvent vous verrouiller hors d’un hôte distant. Testez sur un système accessible via la console et gardez un chemin de restauration.

Prérequis

  • Kernel Linux moderne avec support BPF (6.4+ recommandé)
  • Privilèges root (charge les programmes BPF)
  • libbpf disponible

Installation

MéthodeComment
Depuis la sourcegit clone https://github.com/facebook/bpfilter && make && sudo make install
Paquet de distributionDisponible dans certaines distributions plus récentes
Démarrer daemonsudo bpfilter (ou via systemd)
Vérifierbpfilter --version

Architecture

PièceRôle
Daemon bpfilterReçoit les règles, génère et charge le BPF
bfcliCLI natif pour exprimer les règles
Frontend iptables/nftablesTraduire les règles existantes en bpfilter
Programmes BPFLe filtre compilé attaché à un crochet

Crochets d’attachement

CrochetOù les paquets sont traités
XDPLe plus tôt — dans le driver, avant la pile (le plus rapide)
TC (contrôle du trafic)Après l’analyse basique, ingress/egress
cgroupFiltrage de socket par cgroup
NetfilterPlacement compatible dans le chemin classique

Choisir XDP donne le plus grand gain de performance, particulièrement pour le dropping de trafic non désiré (mitigation DDoS), parce que les paquets rejetés ne traversent jamais la pile.

Définir les règles avec bfcli

# Ensemble de règles conceptuel : drop par défaut, autoriser SSH et trafic établi
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
'
CommandeDescription
bfcli ruleset set --from-file FCharger les règles à partir d’un fichier
bfcli ruleset getAfficher l’ensemble de règles actif
bfcli ruleset flushSupprimer toutes les règles
bfcli chain setGérer une chaîne unique

Matchers

MatcherCorrespond
ip4.saddr / ip4.daddrIPv4 source/destination (CIDR supporté)
ip6.saddr / ip6.daddrAdresses IPv6
ip4.protoProtocole (tcp, udp, icmp)
tcp.dport / tcp.sportPorts TCP
udp.dport / udp.sportPorts UDP
tcp.flagsCombinaisons de flags TCP
meta.ifindexInterface

Verdicts

VerdictEffet
ACCEPTAutoriser le paquet
DROPRejeter silencieusement
CONTINUETomber à la règle suivante

Utiliser les règles iptables existantes

bpfilter expédie les frontends de traduction afin que vous puissiez garder les outils existants :

# Pointer le frontend compatible iptables vers bpfilter
sudo iptables-bpfilter -A INPUT -p tcp --dport 22 -j ACCEPT

C’est le chemin de migration : garder la syntaxe de votre règle et les scripts de gestion, gagner l’exécution BPF en dessous.

Vérification

VérificationCommande
Ensemble de règles actifsudo bfcli ruleset get
Programmes BPF chargéssudo bpftool prog list
XDP attachéip link show <iface>
CompteursCompteurs de règles dans bfcli ruleset get
Surchargesudo bpftop pour voir le coût du programme

bpfilter vs alternatives

AspectbpfilteriptablesnftableseBPF/XDP brut
PerformanceÉlevée (BPF/XDP)Inférieure (séquentielle)Meilleure qu’iptablesLa plus élevée
SyntaxeFamilière ou bfcliFamilièreModerne, unifiéeÉcrire le code BPF
MaturitéPlus récentTrès matureMatureSelon vous
Meilleur pourVitesse BPF avec règles familièresCompatibilité héritéeNetfilter moderneDatapaths personnalisés

Inspecter son coût d’exécution avec bpftop ; comparer avec iptables pour le chemin classique.

Ressources