Pour de grandes listes contenant des CIDR IPv4 et IPv6, nftables est le backend Linux recommandé dans ce dossier.
L'idée est de créer deux sets permanents et seulement deux règles de filtrage :
blocklist4pour IPv4 ;blocklist6pour IPv6.
Le service de synchronisation remplace le contenu des sets, pas la structure du pare-feu.
1. Pourquoi utiliser des sets
À éviter :
# Mauvaise approche pour une grosse liste
nft add rule inet filter input ip saddr 203.0.113.1 drop
nft add rule inet filter input ip saddr 203.0.113.2 drop
# ... des milliers de règles
Préférer :
set blocklist4 {
type ipv4_addr
flags interval
auto-merge
}
Puis une seule règle :
ip saddr @blocklist4 drop
Le flag interval permet de stocker des préfixes/plages, et auto-merge aide à gérer des éléments chevauchants ou adjacents dans un set d'intervalles.
2. Installation initiale
Le fichier fourni nftables/blocklist.nft contient :
table inet blocklist {
set blocklist4 {
type ipv4_addr
flags interval
auto-merge
}
set blocklist6 {
type ipv6_addr
flags interval
auto-merge
}
chain input {
type filter hook input priority -10; policy accept;
ip saddr @blocklist4 drop
ip6 saddr @blocklist6 drop
}
}
Tester sans appliquer :
nft -c -f nftables/blocklist.nft
Appliquer :
nft -f nftables/blocklist.nft
Vérifier :
nft list table inet blocklist
3. Rendre la structure persistante
Selon la distribution, inclure ce fichier dans /etc/nftables.conf :
include "/etc/nftables.d/blocklist.nft"
Puis :
install -d /etc/nftables.d
install -m 0644 nftables/blocklist.nft /etc/nftables.d/blocklist.nft
nft -c -f /etc/nftables.conf
systemctl reload nftables
Attention au doublon : ne chargez pas deux fois la même table inet blocklist.
4. Configurer le synchroniseur
/etc/blocklist-sync/config.json :
{
"base_url": "https://blocklist.example.net",
"slug": "all",
"backend": "nftables",
"state_dir": "/var/lib/blocklist-sync",
"timeout_seconds": 20,
"nft_family": "inet",
"nft_table": "blocklist",
"nft_set_v4": "blocklist4",
"nft_set_v6": "blocklist6"
}
Le script :
- récupère/revalide IPv4 et IPv6 ;
- valide chaque ligne ;
- produit un fichier batch nftables temporaire ;
- exécute
nft -c -f; - applique ensuite
nft -f; - ne modifie pas le pare-feu si le téléchargement ou la validation échoue.
5. Contenu de la mise à jour
Le batch ressemble à :
flush set inet blocklist blocklist4
flush set inet blocklist blocklist6
add element inet blocklist blocklist4 { 192.0.2.0/24, 198.51.100.42/32 }
add element inet blocklist blocklist6 { 2001:db8:1234::/48 }
Il est envoyé comme un batch nftables après validation syntaxique complète.
6. INPUT, FORWARD ou les deux ?
Le fichier fourni protège les connexions destinées au serveur lui-même via le hook input.
Pour un routeur, hyperviseur ou firewall qui transfère du trafic, ajouter éventuellement :
chain forward {
type filter hook forward priority -10; policy accept;
ip saddr @blocklist4 drop
ip6 saddr @blocklist6 drop
}
N'ajoutez pas output par défaut : bloquer les destinations sortantes répond à un autre besoin et peut casser des services.
7. Profil spécifique par machine
Exemples :
- bastion SSH :
slug = ssh; - reverse proxy :
slug = web; - serveur mail :
slug = mail; - RDP gateway :
slug = rdp; - firewall global :
slug = all.
Cette sélection est une décision d'exploitation côté client. Le profil réellement servi dépend de ce qui a été généré et publié dans l'application.
8. Tester sans se verrouiller dehors
Avant la première application :
- vérifier que les adresses d'administration nécessaires sont couvertes par Never Block/allowlist dans l'application ;
- publier une nouvelle version ;
- récupérer manuellement les fichiers ;
- vérifier qu'aucune adresse critique n'y figure ;
- conserver une console hors bande ;
- seulement ensuite activer le timer.
Test ponctuel :
curl -fsS https://blocklist.example.net/blocklists/all/ipv4.txt | head
/usr/local/sbin/blocklist-sync.py --config /etc/blocklist-sync/config.json --verbose
nft list set inet blocklist blocklist4
nft list set inet blocklist blocklist6
9. Suppression / rollback
Pour désactiver uniquement l'application de la liste tout en gardant la structure :
nft flush set inet blocklist blocklist4
nft flush set inet blocklist blocklist6
Pour supprimer toute l'intégration :
nft delete table inet blocklist
N'utilisez ces commandes qu'en connaissance de cause : le comportement normal du synchroniseur est de conserver la dernière version valide plutôt que de vider automatiquement les sets lors d'une panne amont.
10. Référence externe
La documentation nftables décrit les sets, le flag interval et auto-merge :