Tuto: Bloquer les requêtes selon le pays

C’est ce que je disais plus haut, tout du moins ce que j’ai compris, les ipv4 sont mappées en ipv6 dans le fichier GeoIPv6.dat. Donc si le serveur est en ipv6 ça bloque bien les ipv4 et les ipv6, il reconnait bien les adresses sous cette forme. Par contre si le serveur est en ipv4, il faudrait bien utiliser le fichier GeoIP.dat car les adresses ipv4 mappées en ipv6 ne sont pas reconnues.
Je ferai des tests pour voir si ça se vérifie mais ce que tu dis @kit va dans ce sens.

@metyun : trouvé sur les internets une méthode similaire pour la partie SSH => https://www.axllent.org/docs/ssh-geoip/ (il existe quelques variantes).

Le plus gros soucis semble être le fait que le paquet geoiplookup soit abandonné (du moins pour buster).

Soit on fait appel à une API (comme dans ce script => kit/Authentication_alert - authentication_alert.bash at master - Authentication_alert - Gitea ), soit, vu qu’on a déjà les bases de données, on adapte ton script dédié à nginx.

Qu’en penses-tu ?

Et bien en fait, je me suis rendu compte du même pb… Donc j’ai l’impression qu’il faudrait modifier le setting de nginx pour utiliser un fichier différent en fonction du type d’IP…

Je crois que je ne comprends pas bien le fonctionnement :

  • Admettons que j’ai un serveur uniquement en IPv4.
    – Si quelqu’un ayant uniquement une IPv6 tente d’accéder au serveur, pourquoi le serveur ne peut-il pas reconnaitre ladite IP en fouillant le fichier IPv6 ? Ce n’est pas une simple comparaison de string ?

@Krakinou & @Kit , êtes-vous sûrs que lorsque l’ipv6 est activé sur le serveur en utilisant le fichier GeoIPv6.dat, les ipv4 de pays non autorisés ne sont pas bloquées?
Si le serveur est en ipv4 exclusif, il faut utiliser le fichier GeoIP.dat car le serveur ne sais pas lire le fichier GeoIPv6.dat dans ce cas. C’est ce que j’expliquais, les ipv4 sont mappées en un format uniquement lisible avec un serveur ou l’ipv6 est activé si on utilise le fichier GeoIPv6.dat. Il faudrait que je retrouve la source, je n’ai pas conservé la page où je l’ai lu.
Donc de ce que je comprends:
si le serveur est en ipv4 —> fichier GeoIP.dat, ne lis que les ipv4
si le serveur est en ipv6 —> fichier GeoIPv6.dat, doit lire les ipv4 et ipv6. Ne fonctionne pas avec un serveur ipv4 exclusif.

Tout simplement parce qu’ils ne peuvent pas communiquer entre eux. Un client ipv6 only ne peut pas communiquer nativement avec du serveur ipv4 only. Il faut utiliser des solutions spécifiques pour le permettre.

1 Like

Je n’ai pas retrouvé la source mais la documentation de Nginx en parle:
http://nginx.org/en/docs/http/ngx_http_geoip_module.html

traduit par DeepL:
Lors de l’utilisation des bases de données avec support IPv6 (1.3.12, 1.2.7), les adresses IPv4 sont recherchées comme des adresses IPv6 mappées en IPv4.

soit je fais 2 hooks différents, soit une CLI pour détecter si le serveur est ipv4 only ou ipv6. Connaissez-vous une commande fiable pour détecter si l’ipv6 est activé?

grep inet6 <(ifconfig)

ferait-elle l’affaire? ifconfig est-il présent par défaut sur tous les serveurs Debian?

Pour ssh, oui ça doit sans doute être adaptable.
Perso je préfère fermer le port ssh comme mon serveur est à domicile, c’est un service sensible. Et si vraiment j’ai besoin de me connecter de l’extérieur, je privilégie toujours une connexion par clefs, ça me semble nettement plus sécurisé qu’une connexion par login/mdp.

C’est le package net-tools, qui n’est pas installé par défaut.

Je suis en train de tester, et en ce qui me concerne, si j’utilise le fichier IPv6 et que je force mon firefox en IPv4, et bien je me fais jeter avec un beau 444…
J’ai donc l’impression que le fichier IPv6 ne fonctionne pas avec l’IPv4, même du coté du client…

On peut donc en conclure que GeoIP.dat ne contient que les adresses ipv4 et GeoIPv6.dat que les adresses ipv6.
Il faudrait les fusionner.
Sinon plus simple, revenir à la source que j’utilisais dans le passé: GeoIP Legacy Databases
Il y a un fichier ipv6/ipv4 qui contient les ipv4 mappées en ipv6.
Pour un serveur ipv4 only, il faut rester sur mailfud.org car miyuru.lk n’est parfois joignable qu’en ipv6.

Je pense que le problème vient de la base de donnée utilisée.
En effet, je viens de tester en utilisant la base de GeoIP Legacy Databases et cela fonctionne.que je sois en IPv4 ou en IPv6.

Nos posts se sont croisé. C’est bien la base ipv4/ipv6 que tu as utilisé?

Oui j’ai vu, les grands esprits… :slight_smile:
Tout à fait, la base croisée IPv4/IPv6 issue de maxmind
Je me suis également ouvert un compte chez maxmind pour tester leur base GeoLite2, mais bizarrement j’ai le même problème alors qu’elle est censé être à la source des 2 utilisées dans ce thread…

Ok, je mettrai le 1er post à jour prochainement. Une idée pour la ligne de commande à utiliser supportée nativement? ip doit être natif je pense:

grep inet <(ip -6 addr)

Et en fonction du code retour, soit on télécharge la base ipv4 sur mailfud.org, soit la base ipv4/ipv6 de GeoIP Legacy Databases

Sur mailfud, les fichiers v4 et v6 pèsent respectivement 1,14 et 1,17 Mo.

Idem sur miyuru, et le fichier supplémentaire v4/v6 pèse pratiquement 2,3 Mo.

Ergo : le fichier v6 sur mailfud ne contient que les IPv6.

D’après ici, ip est preinstallé sur debian oui

Il y a une bonne raison à ne pas utiliser le classique pipe ?

Salut !

Si le but est de vérifier que le serveur est joignable par IPv6 depuis Internet, il faut une commande plus selective pour exclure les adresses locales.

grep 'inet6 [23]' <(ip -6 addr)

Cette command aura un exit status de 0 si et seulement si une interface possède une adresse dans l’espace alloué à Internet (2000::/3).

2 Likes

Je propose de modifier le script d’update des bases de données comme suit :

#!/bin/bash

# A placer dans /etc/cron.weekly/Geoipupdate
# Voir https://forum.yunohost.org/t/tuto-bloquer-les-requetes-selon-le-pays/9947


maj_geoip () {
v6Test=`grep 'inet6 [23]' <(ip -6 addr)` #Test si le serveur supporte l'IPv6

cd /usr/share/GeoIP
if [ "$v6Test" != "" ]; then
        wget https://dl.miyuru.lk/geoip/maxmind/country/maxmind.dat.gz -O GeoIP.dat.gz #IPv4+IPv6
else
        wget https://mailfud.org/geoip-legacy/GeoIP.dat.gz #IPv4
fi
gunzip -f GeoIP.dat.gz
}

last=/usr/local/etc/last
update=$(sed -n 's,.*<b>\(.*\)</b>,\1,p' <(curl -s https://mailfud.org/geoip-legacy/ | grep 'Latest update'))
[[ "$(<$last)" != "$update" ]] && (echo "$update" > "$last";maj_geoip)
exit 0

Du coup, cette partie là risque de ne plus fonctionner non?
update=$(sed -n 's,.*<b>\(.*\)</b>,\1,p' <(curl -s https://mailfud.org/geoip-legacy/ | grep 'Latest update'))
il faudrait quelque chose comme ça (pas testé):

maj_geoip () {
cd /usr/share/GeoIP
if [ "$v6Test" != "" ]; then
        wget https://dl.miyuru.lk/geoip/maxmind/country/maxmind.dat.gz -O GeoIP.dat.gz #IPv4+IPv6
else
        wget https://mailfud.org/geoip-legacy/GeoIP.dat.gz #IPv4
fi
gunzip -f GeoIP.dat.gz
}

last=/usr/local/etc/last
v6Test=`grep 'inet6 [23]' <(ip -6 addr)` #Test si le serveur supporte l'IPv6

if [ "$v6Test" != "" ]; then
        update=$(sed -n 's,.*<li>Maxmind : \(.*\)</li>,\1,p' <(curl -s https://www.miyuru.lk/geoiplegacy | grep 'Maxmind : '))
else
        update=$(sed -n 's,.*<b>\(.*\)</b>,\1,p' <(curl -s https://mailfud.org/geoip-legacy/ | grep 'Latest update'))
fi
[[ "$(<$last)" != "$update" ]] && (echo "$update" > "$last";maj_geoip)
exit 0
2 Likes