nginx: Besucher mit dem GeoIP Modul nach Ländern blocken (Debian/Ubuntu)
Version 1.0
Author: Falko Timme <ft [at] falkotimme [dot] com>
Follow me on Twitter
Dieses Tutorial erklärt Ihnen, wie Sie in nginx das GeoIP Modul benutzen um damit Besucher aus bestimmten Ländern zu blocken. Dies wird durch die GeoIP Datenbank möglich gemacht, welche die IP Adressen der Benutzer mit Ländern verknüpft. nginx muss mit HttpGeoipModule kompiliert sein um die GeoIP Datenbank nutzen zu können.
Für die Richtigkeit der Inhalte des Tutorials gebe ich keinerlei Garantie.
1 Vorbemerkung
Wie in der Einleitung bemerkt, muss nginx mit HttpGeoipModule kompiliert worden sein. Um zu überprüfen ob Ihr nginx mit diesem Modul kompiliert wurde, benutzen Sie:
nginx -V
Sehen Sie –with-http_geoip_module in der Ausgabe sind Sie befähigt dazu die GeoIP Datenbank mit nginx zu benutzen:
root@server1:~# nginx -V
nginx version: nginx/1.2.1
TLS SNI support enabled
configure arguments: –prefix=/etc/nginx –conf-path=/etc/nginx/nginx.conf –error-log-path=/var/log/nginx/error.log –http-client-body-temp-path=/var/lib/nginx/body –http-fastcgi-temp-path=/var/lib/nginx/fastcgi –http-log-path=/var/log/nginx/access.log –http-proxy-temp-path=/var/lib/nginx/proxy –http-scgi-temp-path=/var/lib/nginx/scgi –http-uwsgi-temp-path=/var/lib/nginx/uwsgi –lock-path=/var/lock/nginx.lock –pid-path=/var/run/nginx.pid –with-pcre-jit –with-debug –with-http_addition_module –with-http_dav_module –with-http_geoip_module –with-http_gzip_static_module –with-http_image_filter_module –with-http_realip_module –with-http_stub_status_module –with-http_ssl_module –with-http_sub_module –with-http_xslt_module –with-ipv6 –with-sha1=/usr/include/openssl –with-md5=/usr/include/openssl –with-mail –with-mail_ssl_module –add-module=/build/buildd-nginx_1.2.1-2.1-amd64-fMGfEu/nginx-1.2.1/debian/modules/nginx-auth-pam –add-module=/build/buildd-nginx_1.2.1-2.1-amd64-fMGfEu/nginx-1.2.1/debian/modules/nginx-echo –add-module=/build/buildd-nginx_1.2.1-2.1-amd64-fMGfEu/nginx-1.2.1/debian/modules/nginx-upstream-fair –add-module=/build/buildd-nginx_1.2.1-2.1-amd64-fMGfEu/nginx-1.2.1/debian/modules/nginx-dav-ext-module
root@server1:~#
2 Installation der GeoIP Datenbank
Unter Debian/Ubuntu kann die GeoIP Datenbank wie folgt installiert werden:
apt-get install geoip-database libgeoip1
Dies platziert die Datenbank in /usr/share/GeoIP/GeoIP.dat.
Es ist möglich, dass diese nicht ganz aktuell ist. Sie können deshalb eine aktuelle Kopie von der GeoIP Webseite herunterladen:
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
3 nginx konfigurieren
Öffnen Sie /etc/nginx/nginx.conf…
vi /etc/nginx/nginx.conf
… und platzieren Sie folgendes im http {} Block, vor jeglichen include Zeilen:
[...] geoip_country /usr/share/GeoIP/GeoIP.dat; map $geoip_country_code $allowed_country { default yes; FK no; FM no; EH no; } [...] |
Dies erlaubt alle Länder bis auf die drei, die auf no gesetzt sind (Sie können hier eine Länderliste finden). Um es andersrum zu machen, also alle Länder bis auf die angegebenen zu blocken, schreiben Sie es so:
[...] geoip_country /usr/share/GeoIP/GeoIP.dat; map $geoip_country_code $allowed_country { default no; FK yes; FM yes; EH yes; } [...] |
In Wahrheit blockt dies allerdings keine Länder, sondern setzt die $allowed_country Variable. Um tatsächlich Länder zu blocken, öffnen Sie Ihre vHost-Konfiguration und platzieren folgendes im server {} Container (dies kann innerhalb wie auch außerhalb eines jeglichen location {} Blocks platziert werden):
[...] if ($allowed_country = no) { return 444; } [...] |
Den Besuchern aus den geblockten Ländern wird nun ein 444 Fehlercode angezeigt. Hier wird die Verbindung gekappt ohne Header zu senden. Sie können auch einen anderen Fehlercode benutzen, beispielsweise 403 („Forbidden“), wenn Sie möchten.
Laden Sie nginx im Anschluss neu:
/etc/init.d/nginx reload
4 Links
- nginx: http://nginx.org/
- nginx Wiki: http://wiki.nginx.org/
- HttpGeoipModule: http://wiki.nginx.org/HttpGeoipModule