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
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
Premièrement, en janvier 2018
Deuxièmement, depuis décembre 2019, MaxMind
Puisque nous souhaitons utiliser leur produit, nous nous inscrireons sur cette page.
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é.
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 :
- règne 20_convert_geolite2;
- règne xt_geoip_build.
Dans le premier cas on réduit
/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
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
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.
Seuls les utilisateurs enregistrés peuvent participer à l'enquête.
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