xtables-addons : filtrons les paquets par pays

xtables-addons : filtrons les paquets par pays
La tâche de bloquer le trafic provenant de certains pays semble simple, mais les premières impressions sont trompeuses. Aujourd'hui, nous vous expliquons comment cela peut être réalisé.

Contexte

Les résultats de recherche Google sur ce sujet sont décevants : la plupart des solutions sont obsolètes et il semble parfois que ce sujet ait été mis de côté et oublié pour toujours. Nous avons « fouillé » de nombreux anciens articles et sommes prêts à partager une version moderne du guide.

Nous vous recommandons de lire l'article dans son intégralité avant d'exécuter les commandes indiquées.

Préparation du système d'exploitation

La filtration sera configurée à l'aide de l'utilitaire iptables, qui nécessite une extension pour fonctionner avec des données GeoIP. Cette extension peut être trouvée dans xtables-addons. Les xtables-addons installent des extensions pour iptables sous forme de modules noyau autonomes, ce qui évite de devoir recompiler le noyau de l'OS.

Au moment de la rédaction de cet article, la version actuelle des xtables-addons est 3.9. Cependant, dans les dépôts standards d'Ubuntu 20.04 LTS, on ne trouve que la 3.8, et dans les dépôts d'Ubuntu 18.04, la 3.0. Vous pouvez installer l'extension depuis le gestionnaire de paquets avec la commande suivante :

apt install xtables-addons-common libtext-csv-xs-perl

Notez qu'il existe des différences mineures mais importantes entre la version 3.9 et l'état actuel du projet, que nous aborderons plus tard. Pour compiler à partir des sources, installez tous les paquets nécessaires :

apt install git build-essential autoconf make libtool iptables-dev libxtables-dev pkg-config libnet-cidr-lite-perl libtext-csv-xs-perl

Clonez le dépôt :

git clone https://git.code.sf.net/p/xtables-addons/xtables-addons xtables-addons-xtables-addons

cd xtables-addons-xtables-addons

Les xtables-addons contiennent de nombreuses extensions, mais nous ne nous intéressons qu'à xt_geoip. Si vous ne souhaitez pas inclure les extensions inutiles dans le système, vous pouvez les exclure de la compilation. Pour ce faire, il faut modifier le fichier mconfig. Pour tous les modules souhaités, mettez y, et marquez tous ceux qui ne sont pas nécessaires comme n. Compilation :

./autogen.sh

./configure

make

Et installez avec les droits de superutilisateur :

make install

Lors de l'installation des modules noyau, une erreur de ce type peut survenir :

INSTALL /root/xtables-addons-xtables-addons/extensions/xt_geoip.ko
At main.c:160:
- SSL error:02001002:system library:fopen:No such file or directory: ../crypto/bio/bss_file.c:72
- SSL error:2006D080:BIO routines:BIO_new_file:no such file: ../crypto/bio/bss_file.c:79
sign-file: certs/signing_key.pem: No such file or directory

Cette situation se produit en raison de l'incapacité à signer les modules noyau, car il n'y a rien pour signer. Vous pouvez résoudre ce problème avec quelques commandes :

cd /lib/modules/(uname -r)/build/certs

cat < x509.genkey

[ req ]
default_bits = 4096
distinguished_name = req_distinguished_name
prompt = no
string_mask = utf8only
x509_extensions = myexts

[ req_distinguished_name ]
CN = Modules

[ myexts ]
basicConstraints=critical,CA:FALSE
keyUsage=digitalSignature
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid
EOF

openssl req -new -nodes -utf8 -sha512 -days 36500 -batch -x509 -config x509.genkey -outform DER -out signing_key.x509 -keyout signing_key.pem

Le module du noyau a été compilé et installé, mais le système ne le reconnaît pas. Demandons au système de créer une carte des dépendances en tenant compte du nouveau module, puis chargeons-le :

depmod -a

modprobe xt_geoip

Assurons-nous que xt_geoip est chargé dans le système :

# lsmod | grep xt_geoip
xt_geoip               16384  0
x_tables               40960  2 xt_geoip,ip_tables

Vérifions également que l'extension est chargée dans iptables :

# cat /proc/net/ip_tables_matches 
geoip
icmp

Tout semble en ordre, il ne reste plus qu'à ajouter le nom du module dans /etc/modules, afin que le module fonctionne après le redémarrage du système d'exploitation. À partir de ce moment, iptables comprend les commandes geoip, mais il lui manque des données pour fonctionner. Passons au chargement de la base de données geoip.

Obtention de la base de données GeoIP

Créons un répertoire où sera stockée l'information compréhensible par l'extension iptables :

mkdir /usr/share/xt_geoip

Au début de l'article, nous avons mentionné qu'il existe des différences entre la version du code source et la version du gestionnaire de paquets. La différence la plus notable est le changement de fournisseur de la base de données et du script xt_geoip_dl, qui télécharge les données actuelles.

La version du gestionnaire de paquets

Le script se trouve à l'emplacement /usr/lib/xtables-addons, cependant en essayant de l'exécuter, on peut voir une erreur peu informative :

# ./xt_geoip_dl 
unzip:  cannot find or open GeoLite2-Country-CSV.zip, GeoLite2-Country-CSV.zip.zip or GeoLite2-Country-CSV.zip.ZIP.

Auparavant, comme base de données, le produit GeoLite était utilisé, maintenant connu sous le nom de GeoLite Legacy, distribué sous la licence Creative Commons ASA 4.0 par la société MaxMind. Ce produit a subi deux événements majeurs qui ont "cassé" la compatibilité avec l'extension pour iptables.

Tout d'abord, en janvier 2018 ont annoncé , l'annonce de l'arrêt du support du produit, et au 2 janvier 2019, tous les liens pour télécharger l'ancienne version de la base ont été supprimés du site officiel. Il est recommandé aux nouveaux utilisateurs d'utiliser le produit GeoLite2 ou sa version payante GeoIP2.

Deuxièmement, depuis décembre 2019, MaxMind déclaré a annoncé un changement significatif dans l'accès à leurs bases de données. Pour se conformer à la loi californienne sur la protection des droits des consommateurs, la société MaxMind a décidé de rendre la distribution de GeoLite2 soumise à enregistrement.

Puisque nous voulons utiliser leur produit, nous allons nous inscrire sur cette page.

xtables-addons : filtrons les paquets par pays
Un e-mail sera envoyé pour vous demander de définir votre mot de passe. Maintenant que nous avons créé un compte, il faut générer une clé de licence. Dans le tableau de bord, nous trouvons l'option Mes Clés de Licence, puis nous cliquons sur le bouton Générer une nouvelle clé de licence.

Lors de la création de la clé, on nous posera une seule question : allons-nous utiliser cette clé dans le programme GeoIP Update ? Nous répondons négativement et cliquons sur le bouton Confirmer. Une fenêtre pop-up affichera la clé. Conservez cette clé dans un endroit sûr, car après la fermeture de la fenêtre pop-up, vous ne pourrez plus voir la clé en entier.

xtables-addons : filtrons les paquets par pays
Nous avons la possibilité de télécharger les bases GeoLite2 manuellement, mais leur format n'est pas compatible avec le format attendu par le script xt_geoip_build. C'est là que les scripts GeoLite2xtables entrent en jeu. Pour faire fonctionner les scripts, nous installons le module perl NetAddr::IP :

wget https://cpan.metacpan.org/authors/id/M/MI/MIKER/NetAddr-IP-4.079.tar.gz

tar xvf NetAddr-IP-4.079.tar.gz

cd NetAddr-IP-4.079

perl Makefile.PL

make

make install

Ensuite, nous clonons le dépôt avec les scripts et enregistrons dans un fichier la clé de licence obtenue précédemment :

git clone https://github.com/mschmitt/GeoLite2xtables.git

cd GeoLite2xtables

echo YOUR_LICENSE_KEY=’123ertyui123' > geolite2.license

Nous exécutons les scripts :

# Скачиваем данные GeoLite2
./00_download_geolite2
# Скачиваем информацию о странах (для соответствия коду)
./10_download_countryinfo
# Конвертируем GeoLite2 базу в формат GeoLite Legacy 
cat /tmp/GeoLite2-Country-Blocks-IPv{4,6}.csv |
./20_convert_geolite2 /tmp/CountryInfo.txt > /usr/share/xt_geoip/dbip-country-lite.csv

MaxMind impose une limite de 2000 téléchargements par jour et, en cas de grand nombre de serveurs, recommande de mettre en cache la mise à jour sur un serveur proxy.

Veuillez noter que le fichier de sortie doit obligatoirement s'appeler dbip-country-lite.csv. Malheureusement, 20_convert_geolite2 ne produit pas un fichier parfait. Le script xt_geoip_build attend trois colonnes :

  • début de la plage d'adresses ;
  • fin de la plage d'adresses ;
  • code pays au iso-3166-alpha2.

Le fichier de sortie contient six colonnes :

  • début de la plage d'adresses (représentation textuelle) ;
  • fin de la plage d'adresses (représentation textuelle) ;
  • début de la plage d'adresses (représentation numérique) ;
  • fin de la plage d'adresses (représentation numérique) ;
  • code pays ;
  • nom du pays.

Cette incompatibilité est critique et peut être corrigée de deux manières :

  1. modifier 20_convert_geolite2;
  2. modifier xt_geoip_build.

Dans le premier cas, nous réduisons printf au format requis, et dans le second, nous modifions l'affectation de la variable $cc sur $row->[4]. Après cela, nous pouvons procéder à la compilation :

/usr/lib/xtables-addons/xt_geoip_build -S /usr/share/xt_geoip/ -D /usr/share/xt_geoip

. . .
 2239 plages IPv4 pour ZA
  348 plages IPv6 pour ZA
   56 plages IPv4 pour ZM
   12 plages IPv6 pour ZM
   56 plages IPv4 pour ZW
   15 plages IPv6 pour ZW

Remarquons que l'auteur GeoLite2xtables ne considère pas ses scripts comme prêts pour la production et les propose à surveiller pour le développement de scripts originaux xt_geoip_*. Passons donc à l'assemblage à partir des codes sources, où ces scripts sont déjà mis à jour.

Version à partir des codes sources

Lors de l'installation à partir des codes sources, les scripts xt_geoip_* sont placés dans le répertoire /usr/local/libexec/xtables-addons. Dans cette version du script, une base de données est utilisée IP to Country Lite. La licence est la Creative Commons Attribution License, et les trois colonnes nécessaires sont disponibles parmi les données. Téléchargeons et assemblons la base :

cd /usr/share/xt_geoip/

/usr/local/libexec/xtables-addons/xt_geoip_dl

/usr/local/libexec/xtables-addons/xt_geoip_build

Après ces actions, iptables est prêt à fonctionner.

Utiliser geoip dans iptables

Module xt_geoip ajoute seulement deux clés :

options de correspondance geoip :
[!] --src-cc, --source-country country[,country...]
	Correspond au paquet venant de (l'un des) pays spécifiés
[!] --dst-cc, --destination-country country[,country...]
	Correspond au paquet allant vers (l'un des) pays spécifiés

REMARQUE : Le pays est entré par son code ISO3166.

Les méthodes de formation des règles pour iptables restent généralement inchangées. Pour utiliser les clés des modules supplémentaires, il est nécessaire d'indiquer explicitement le nom du module avec la clé -m. Par exemple, une règle pour bloquer les connexions TCP entrantes sur le port 443 en dehors des États-Unis sur toutes les interfaces :

iptables -I INPUT ! -i lo -p tcp --dport 443 -m geoip ! --src-cc US -j DROP

Les fichiers créés par xt_geoip_build ne sont utilisés que lors de la création des règles, mais ne sont pas pris en compte lors du filtrage. Ainsi, pour mettre à jour correctement la base geoip, il est nécessaire de mettre d'abord à jour les fichiers iv*, puis de recréer toutes les règles qui utilisent geoip dans iptables.

Conclusion

Le filtrage des paquets en fonction de l'appartenance à des pays est une stratégie quelque peu oubliée. Malgré cela, les outils logiciels pour ce type de filtrage évoluent et, peut-être bientôt, une nouvelle version de xt_geoip avec un nouveau fournisseur de données geoip apparaîtra dans les gestionnaires de paquets, ce qui simplifiera considérablement la vie des administrateurs système.

xtables-addons : filtrons les paquets par pays

Seuls les utilisateurs enregistrés peuvent participer au sondage. Connectez-vous, s'il vous plaît.

Avez-vous déjà utilisé le filtrage par pays ?

  • 59,1%Oui13

  • 40,9%Non9

22 utilisateurs ont voté. 3 utilisateurs se sont abstenus.

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster