Bonjour,
Mise à jour du tuto le 14/07/22
- Créer le hook suivant:
/etc/yunohost/hooks.d/conf_regen/18-nginx_geoip
#!/bin/bash
# if not present, add package geoip-database with apt install geoip-database
##############################################
#Beware, i'm not sure this command is universal. You must test it before. If not, you can find the result with the command ip route, this one must be like 192.168.0.0/24 or similar. Then replace the variable $network_address with it.
#Attention, je ne suis pas certain que cette commande est universelle. Vous devez la tester au préalable. Si ce n'est pas le cas, vous pouvez trouver la réponse avec la commande ip route, celle-ci doit être de la forme 192.168.0.0/24 ou similaire. Remplacez alors la variable $network_address par celle-ci.
network_address=$(awk '{print $1}' <(grep src <(ip route)))
################################################
action=$1
pending_dir=$4
nginx_dir=$pending_dir/../nginx/etc/nginx
nginx_security_conf=$nginx_dir/conf.d/security.conf.inc
nginx_country_conf=$nginx_dir/conf.d/country.conf
[[ $action == "pre" ]] || exit 0
[[ -d $nginx_dir ]] || exit 0
[[ -e $nginx_security_conf ]] || exit 0
#Now we create the Nginx country conf file
echo "# GeoIP databases
geoip_country /usr/share/GeoIP/GeoIP.dat;
map \$geoip_country_code \$allowed_country {
default no;
# France
FR yes;
# Italie
#IT yes;
}
geo \$lan-ip {
default no;
$network_address yes;
127.0.0.1 yes;
}" > $nginx_country_conf
#Next ,we modify Nginx security.conf.inc file
echo '
# allow local ip
if ($lan-ip = yes) {
set $allowed_country yes;
}
# block the country
if ($allowed_country = no) {
return 444;
}' >> $nginx_security_conf
#And then, we create the cron job.
echo "#!/bin/bash
maj_geoip () {
cd /usr/share/GeoIP
if grep 'inet6 [23]' <(ip -6 addr);then #test if the server can be join with ipv4+ipv6 or only ipv4
wget https://dl.miyuru.lk/geoip/maxmind/country/maxmind.dat.gz -O GeoIP.dat.gz #Download IPv4+IPv6 database
else
wget https://mailfud.org/geoip-legacy/GeoIP.dat.gz #Download IPv4 database
fi
gunzip -f GeoIP.dat.gz #unzip database
}
last=/usr/local/etc/last #it is a file to write the last date update. It is use to compare if there is a new update when the cron job is execute. If not, there's nothing to do.
if grep 'inet6 [23]' <(ip -6 addr);then
update=\$(sed -n 's,.*<li>Maxmind : \(.*\)</li>,\1,p' <(curl -s https://www.miyuru.lk/geoiplegacy | grep 'Maxmind : ')) #Retrieve the last update of database ipv4+ipv6 date on miuru.lk
else
update=\$(sed -n 's,.*<b>\(.*\)</b>,\1,p' <(curl -s https://mailfud.org/geoip-legacy/ | grep 'Latest update')) #retrieve the last update date on mailfud.org
fi
[[ \"\$(<\$last)\" != \"\$update\" ]] && (echo \"\$update\" > \"\$last\";maj_geoip) #Test if there is an update. If yes, write the date in /usr/local/etc/last and execute the function maj_geoip.
exit 0" > /etc/cron.weekly/Geoipupdate
chmod 500 /etc/cron.weekly/Geoipupdate # give execution right to the cron job.
##############################################################
Regénérer la configuration de Nginx dans Yunohost:
yunohost tools regen-conf nginx --force
Voilà, c’est fini.
Pour autoriser un pays, il suffit de l’ajouter dans le hook. Pour en supprimer un, soit passer la valeur yes à no, soit commenter la ligne avec un dièse. Ne pas oublier de régénérer la conf nginx de Yunohost avec regen-conf pour que ce soit pris en compte.
Important: Ce qui est ci-dessous est partiellement obsolète, je l’ai laissé pour info et pour ne pas “casser” e fil de discussion. Il faut désormais suivre ce qui est ci-dessus.
Selon l’usage que vous faîtes de Yunohost, il n’est pas forcément nécessaire de laisser un accès de n’importe où. Par exemple pour un usage personnel de Nextcloud, l’accès est suffisant uniquement de France par exemple et parfois de l’étranger quand on se déplace. Dans ce cas il est possible d’interdire l’accès de l’étranger avec les listes Ip de géolocalisation disponible ici et en cas de déplacement à l’étranger, activer un accès à partir du pays concerné rapidement avec son code iso disponible sur cette page.
Il suffit d’utiliser le script suivant à placer dans /etc/cron.monthly pour une vérification une fois par mois et de le rendre exécutable avec sudo chmod +x /etc/cron.monthly :
#!/bin/bash
maj_geoip () {
cd /usr/share/GeoIP
wget https://dl.miyuru.lk/geoip/maxmind/country/maxmind.dat.gz
gunzip maxmind.dat.gz
mv maxmind.dat GeoIP.dat
}
month=/usr/local/etc/maxmind
update=$(curl -s https://www.miyuru.lk/geoiplegacy | grep -oP "(?<=Maxmind : ).*(?=</li>)")
[[ "$(<$month)" != "$update" ]] && (echo "$update" > "$month";maj_geoip)
exit 0
Ensuite créer le fichier /etc/nginx/country:
map $geoip_country_code $allowed_country {
default no;
# France
FR yes;
# Italie
#IT yes;
#Etc........
}
Ajoutez les pays de votre choix, il suffit de dé-commenter le code iso 3166 des pays pour lesquelles on souhaite un accès comme ici dans l’exemple avec la France .
Ajouter à nginx.conf au début du bloc http
# GeoIP databases
geoip_country /usr/share/GeoIP/GeoIP.dat;
ainsi que la ligne suivante en dessous de include /etc/nginx/sites-enabled/*; :
include /etc/nginx/country;
Ajouter au début de /etc/nginx/conf.d/yunohost_admin.conf en adaptant l’adresse de réseau local:
geo $lan-ip {
default no;
192.168.0.0/24 yes;
}
Puis ajouter à la fin du fichier /etc/nginx/conf.d/security.conf.inc:
if ($lan-ip = yes) {
set $allowed_country yes;
}
# block the country
if ($allowed_country = no) {
return 444;
}
J’ai eu l’occasion de tester de l’étranger, l’accès est bien bloqué. Il a suffit de dé-commenter la ligne du pays concerné dans le fichier /etc/nginx/country pour avoir à nouveau accès au serveur à partir d’un navigateur.