Christophe Casalegno

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)