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 remplace une collection de scripts que j’ai souvent écrits à la volée selon les 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, blacklists) vit dans des sets ipset. Résultat : performances constantes même avec des listes très larges.
Fonctionnalités principales
– Verrouillage anti-concurrence renforcé (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 IPv4/IPv6 (ALLOW)
– master IPv4/IPv6 (list:set : agrégation de sous-sets)
– manual IPv4/IPv6 (blocs manuels, toujours inclus dans master)
predef blacklist IPv4/IPv6 (blacklists prédéfinies, toujours incluses 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 ou stdin.
Blacklists/whitelists externes :
– Chargement automatique d’une whitelist additionnelle via un répertoire configurable (/etc/sxwall/whitelist.d par défaut).
– Chargement automatique de blacklists prédéfinies via un répertoire configurable (/etc/sxwall/blacklist.d par défaut).
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.
– Mise à jour forcée d’un ASN supportée.
Vérification et diagnostic :
– check IP : whitelist, manuel, predef blacklist, 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)
Sémantique cohérente : après un restore, SxWall réapplique la whitelist/blacklist locale puis réinjecte les règles.
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 + predef)
– 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/récré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 autorisés). 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
Recharger la whitelist/blacklist locale et réinjecter les règles (sans restore) :
sxwall reload
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é (clear puis 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).
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 (whitelist vs manual vs predef vs pays/ASN).
– répertoires conf.d pour rendre le firewall opérable (ajouter une règle = déposer un fichier, puis reload).
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.
– 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.
– Cosmétique un peu plus « sexy ».
Ressources
Script : sxwall.sh
—
Christophe Casalegno (retrouvez tous mes réseaux sur : all.bo)