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éthode | Comment |
|---|
| Depuis la source | git clone https://github.com/facebook/bpfilter && make && sudo make install |
| Paquet de distribution | Disponible dans certaines distributions plus récentes |
| Démarrer daemon | sudo bpfilter (ou via systemd) |
| Vérifier | bpfilter --version |
Architecture
| Pièce | Rôle |
|---|
Daemon bpfilter | Reçoit les règles, génère et charge le BPF |
bfcli | CLI natif pour exprimer les règles |
| Frontend iptables/nftables | Traduire les règles existantes en bpfilter |
| Programmes BPF | Le filtre compilé attaché à un crochet |
Crochets d’attachement
| Crochet | Où les paquets sont traités |
|---|
| XDP | Le plus tôt — dans le driver, avant la pile (le plus rapide) |
| TC (contrôle du trafic) | Après l’analyse basique, ingress/egress |
| cgroup | Filtrage de socket par cgroup |
| Netfilter | Placement 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
'
| Commande | Description |
|---|
bfcli ruleset set --from-file F | Charger les règles à partir d’un fichier |
bfcli ruleset get | Afficher l’ensemble de règles actif |
bfcli ruleset flush | Supprimer toutes les règles |
bfcli chain set | Gérer une chaîne unique |
Matchers
| Matcher | Correspond |
|---|
ip4.saddr / ip4.daddr | IPv4 source/destination (CIDR supporté) |
ip6.saddr / ip6.daddr | Adresses IPv6 |
ip4.proto | Protocole (tcp, udp, icmp) |
tcp.dport / tcp.sport | Ports TCP |
udp.dport / udp.sport | Ports UDP |
tcp.flags | Combinaisons de flags TCP |
meta.ifindex | Interface |
Verdicts
| Verdict | Effet |
|---|
ACCEPT | Autoriser le paquet |
DROP | Rejeter silencieusement |
CONTINUE | Tomber à 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érification | Commande |
|---|
| Ensemble de règles actif | sudo bfcli ruleset get |
| Programmes BPF chargés | sudo bpftool prog list |
| XDP attaché | ip link show <iface> |
| Compteurs | Compteurs de règles dans bfcli ruleset get |
| Surcharge | sudo bpftop pour voir le coût du programme |
bpfilter vs alternatives
| Aspect | bpfilter | iptables | nftables | eBPF/XDP brut |
|---|
| Performance | Élevée (BPF/XDP) | Inférieure (séquentielle) | Meilleure qu’iptables | La plus élevée |
| Syntaxe | Familière ou bfcli | Familière | Moderne, unifiée | Écrire le code BPF |
| Maturité | Plus récent | Très mature | Mature | Selon vous |
| Meilleur pour | Vitesse BPF avec règles familières | Compatibilité héritée | Netfilter moderne | Datapaths personnalisés |
Inspecter son coût d’exécution avec bpftop ; comparer avec iptables pour le chemin classique.
Ressources