La tâche de bloquer le trafic de certains pays semble simple, mais la première impression est trompeuse. Aujourd'hui, nous allons vous dire comment cela peut être mis en œuvre.
Contexte
Les résultats de recherche Google sur ce sujet sont bouleversants: la plupart des solutions sont depuis longtemps "pourries" et il semble parfois que ce sujet ait été mis de côté et oublié à jamais. Nous avons parcouru beaucoup d'anciens enregistrements et sommes prêts à partager la version moderne des instructions.
Nous vous recommandons de lire l'intégralité de l'article avant d'exécuter les commandes indiquées.
Préparation du système d'exploitation
Le filtrage sera configuré à l'aide de l'utilitaire iptables , qui nécessite une extension pour fonctionner avec les données GeoIP. Une telle extension peut être trouvée dans xtables-addons . xtables-addons installe les extensions iptables en tant que modules de noyau autonomes, il n'est donc pas nécessaire de recompiler le noyau du système d'exploitation.
Au moment d'écrire ces lignes, la version actuelle de xtables-addons est la 3.9. Cependant, seuls 3.8 peuvent être trouvés dans les référentiels Ubuntu 20.04 LTS standard et 3.0 dans les référentiels Ubuntu 18.04. Vous pouvez installer l'extension à partir du gestionnaire de packages avec la commande suivante:
apt install xtables-addons-common libtext-csv-xs-perl
Notez qu'il existe de petites mais importantes différences entre la version 3.9 et l'état actuel du projet, dont nous parlerons plus tard. Pour construire à partir des codes sources, installez tous les packages 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 référentiel:
git clone https://git.code.sf.net/p/xtables-addons/xtables-addons xtables-addons-xtables-addons
cd xtables-addons-xtables-addons
xtables-addons contient de nombreuses extensions, mais nous ne sommes intéressés que par xt_geoip . Si vous ne souhaitez pas faire glisser les extensions inutiles dans le système, vous pouvez les exclure de l'assemblage. Pour ce faire, vous devez éditer le fichier mconfig . Pour tous les modules souhaités, mettez y , et tous les modules inutiles, définissez n . Nous collectons:
./autogen.sh
./configure
make
Et installez avec les droits de superutilisateur:
make install
Lors de l'installation des modules du noyau, une erreur peut apparaître avec le contenu suivant:
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'impossibilité de signer les modules du noyau, car rien à signer. Vous pouvez résoudre ce problème avec quelques commandes:
cd /lib/modules/(uname -r)/build/certs
cat <<EOF > 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 noyau compilé est installé, mais le système ne le détecte pas. Demandons au système de créer une carte de dépendances basée sur le nouveau module, puis chargez-la:
depmod -a
modprobe xt_geoip
Assurez-vous 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
De plus, assurez-vous que l'extension est chargée dans iptables:
# cat /proc/net/ip_tables_matches
geoip
icmp
Tout nous convient et il ne reste plus qu'à ajouter le nom du module dans / etc / modules pour que le module fonctionne après le redémarrage de l'OS. À ce stade, iptables comprend les commandes de géolocalisation, mais ne dispose pas des données avec lesquelles travailler. Commençons par charger la base de données geoip.
Obtenir la base de données GeoIP
Créez un répertoire qui stockera les informations pour l'extension iptables:
mkdir /usr/share/xt_geoip
Au début de cet article, nous avons mentionné qu'il existe des différences entre la version source et la version du gestionnaire de packages. La différence la plus notable est le changement de fournisseur de base de données et le script xt_geoip_dl , qui télécharge les données réelles.
Version du gestionnaire de packages
Le script se trouve le long du chemin / usr / lib / xtables-addons, mais lorsque vous essayez de démarrer, vous pouvez voir une erreur pas très 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, la base de données utilisait le produit GeoLite, maintenant connu sous le nom de GeoLite Legacy, distribué sous la licence Creative Commons ASA 4.0 par MaxMind . Avec ce produit, deux événements se sont produits en même temps, ce qui a "cassé" la compatibilité avec l'extension pour iptables.
Tout d'abord, en janvier 2018, ils ont annoncé la fin du support du produit, et le 2 janvier 2019, tous les liens pour télécharger l'ancienne version de la base de données ont été supprimés du site officiel. Les nouveaux utilisateurs sont invités à utiliser le produit GeoLite2 ou sa version payante GeoIP2.
Deuxièmement, depuis décembre 2019, MaxMind a annoncésur un changement significatif dans l'accès à leurs bases de données. Afin de se conformer à la loi californienne sur la protection des consommateurs, MaxMind a décidé de «dissimuler» la distribution de GeoLite2 par l'enregistrement.
Puisque nous voulons utiliser leur produit, nous nous enregistrerons sur cette page.
Après cela, un message sera envoyé à la messagerie avec une demande de définition d'un mot de passe. Maintenant que nous avons créé un compte, nous devons créer une clé de licence. Dans votre compte personnel, recherchez l'élément Mes clés de licence , puis cliquez sur le bouton Générer une nouvelle clé de licence .
Lors de la création d'une clé, une seule question nous sera posée: allons-nous utiliser cette clé dans le programme de mise à jour GeoIP? Nous répondons par la négative et cliquons sur le bouton Confirmer . La clé sera affichée dans la fenêtre contextuelle. Enregistrez cette clé dans un endroit sûr, car après avoir fermé la fenêtre contextuelle, vous ne pourrez plus voir la clé complète.
Nous avons la possibilité de télécharger manuellement les bases de données GeoLite2, 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 que les scripts fonctionnent, installez 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 référentiel avec des scripts et écrivons la clé de licence précédemment obtenue dans le fichier:
git clone https://github.com/mschmitt/GeoLite2xtables.git
cd GeoLite2xtables
echo YOUR_LICENSE_KEY=\’123ertyui123\' > geolite2.license
Nous lançons 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, avec un grand nombre de serveurs, propose de mettre en cache la mise à jour sur un serveur proxy.Notez que le fichier de sortie doit être nommé dbip-country-lite.csv . Malheureusement, 20_convert_geolite2 ne produit pas un fichier parfait. Le script xt_geoip_build attend trois colonnes:
- le début de la plage d'adresses;
- fin de la plage d'adresses;
- code pays en iso-3166-alpha2.
Et le fichier de sortie contient six colonnes:
- début de la plage d'adresses (représentation sous forme de chaîne);
- fin de la plage d'adresses (représentation sous forme de chaîne);
- début de la plage d'adresses (numérique);
- fin de la plage d'adresses (numérique);
- code du pays;
- le nom du pays.
Cet écart est critique et peut être corrigé de deux manières:
- modifier 20_convert_geolite2 ;
- éditez xt_geoip_build .
Dans le premier cas, nous abrégons printf au format requis, et dans le second, nous changeons l'affectation de la variable $ cc en $ row -> [4] . Après cela, vous pouvez créer:
/usr/lib/xtables-addons/xt_geoip_build -S /usr/share/xt_geoip/ -D /usr/share/xt_geoip
. . .
2239 IPv4 ranges for ZA
348 IPv6 ranges for ZA
56 IPv4 ranges for ZM
12 IPv6 ranges for ZM
56 IPv4 ranges for ZW
15 IPv6 ranges for ZW
Notez que l'auteur de GeoLite2xtables ne considère pas ses scripts comme prêts pour la production et suggère de suivre le développement des scripts xt_geoip_ * originaux. Par conséquent, passons à la construction à partir des sources, dans laquelle ces scripts ont déjà été mis à jour.
Version source
Lors de l'installation à partir des sources, les scripts xt_geoip_ * se trouvent dans le répertoire / usr / local / libexec / xtables-addons . Cette version du script utilise la base de données IP to Country Lite . Licence - Licence d'attribution Creative Commons, et d'après les données disponibles, ce sont les trois colonnes les plus nécessaires. Téléchargez et récupérez la base de données:
cd /usr/share/xt_geoip/
/usr/local/libexec/xtables-addons/xt_geoip_dl
/usr/local/libexec/xtables-addons/xt_geoip_build
Après ces étapes, iptables est prêt à fonctionner.
Utilisation de geoip dans iptables
Le module xt_geoip n'ajoute que deux clés:
geoip match options:
[!] --src-cc, --source-country country[,country...]
Match packet coming from (one of) the specified country(ies)
[!] --dst-cc, --destination-country country[,country...]
Match packet going to (one of) the specified country(ies)
NOTE: The country is inputed by its ISO3166 code.
La manière dont les règles iptables sont formées reste largement inchangée. Pour utiliser des commutateurs provenant de modules supplémentaires, vous devez spécifier explicitement le nom du module avec le commutateur -m. Par exemple, une règle pour bloquer les connexions TCP entrantes sur le port 443 à partir de non-US sur toutes les interfaces:
iptables -I INPUT ! -i lo -p tcp --dport 443 -m geoip ! --src-cc US -j DROP
Les fichiers générés par xt_geoip_build ne sont utilisés que lors de la création de règles, mais ne sont pas pris en compte pour le filtrage. Ainsi, pour mettre à jour correctement la base de données geoip, vous devez d'abord mettre à jour les fichiers iv *, puis recréer toutes les règles qui utilisent geoip dans iptables.
Conclusion
Filtrer les paquets par pays est une stratégie quelque peu oubliée. Malgré cela, des outils logiciels pour un tel filtrage se développent 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 grandement la vie des administrateurs système.