SxWall (ScalarX Wall) : pilotage universel de blacklist pour serveurs Linux
(IP, CIDR, pays, zones, ASN, fichiers)
SxWall (ScalarX Wall)
SxWall est un script Bash sous licence GPL conçu pour piloter un firewall linux local basé sur ipset + iptables/ip6tables. Il est en cours de déploiement en production sur les serveurs StackX de ScalarX.
SxWall vient remplacer une collection de scripts que j’ai souvent écrits à la volée en fonction des besoins du moment (whoas.sh, asiplist.sh, countryblock.sh, blacklist.sh, unblacklist.sh, brainfw.sh, etc.) par un outil unique, plus robuste et plus performant.
Le principe est volontairement simple : iptables reste minimal (quelques règles stables), et tout le volume (IP/CIDR massifs par pays/ASN, blocs manuels, whitelist) vit dans des sets ipset. Résultat : performances constantes même avec des listes très larges.
Fonctionnalités principales
– Verrouillage anti-concurrence (lockfile + flock) pour éviter les doubles exécutions.
– Journalisation de l’exécution dans /var/log/sxwall/.
– Gestion de sets ipset dédiés (whitelist, master, manual)
– whitelist IPv4/IPv6
– master IPv4/IPv6 (list:set : agrégation de sous-sets)
– manual IPv4/IPv6 (blocs manuels, toujours inclus dans master)
Injection des règles iptables/ip6tables via une chaîne dédiée SXWALL, avec priorité whitelist puis drop master.
Blocage multi-cibles :
– IP ou CIDR (bloc manuel).
– pays (code ISO2, ex: fr).
– région (AF/AS/EU/NA/SA/OC/AN).
– ASN.
– import en masse rapide d’IP/CIDR depuis un fichier.
Mise à jour des sources :
– pays/régions via IPdeny (IPv4 + IPv6 aggregated).
– ASN via whois.radb.net (IRR: route/route6), avec merge IPv4 si iprange est présent.
Vérification et diagnostic :
– check IP : whitelist, manuel, puis recherche des sous-sets qui matchent
– check pays/ASN : présence des sets, rattachement au master, nombre d’entrées, présence du zonefile
– check région : liste des pays actifs
Backups/restore :
– sauvegarde via ipset save
– restauration via ipset restore (support latest)
Architecture technique
iptables/ip6tables :
– match en O(1) sur ipset, pas de règles volumineuses.
ipset :
– master en list:set pour agréger dynamiquement des sous-sets (pays/ASN + manual)
– sous-sets en hash:net (support IP et CIDR)
Mises à jour des sous-sets (pays/ASN) :
– chargement via ipset restore dans un set temporaire
– swap atomique
– destruction du tmp
Auto-correction : si un set existe avec un type incorrect, destruction/recréation après nettoyage runtime (suppression des références iptables).
Utilisation
Les machines StackX chargent un fichier de règles iptables standard (/etc/iptables.rules) au démarrage (ports / services ips autorisées). J’y ai rajouté 2 entrées :
01:45:35-root@brain-prd:~$ grep SXWALL /etc/iptables.rules
:SXWALL - [0:0]
-A INPUT -j SXWALL
Initialisation :
sxwall start
Mise à jour des bases (pays + ASN cachés) :
sxwall update
Mise à jour forcée d’un ASN :
sxwall update asn AS209474
Bloquer :
sxwall block 1.2.3.4
sxwall block 1.2.3.0/24
sxwall block fr
sxwall block EU
sxwall block AS209474
Débloquer :
sxwall unblock 1.2.3.4
sxwall unblock fr
sxwall unblock EU
sxwall unblock AS209474
Importer un lot d’IP/CIDR :
sxwall import /path/to/list.txt
Importation depuis stdin :
xxxxxxx | sxwall import -
Retirer du blocage le lot importé :
sxwall import /path/to/list.txt --clear
Vérifier l’état d’une cible :
sxwall check 1.2.3.4
sxwall check 1.2.3.0/24
sxwall check fr
sxwall check EU
sxwall check AS209474
Lister la configuration active :
sxwall list
Sauvegarder / restaurer :
sxwall save
sxwall restore latest
sxwall restore sxwall.conf-2025-12-31-01-51
Identifier l’ASN d’une IP :
sxwall whoas 1.2.3.4
Note : le script doit être lancé avec les droits root.
Notes de conception
SxWall est pensé pour fonctionner sur StackX et est donc optimisé pour nos besoins et process internes (flotte, équipe de support, exécution manuelle ou automatisée, verrouillage anti-concurrence, et journalisation systématique). Quelques modifications ou aménagements peuvent être nécessaires en fonction de votre usecase.
Le modèle ipset (list:set + hash:net) permet de maintenir des listes massives sans dégrader les performances d’iptables. Le script privilégie une approche opérationnelle et reproductible :
– sources pays simples (IPdeny) pour des blocs géographiques rapides.
– sources ASN basées sur IRR (RADB) pour des blocs « réseau » pragmatiques.
– checks explicites pour comprendre pourquoi une IP est bloquée (manuel vs pays/ASN).
Todo list
– Mise à jour de la whitelist en mode atomique (tmp + swap) pour éviter toute fenêtre où la whitelist est vide.
– Injection iptables atomique (iptables-restore / chain swap) pour éviter une fenêtre de chaîne vide lors du refresh.
– Option –dry-run (simulation des actions ipset/iptables, mais j’hésite encore, ça peut être un peu lourd pour rien).
– Cache/TTL pour les downloads pays/régions (éviter de re-télécharger si inutile).
– Source ASN depuis serveur de cache interne (alimenté via bgpq4/IRRtoolset/routeviews) en conservant fallback sur actuel.
Ressources
Script : sxwall.sh
—
Christophe Casalegno (retrouvez tous mes réseaux sur : all.bo)