xtables-addons: filtrer les paquets par pays



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:



  1. modifier 20_convert_geolite2 ;
  2. é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.






All Articles