Quand un script compromis ou une application mal configurée se met à sonder des adresses en 10.x ou 192.168.x, le trafic quitte votre serveur et déclenche souvent des signalements d'abus de la part du réseau. Bloquer les connexions sortantes vers les plages privées est une protection simple sur tout VPS Linux Infrawire. Ce guide montre comment le faire avec UFW sans casser le DNS ni votre propre connectivité.
📋 Prérequis
- Un VPS avec accès root en SSH, sous Ubuntu 24.04 ou Debian 12 (UFW est disponible sur les deux).
- Des notions de base d'UFW. S'il n'est pas encore installé :
Bashsudo apt update && sudo apt install -y ufw
- Une seconde session SSH gardée ouverte pendant que vous modifiez le pare-feu.
🧭 Quelles plages bloquer
| Plage | Usage |
|---|---|
10.0.0.0/8 | Privé RFC1918 |
172.16.0.0/12 | Privé RFC1918 |
192.168.0.0/16 | Privé RFC1918 |
100.64.0.0/10 | NAT de niveau opérateur (RFC6598) |
169.254.0.0/16 | Link-local IPv4 |
192.0.0.0/24 | Attributions de protocoles IETF |
198.18.0.0/15 | Tests de performance |
fc00::/7 | Adresses IPv6 locales uniques |
Ne bloquez pas fe80::/10 : IPv6 utilise les adresses link-local pour la découverte de voisins et souvent pour la passerelle par défaut ; les bloquer coupe entièrement l'IPv6.
🔍 Vérifier d'abord ce dont votre VPS a besoin
Si votre passerelle ou votre résolveur DNS se trouve dans une plage privée, un blocage général coupera votre réseau. Examinez votre configuration avant d'ajouter la moindre règle :
Baship route ip -6 route cat /etc/resolv.conf resolvectl status | grep -E 'DNS Servers|Link'
Si un résolveur ou un service dont vous dépendez a une adresse privée (PRIVATE_DNS_IP), autorisez-le explicitement et placez cette règle en premier, comme indiqué plus bas. Si tout ce que vous utilisez est public, vous pouvez ignorer cette étape.
🧱 Méthode 1 : ufw deny out
Assurez-vous que SSH reste joignable, puis définissez les politiques par défaut. Les réponses entrantes à vos sessions SSH ne sont pas touchées par des règles sortantes sur les plages privées.
Bashsudo ufw allow 22/tcp sudo ufw default deny incoming sudo ufw default allow outgoing
Si vous avez besoin d'une exception, insérez-la en position 1 pour qu'elle soit évaluée avant les interdictions :
Bashsudo ufw insert 1 allow out to PRIVATE_DNS_IP port 53
Ajoutez maintenant les interdictions, une par plage (les règles UFW sont évaluées dans l'ordre, la première qui correspond l'emporte) :
Bashsudo ufw deny out to 10.0.0.0/8 sudo ufw deny out to 172.16.0.0/12 sudo ufw deny out to 192.168.0.0/16 sudo ufw deny out to 100.64.0.0/10 sudo ufw deny out to 169.254.0.0/16 sudo ufw deny out to 192.0.0.0/24 sudo ufw deny out to 198.18.0.0/15 sudo ufw deny out to fc00::/7 sudo ufw enable
ufw enable peut avertir que l'opération risque de couper les connexions SSH ; comme le port 22 est autorisé, répondez y. Contrôlez l'ordre avec :
Bashsudo ufw status numbered
📄 Méthode 2 : before.rules
Si vous préférez un bloc de règles unique appliqué avant les règles utilisateur, modifiez /etc/ufw/before.rules. Faites d'abord une sauvegarde :
Bashsudo cp /etc/ufw/before.rules /etc/ufw/before.rules.bak sudo nano /etc/ufw/before.rules
Dans la section *filter, après les lignes qui acceptent le loopback et les connexions établies, ajoutez :
TEXT1# Block outbound traffic to private networks 2-A ufw-before-output -d 10.0.0.0/8 -j REJECT 3-A ufw-before-output -d 172.16.0.0/12 -j REJECT 4-A ufw-before-output -d 192.168.0.0/16 -j REJECT 5-A ufw-before-output -d 100.64.0.0/10 -j REJECT 6-A ufw-before-output -d 169.254.0.0/16 -j REJECT
IPv6 a son propre fichier, /etc/ufw/before6.rules, avec la chaîne ufw-before-output :
TEXT-A ufw-before-output -d fc00::/7 -j REJECT
Placez une exception pour PRIVATE_DNS_IP juste au-dessus de ces lignes avec -A ufw-before-output -d PRIVATE_DNS_IP -j ACCEPT. Rechargez :
Bashsudo ufw reload
REJECT répond immédiatement par une erreur : les applications échouent vite au lieu d'attendre un délai d'expiration. Utilisez -j DROP si vous préférez le silence.
✅ Vérifier
Les règles doivent être chargées et les destinations bloquées doivent échouer, tandis que les publiques continuent de fonctionner :
Bashsudo ufw status verbose ping -c 1 10.0.0.1 # doit échouer ping -c 1 192.168.1.1 # doit échouer curl -m 5 http://10.0.0.1 # doit échouer ping -c 2 1.1.1.1 # doit réussir dig +short example.com # doit se résoudre curl -I https://www.debian.org
Avec ufw deny out, le ping qui échoue indique en général Operation not permitted. Les compteurs de paquets confirment les correspondances :
Bashsudo iptables -L ufw-user-output -n -v sudo iptables -L ufw-before-output -n -v
🛠️ Dépannage
Le DNS ne fonctionne plus. Votre résolveur est dans une plage privée. Corrigez l'ordre avec sudo ufw status numbered, puis ajoutez sudo ufw insert 1 allow out to PRIVATE_DNS_IP port 53. Vous pouvez aussi passer à un résolveur public dans votre configuration réseau.
L'IPv6 est cassée après la modification. Vous avez sans doute bloqué fe80::/10 ou une passerelle dans fc00::/7. Supprimez la règle avec sudo ufw delete deny out to fc00::/7 et ne recréez que le nécessaire.
Vous n'accédez plus à un service d'un réseau privé (VPN, API interne). Ajoutez une règle d'autorisation pour cette adresse précise avec ufw insert 1 allow out to PRIVATE_IP. Si c'est SSH lui-même qui est bloqué, utilisez n'importe quel accès console au serveur et lancez sudo ufw disable.
🔒 Votre VPS ne peut plus scanner des réseaux privés par accident : les signalements d'abus de ce type devraient cesser.