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 :

  • blocklist4 pour IPv4 ;
  • blocklist6 pour 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 :

  1. récupère/revalide IPv4 et IPv6 ;
  2. valide chaque ligne ;
  3. produit un fichier batch nftables temporaire ;
  4. exécute nft -c -f ;
  5. applique ensuite nft -f ;
  6. 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 :

  1. vérifier que les adresses d'administration nécessaires sont couvertes par Never Block/allowlist dans l'application ;
  2. publier une nouvelle version ;
  3. récupérer manuellement les fichiers ;
  4. vérifier qu'aucune adresse critique n'y figure ;
  5. conserver une console hors bande ;
  6. 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 :

Fichiers prêts à adapter