Bloquer le trafic par pays (GeoIP) sur un serveur YunoHost sans casser le pare-feu
Objectif : Bloquer tout trafic entrant provenant de certains pays (ex. : Chine, Russie, Corée du Nord, Inde, etc.) en utilisant
iptables
et les bases GeoIP, tout en conservant la compatibilité avec YunoHost.
✅ 1. Installer les outils nécessaires
sudo apt update
sudo apt install xtables-addons-common libtext-csv-xs-perl unzip
✅ 2. Créer le dossier des données GeoIP
sudo mkdir -p /usr/share/xt_geoip
cd /usr/share/xt_geoip
✅ 3. Télécharger les bases GeoLite2 (CSV) depuis MaxMind
- Crée un compte gratuit sur : https://www.maxmind.com/en/geolite2/signup
- Récupère ta clé de licence.
- Remplace-la dans la commande ci-dessous :
wget "https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country-CSV&license_key=VOTRE_CLÉ_ICI&suffix=zip" -O GeoLite2-Country-CSV.zip
unzip GeoLite2-Country-CSV.zip
cd GeoLite2-Country-CSV_*
✅ 4. Créer un script cron pour générer les fichiers .iv4
à partir des CSV
Crée le fichier suivant :
sudo nano /etc/cron.daily/xt_geoip
Colle ce contenu :
#!/bin/sh -e
workdir=$(mktemp -d)
cd "$workdir"
/usr/libexec/xtables-addons/xt_geoip_dl
/usr/libexec/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip *.csv
cd && rm -rf "$workdir"
Rends-le exécutable :
sudo chmod +x /etc/cron.daily/xt_geoip
Et exécute-le immédiatement pour générer les fichiers :
sudo run-parts /etc/cron.daily
✅ 5. Vérifier que les fichiers GeoIP sont générés
ls /usr/share/xt_geoip/*.iv4
Tu devrais voir des fichiers comme CN.iv4
, RU.iv4
, etc.
✅ 6. Ajouter la règle iptables
pour bloquer les pays
Ajoute la règle suivante :
sudo iptables -A INPUT -m geoip --src-cc CN,RU,KP,IN,PK,BD,PH -j DROP
Cela bloque tout le trafic entrant depuis :
- CN = Chine
- RU = Russie
- KP = Corée du Nord
- IN = Inde
- PK = Pakistan
- BD = Bangladesh
- PH = Philippines
❌ YunoHost empêche l’usage de iptables-persistent
Comme iptables-persistent
est en conflit avec yunohost
, on doit utiliser un service systemd
personnalisé pour restaurer les règles iptables
au démarrage.
✅ 7. Créer le script de restauration des règles
sudo nano /usr/local/sbin/geoip-iptables-restore.sh
Colle :
#!/bin/bash
iptables -C INPUT -m geoip --src-cc CN,RU,KP,IN,PK,BD,PH -j DROP 2>/dev/null || \
iptables -A INPUT -m geoip --src-cc CN,RU,KP,IN,PK,BD,PH -j DROP
Puis rends-le exécutable :
sudo chmod +x /usr/local/sbin/geoip-iptables-restore.sh
✅ 8. Créer le service systemd
pour exécuter ce script au démarrage
sudo nano /etc/systemd/system/geoip-iptables.service
Colle :
[Unit]
Description=Restaurer les règles iptables GeoIP au démarrage
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/geoip-iptables-restore.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
✅ 9. Activer et lancer le service
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl enable geoip-iptables.service
sudo systemctl start geoip-iptables.service
Vérifie qu’il est actif :
sudo systemctl status geoip-iptables.service
✅ 10. Vérifier que les règles sont bien actives
sudo iptables -L -v --line-numbers
Tu dois voir une ligne DROP avec les pays ciblés.
🧼 En résumé
- Blocage GeoIP actif et persistant ✅
- Mise à jour automatique des données via
cron.daily
✅ - Compatible avec YunoHost (pas de
iptables-persistent
) ✅