
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 . 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-perlNotez 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-perlClonez le dépôt :
git clone https://git.code.sf.net/p/xtables-addons/xtables-addons xtables-addons-xtables-addons
cd xtables-addons-xtables-addonsLes 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./configuremakeEt installez avec les droits de superutilisateur :
make installLors 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 directoryCette 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/certscat < 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
EOFopenssl req -new -nodes -utf8 -sha512 -days 36500 -batch -x509 -config x509.genkey -outform DER -out signing_key.x509 -keyout signing_key.pemLe 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 -amodprobe xt_geoipAssurons-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_tablesVérifions également que l'extension est chargée dans iptables :
# cat /proc/net/ip_tables_matches
geoip
icmpTout 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_geoipAu 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 par la société . Ce produit a subi deux événements majeurs qui ont "cassé" la compatibilité avec l'extension pour iptables.
Tout d'abord, en janvier 2018 , 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 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.

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.

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.gztar xvf NetAddr-IP-4.079.tar.gzcd NetAddr-IP-4.079perl Makefile.PLmakemake installEnsuite, 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.gitcd GeoLite2xtablesecho YOUR_LICENSE_KEY=’123ertyui123' > geolite2.licenseNous 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.csvMaxMind 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 :
- modifier 20_convert_geolite2;
- modifier xt_geoip_build.
Dans le premier cas, nous réduisons 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 ZWRemarquons que l'auteur ne considère pas ses scripts comme prêts pour la production et les propose 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 . 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_buildAprè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 DROPLes 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.
Seuls les utilisateurs enregistrés peuvent participer au sondage. , 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
