🔥 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/ipsumipsum 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 PREROUTINGsudo chmod 440 /etc/sudoers.d/ipsumsudo 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.rulesAjouter AVANT *filter :
*raw
:PREROUTING ACCEPT [0:0]
-A PREROUTING -m set --match-set ipsum_block src -j DROP
COMMIT
🔄 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 | headfabien@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-numbersfabien@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 Referencesfabien@rproxy:~$ sudo ipset list ipsum_block | grep References References: 1
📈 Vérifier trafic bloqué
sudo iptables -t raw -L PREROUTING -v -nfabien@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.237fabien@rproxy:~$ sudo ipset test ipsum_block 47.254.214.237 Warning: 47.254.214.237 is in set ipsum_block.
🔍 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.shfabien@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