Pourquoi vouloir bloquer l’accès à votre site depuis certains pays ? Hé bien parce que les attaques (DoS, Flood, Spam) ont une grande tendance à venir des mêmes pays (Ukraine, Biélorussie, Chine, etc.)
Voici donc un petit mémo vous permettant d’apprendre à bloquer l’accès à votre site depuis certains pays avec Apache et NGinx
Bloquer l’accès à votre site depuis certains pays avec Apache
Le plus simple avec Apache reste d’utiliser un .htacess et vous pouvez en générer avec IP2LOCATION.
Première étape : Choisissez le type d’adresse à bloquer IPV4 ou IPV6
Deuxième étape : Sélectionnez les pays que vous souhaitez bloquer
Troisième étape : Sélectionnez le format correspondant à votre version d’Apache
Une fois ces trois étapes terminées votre navigateur télécharge un fichier texte. Il ne vous restera qu’à copier et coller son contenu dans un fichier .htaccess que vous placerez à la racine de votre site.
Bloquer l’accès à votre site depuis certains pays avec NGinx
NGinx ne gère pas les .htacess, nous allons donc devoir utiliser un module. NGinx doit avoir été compilé avec le support du mod http_geoip_module
Pour vérifier la présence de ce module utilisez la commande suivante
nginx -V
Qui dans notre cas, nous retourne :
root@noobunbox:/# nginx -V nginx version: nginx/1.9.13 built by gcc 4.9.2 (Debian 4.9.2-10) built with OpenSSL 1.0.2g 1 Mar 2016 TLS SNI support enabled configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --user=www-data --group=www-data --with-threads --with-http_ssl_module --with-http_v2_module --with-ipv6 --with-http_geoip_module --with-http_mp4_module --with-http_auth_request_module --with-http_slice_module --with-file-aio --with-cc-opt='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security' --add-module=/opt/headers-more-nginx
Installation de la base de données GeoIP
Sous Debian et Ubuntu, la base de donnés GeoIP peut être installée via la commande suivante
sudo apt-get install geoip-database libgeoip1
Cette base de données est par défaut stockée dans le dossier /usr/share/GeoIP/. Nous allons donc effectuer une sauvegarde de la BDD puis la mettre à jour
mv /usr/share/GeoIP/GeoIP.dat /usr/share/GeoIP/GeoIP.dat_bak cd /usr/share/GeoIP/ wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz gunzip GeoIP.dat.gz
Configuration de NGinx
Modifions le fichier de configuration de nginx
sudo nano /etc/nginx/nginx.conf
Dans notre exemple nous bloquerons les accès depuis : la Biélorussie, la Chine et l’Ukraine, consultez la page suivante pour connaitre les codes utilisés par chaque pays.
Dans le bloc http
avant les lignes de configuration includes
ajoutez le code suivant :
geoip_country /usr/share/GeoIP/GeoIP.dat; map $geoip_country_code $allowed_country { default yes; BY no; CN no; UKR no; }
Vous pouvez aussi n’autorisez que certains pays, il vous suffira de remplacer la variable default yes
par default no
et de lister ensuite les pays qui pourront accéder à votre site.
Dans l’exemple ci-dessous, nous autoriserons seulement les visites provenant des USA et de la France
geoip_country /usr/share/GeoIP/GeoIP.dat; map $geoip_country_code $allowed_country { default yes; FR yes; US yes; }
Il ne nous reste plus qu’à configurer le blocage par site. Dans votre virtual host ajoutez dans le bloc server
le code suivant
if ($allowed_country = no) { return 444; }
Maintenant vérifiez la configuration de NGinx et si tout va bien rechargez la
sudo nginx -t sudo service nginx reload
Sources
- Blogmotion, Bloquer l’accès à votre site pour certains pays du monde
- Howtoforge, How To Block Visitors By Country With The GeoIP Module
Plop !
Il y a de ca quelques mois/années, j’avais étudié la situation présente car j’en avais marre de voir les niaks(*) venir titiller mon ssh. Cependant, et dixit le web, ca ralentirait nettement la vitesse du surf sur le srv concerné par cette règle.
Du coup, j’ai hésité et donc pas testé en situation réelle (Srv en production).
Des infos là dessus à ton niveau?
Kéro
(*) a prendre avec de l’humour forcément !
Kero qui revient \o/
J’ai seulement mis en place cette solution pour du web.
Çà peut ralentir le serveur si et seulement si tu as beaucoup de traffic.
Apres pour un site ayant énormément de trafic je pense qu’une solution comme Cloudflare est effectivement plus viable
« Dans l’exemple ci-dessous, nous autoriserons seulement les visites provenant des USA et de la France. »
il faut changer le « default yes » à « no » 😉
Par contre, comment autorise-t-on le réseau local (192.168.) ?
Bonjour Cyril,
Tu peux essayer en ajoutant les conditions suivantes
geo $lan-ip {
default no;
192.168.1.0/24 yes;
}
et la configuration suivante avant ( if ($allowed_country = no) {return 444;} )
if ($lan-ip = yes) {
set $allowed_country yes;
}
Bonjour,
Ça marche, merci !
Il est également possible de bloquer avec Geoip au niveau du pare-feu iptables avec xtables-addons-geoip . L’opération est plus compliquée sur raspberry pi en raison du noyau un peu particulier mais ça marche . Ca permet de bloquer les attaques potentielles pour tous les ports. https://www.how-to.ovh/viewtopic.php?t=11
Pour ssh il est aussi possible de bloquer avec cette méthode https://www.axllent.org/docs/view/ssh-geoip/