xtables-addons : filtrer les packages par pays

xtables-addons : filtrer les packages par pays
La tâche consistant à bloquer le trafic en provenance de certains pays semble simple, mais les premières impressions peuvent être trompeuses. Aujourd'hui, nous allons vous expliquer comment cela peut être mis en œuvre.

Préhistoire

Les résultats d’une recherche Google sur ce sujet sont décevants : 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 passé au peigne fin de nombreux anciens enregistrements et sommes prêts à partager une version moderne des instructions.

Nous vous recommandons de lire l'intégralité de l'article avant d'exécuter ces commandes.

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. Cette extension se trouve dans xtables-addons. xtables-addons installe les extensions pour iptables en tant que modules de noyau indépendants, il n'est donc pas nécessaire de recompiler le noyau du système d'exploitation.

Au moment de la rédaction de cet article, la version actuelle de xtables-addons est la 3.9. Cependant, seuls 20.04 peuvent être trouvés dans les référentiels Ubuntu 3.8 LTS standard et 18.04 dans les référentiels Ubuntu 3.0. Vous pouvez installer l'extension depuis le gestionnaire de packages avec la commande suivante :

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

Notez qu'il existe des différences petites mais importantes entre la version 3.9 et l'état actuel du projet, dont nous parlerons plus tard. Pour construire à partir du code source, 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 dépôt :

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 nous intéressons qu'à xt_geoip. Si vous ne souhaitez pas glisser des extensions inutiles dans le système, vous pouvez les exclure de la version. Pour ce faire, vous devez modifier le fichier mconfig. Pour tous les modules souhaités, installez y, et marquez tous ceux qui sont inutiles 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 similaire à la suivante peut se produire :

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 est due à 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 prenant en compte le nouveau module, puis chargeons-la :

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

De plus, assurez-vous que l'extension est chargée dans iptables :

# cat /proc/net/ip_tables_matches 
geoip
icmp

Nous sommes satisfaits de tout et il ne reste plus qu'à ajouter le nom du module à / etc / modulespour que le module fonctionne après le redémarrage du système d'exploitation. Désormais, iptables comprend les commandes geoip, mais il ne dispose pas de suffisamment de données pour travailler. Commençons par charger la base de données geoip.

Obtenir la base de données GeoIP

Nous créons un répertoire dans lequel seront stockées les informations compréhensibles 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 packages. La différence la plus notable est le changement de fournisseur de base de données et de script. xt_geoip_dl, qui télécharge les dernières données.

Version du gestionnaire de paquets

Le script se trouve dans le chemin /usr/lib/xtables-addons, mais lorsque vous essayez de l'exécuter, vous verrez 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, le produit GeoLite, désormais connu sous le nom de GeoLite Legacy, distribué sous licence, était utilisé comme base de données Creative CommonsASA 4.0 entreprise MaxMind. Deux événements se sont produits simultanément avec ce produit qui ont « rompu » la compatibilité avec l'extension iptables.

Premièrement, en janvier 2018 annoncé concernant la fin du support du produit, et le 2019 janvier 2, tous les liens vers le téléchargement de l'ancienne version de la base de données ont été supprimés du site officiel. Il est recommandé aux nouveaux utilisateurs d'utiliser le produit GeoLite2 ou sa version payante GeoIPXNUMX.

Deuxièmement, depuis décembre 2019, MaxMind dit concernant un changement significatif dans l'accès à leurs bases de données. Pour se conformer au California Consumer Privacy Act, MaxMind a décidé de « couvrir » la distribution de GeoLite2 avec enregistrement.

Puisque nous souhaitons utiliser leur produit, nous nous inscrireons sur cette page.

xtables-addons : filtrer les packages par pays
Vous recevrez alors un email vous demandant de définir un mot de passe. Maintenant que nous avons créé un compte, nous devons créer une clé de licence. Dans votre compte personnel, nous trouvons l'article 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 GeoIP Update ? Nous répondons négativement et appuyons sur le bouton Confirmer. La clé sera affichée dans une fenêtre contextuelle. Enregistrez cette clé dans un endroit sûr, car une fois que vous fermez la fenêtre contextuelle, vous ne pourrez plus voir l'intégralité de la clé.

xtables-addons : filtrer les packages par pays
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 viennent à la rescousse. Pour exécuter des scripts, 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 un fichier :

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

cd GeoLite2xtables

echo YOUR_LICENSE_KEY=’123ertyui123' > geolite2.license

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, avec un grand nombre de serveurs, propose de mettre en cache la mise à jour sur un serveur proxy.

Veuillez noter que le fichier de sortie doit être appelé dbip-country-lite.csv... Malheureusement, 20_convert_geolite2 ne produit pas un fichier parfait. Scénario xt_geoip_build attend trois colonnes :

  • début de la plage d'adresses ;
  • fin de la plage d'adresses ;
  • code du 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 (représentation numérique) ;
  • fin de la plage d'adresses (représentation numérique) ;
  • code de pays;
  • le nom du pays.

Cet écart est critique et peut être corrigé de deux manières :

  1. règne 20_convert_geolite2;
  2. règne xt_geoip_build.

Dans le premier cas on réduit printf au format requis, et dans le second - nous modifions l'affectation à la variable $cc sur $ligne->[4]. Après cela, vous pouvez construire :

/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

A noter que l'auteur Tables GeoLite2x ne considère pas ses scripts prêts à être produits et propose suivre pour le développement de scripts xt_geoip_* originaux. Passons donc à l'assemblage à partir des codes sources, dans lequel ces scripts ont déjà été mis à jour.

Version source

Lors de l'installation à partir de scripts de code source xt_geoip_* se trouvent dans le catalogue /usr/local/libexec/xtables-addons. Cette version du script utilise une base de données IP vers Pays Lite. La licence est Creative Commons Attribution License, et parmi les données disponibles, il y a les trois colonnes très nécessaires. Téléchargez et assemblez 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.

Utiliser Geoip dans iptables

Module xt_geoip ajoute seulement 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.

Les méthodes de création de règles pour iptables restent généralement inchangées. Pour utiliser les clés 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 ne provenant pas des USA 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 sont utilisés uniquement lors de la création de règles, mais ne sont pas pris en compte lors du 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 en fonction des pays est une stratégie quelque peu oubliée par le temps. Malgré cela, des outils logiciels pour un tel filtrage sont en cours de développement 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 packages, ce qui simplifiera grandement la vie des administrateurs système.

xtables-addons : filtrer les packages par pays

Seuls les utilisateurs enregistrés peuvent participer à l'enquête. se connecters'il te plait.

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

Ajouter un commentaire