Phase 1 : Installation - Prérequis (Debian 13 + sudo)

🔥 Blocage IP massif avec ipset + UFW (ipsum blacklist) 📦 Installation

sudo apt update && sudo apt install ipset ufw -y

📥 Création utilisateur isolé ipsum + groupe + répertoire permanent

# Créer l'utilisateur et le groupe
sudo adduser --system --no-create-home --shell /usr/sbin/nologin --group ipsum

# Permissions pour /var/lib/ipsum/
sudo mkdir -p /var/lib/ipsum
sudo chown ipsum:ipsum /var/lib/ipsum
sudo chmod 750 /var/lib/ipsum

# Permissions pour le script
sudo touch /usr/local/bin/update_ipsum.sh
sudo chown ipsum:ipsum /usr/local/bin/update_ipsum.sh
sudo chmod 750 /usr/local/bin/update_ipsum.sh

🧩 Permission à l’utilisateur ipsum d’utiliser /usr/sbin/ipset sans être root, en lui donnant uniquement les droits nécessaires pour gérer les règles réseau

sudo setcap cap_net_admin+ep /usr/sbin/ipset

🧩 Permissions limitées pour ipsum : UFW + ipset + iptables

sudo nano /etc/sudoers.d/ipsum
ipsum ALL=(root) NOPASSWD: /usr/sbin/ipset restore -!
ipsum ALL=(root) NOPASSWD: /usr/sbin/ipset destroy ipsum_block
ipsum ALL=(root) NOPASSWD: /usr/sbin/ufw disable
ipsum ALL=(root) NOPASSWD: /usr/sbin/ufw enable
ipsum ALL=(root) NOPASSWD: /usr/sbin/iptables -t raw -F PREROUTING
sudo chmod 440 /etc/sudoers.d/ipsum
sudo visudo -c

fabien@rproxy:~$ sudo visudo -c /etc/sudoers : analyse réussie /etc/sudoers.d/90-cloud-init-users : analyse réussie /etc/sudoers.d/README : analyse réussie /etc/sudoers.d/ipsum : analyse réussie

📥 Installation du script

sudo nano /usr/local/bin/update_ipsum.sh
#!/bin/bash

# Supprimer l'ancien ensemble ipset
sudo /usr/sbin/ipset destroy ipsum_block 2>/dev/null || true

# Mettre à jour ipsum.txt
curl -s --max-time 10 -o /var/lib/ipsum/ipsum.txt.tmp https://raw.githubusercontent.com/stamparm/ipsum/master/ipsum.txt
if [ -s /var/lib/ipsum/ipsum.txt.tmp ]; then
  mv /var/lib/ipsum/ipsum.txt.tmp /var/lib/ipsum/ipsum.txt
else
  rm -f /var/lib/ipsum/ipsum.txt.tmp
fi

# Recharger ipset
grep -v '^#' /var/lib/ipsum/ipsum.txt | awk 'BEGIN {print "create ipsum_block hash:net family inet hashsize 65536 maxelem 655360"} {print "add ipsum_block " $1}' | sudo /usr/sbin/ipset restore -!

# Nettoyer TOUTES les règles PREROUTING (raw) avant de recharger UFW
sudo iptables -t raw -F PREROUTING

# Désactiver et réactiver UFW sans confirmation
yes | sudo ufw disable
yes | sudo ufw enable

🧩 Intégration dans UFW

Éditer le fichier :

sudo nano /etc/ufw/before.rules

Ajouter AVANT *filter :

*raw
:PREROUTING ACCEPT [0:0]
-A PREROUTING -m set --match-set ipsum_block src -j DROP
COMMIT

Phase 2 : Test de validation unitaire

🔄 Exécution du script

sudo bash /usr/local/bin/update_ipsum.sh

🔄 Redémarrage UFW

sudo ufw disable
sudo ufw enable

🔍 Vérification du contenu et charement des IPs dans ipset

sudo ipset list ipsum_block | head

fabien@rproxy:~$ sudo ipset list ipsum_block | head Name: ipsum_block Type: hash:net Revision: 7 Header: family inet hashsize 65536 maxelem 655360 bucketsize 12 initval 0xcbe0c420 Size in memory: 3784128 References: 5 Number of entries: 125506 Members: 162.216.149.43 34.81.149.99

🧪 Vérification firewall

sudo iptables -t raw -L PREROUTING -n --line-numbers

fabien@rproxy:~$ sudo iptables -t raw -L PREROUTING -n –line-numbers Chain PREROUTING (policy ACCEPT) num target prot opt source destination
1 DROP all – 0.0.0.0/0 0.0.0.0/0 match-set ipsum_block src

📊 Vérification ipset / kernel binding

sudo ipset list ipsum_block | grep References

fabien@rproxy:~$ sudo ipset list ipsum_block | grep References References: 1

📈 Vérifier trafic bloqué

sudo iptables -t raw -L PREROUTING -v -n

fabien@rproxy:~$ sudo iptables -t raw -L PREROUTING -v -n Chain PREROUTING (policy ACCEPT 10819 packets, 3713K bytes) pkts bytes target prot opt in out source destination
10 500 DROP all – * * 0.0.0.0/0 0.0.0.0/0 match-set ipsum_block src

🧪 Test d’une IP

sudo ipset test ipsum_block 47.254.214.237

fabien@rproxy:~$ sudo ipset test ipsum_block 47.254.214.237 Warning: 47.254.214.237 is in set ipsum_block.


Phase 3 : Mise en production

🔍 Vérification des permissions du script pour l’utilisateur isolé ipsum

sudo chmod +x /usr/local/bin/update_ipsum.sh
sudo chown ipsum:ipsum /usr/local/bin/update_ipsum.sh
ls -l /usr/local/bin/update_ipsum.sh

fabien@rproxy:~$ ls -l /usr/local/bin/update_ipsum.sh
-rwxr-xr-x 1 ipsum ipsum *** 16 mai 12:35 /usr/local/bin/update_ipsum.sh

sudo nano /etc/systemd/system/ipsum-block.service
[Unit]
Description=Load ipsum blacklist into ipset before UFW
Before=ufw.service
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/bin/update_ipsum.sh
User=ipsum
Group=ipsum

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now ipsum-block
sudo systemctl status ipsum-block

● ipsum-block.service - Load ipsum blacklist into ipset before UFW
Loaded: loaded (/etc/systemd/system/ipsum-block.service; enabled; preset: enabled)
Active: active (exited) since Sat 2026-05-16 11:37:40 UTC; 1h 16min ago
Invocation: ************************
Main PID: *** (code=exited, status=0/SUCCESS)
Mem peak: 6M
CPU: 643ms

mai 16 11:37:39 rproxy systemd[1]: Starting ipsum-block.service - Load ipsum blacklist into ipset before UFW… mai 16 11:37:39 rproxy sudo[****]: ipsum : PWD=/ ; USER=root ; COMMAND=/usr/sbin/ipset restore -!
mai 16 11:37:39 rproxy sudo[****]: pam_unix(sudo:session): session opened for user root(uid=0) by (uid=***)
mai 16 11:37:40 rproxy sudo[****]: pam_unix(sudo:session): session closed for user root
mai 16 11:37:40 rproxy systemd[1]: Finished ipsum-block.service - Load ipsum blacklist into ipset before UFW.

🔍 Test de validation final

sudo ipset list ipsum_block | head
sudo iptables -t raw -L PREROUTING -n --line-numbers
sudo ipset list ipsum_block | grep References
sudo iptables -t raw -L PREROUTING -v -n
sudo ipset test ipsum_block 47.254.214.237