Iptables est l’utilitaire bien connu sous Linux pour gérer le pare-feu Netfilter. Il est très puissant, et possède des extensions pour augmenter ses possibilités. Dans le cadre de cet article le module xt_geoip va nous permettre de bannir des pays entiers sur un serveur Debian 9, à l’aide de la base de données GeoIP simplifiée.

Pourquoi bloquer un pays entier ?

Si vous analysez les logs de vos serveurs connectés en direct à internet, vous vous rendrez probablement compte que ceux-ci sont la cibles d’attaques diverses. En particulier, la Chine, la Russie et l’Ukraine sont des pays connus pour émettre du spam et commettre des tentatives d’intrusion dans les systèmes informatiques. Certains projets comme Kaspersky Cyberthreat real-time map ou Digital Attack Map tentent de cartographier ces attaques. Pour ma part je me fie en particulier à mes logs, et éventuellement à l’alphabet Cyrillique employé pour me spammer par email et formulaires !

Tous les administrateurs système ne peuvent pas se permettre de bloquer un pays entier, notamment si ceux-ci hébergent des services qui peuvent légitimement être accédés depuis ces pays là.

Installation des paquets sous Debian

Sous Debian les paquets sont déjà préparés pour ajouter les modules au noyau sans recompilation complète. Il faut donc installer les paquets suivants : xtables-addons-dkms xtables-addons-common libgeoip1 libtext-csv-xs-perl unzip . Le paquet geoip-database ne semble pas nécessaire car les fichiers CSV GeoIP seront téléchargés par un script du paquet xtables.

DKMS est un système permettant d’ajouter des modules au noyau dont les sources ne résident pas dans le noyau.

L’obtention des fichiers de données se fait ainsi. On convertit ensuite les données dans un format binaire facile à manipuler par le noyau dans /usr/lib/xt_geoip. Ici aucun script externe n’est requis, tout le nécessaire se trouve dans les paquets installés qui vont télécharger les données puis les convertir.

Il est normal d’obtenir un répertoire LE et BE dans /usr/share/xt_geoip, chacun contenant environ 500 fichiers .iv4 et .iv6.

On peut ensuite charger le module et s’assurer qu’il est utilisable par iptables.

La commande suivante permet de vérifier que le module dkms est correctement pris en compte par le noyau.

Règles iptables par pays

Règle basique de blocage

La syntaxe iptables pour utiliser le module geoip est expliquée avec la commande d’aide ci-dessus.

Voici un exemple simple où on bloque les connexions entrantes en provenance de pays bloqués. On peut spécifier plusieurs pays par commande, au maximum une dizaine.

La liste des codes ISO 3166-2 des pays sur deux lettres est visible sur Wikipedia.

On peut vérifier que la règle est bien dans la stack iptables comme ceci.

Pour moi cette règle doit intervenir assez tôt dans la stack iptables afin de ne pas être désactivée par une autorisation visant un port d’entrée, ou un protocole comme icmp par exemple.

Règle de logging

Voici une application plus poussée du pare-feu iptables pour inscrire dans un fichier de log toutes les connexions qui correspondent à un motif. Ici dans un but de démonstration, on cible les connexions qui ne sont pas avec des adresses françaises.

Ici le log-level vaut 4 (niveau warning) et on configure le fichier qui reçoit les warning dans /etc/rsyslog.conf  avec une ligne kern.warning /chemin/vers/log .

Vérification du fonctionnement

Pour vérifier le fonctionnement d’une règle, je vous conseille de bloquer des pays et de vérifier l’accessibilité du serveur web avec un service comme locabrowser.com ou équivalent pour d’autres protocoles. Alternativement vous pouvez vous contenter de pings vers une adresse IP dans le pays visé.

Conclusion

Les règles iptables par pays ont un coté radical qui est assumé et ne pose pas de problème de neutralité du réseau tant que justement cela n’est pas appliqué sur un réseau public, mais bien sur un serveur privé. Un des avantages est que l’on peut cibler des hôtes avec lesquelles le serveur ne doit pas communiquer en fonctionnement normal, sans surcharger le pare-feu avec des milliers de règles IP par IP. De plus iptables se trouve assez bas dans la pile réseau, et peut donc apporter la fonctionnalité GeoIP à un service qui n’en serait pas doté comme par exemple un serveur FTP, SSH, NTP etc.

Je n’ai pas testé l’efficience de ces règles iptables sur le serveur, ni vérifier que le noyau ne s’en trouvait pas ralenti pour traiter les paquets. Sur un routeur chargé, je ne m’aventurerai pas à implémenter de telles règles sans vérifier que les performances suivent.

Pour finir, la base de données GeoIP n’est pas exhaustive, et donc il est évident que toutes les blocs IP d’un pays ne seront pas pris en compte. On ne peut donc pas se fier à 100% à ce type de règle.