Deutsch| English

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
Last edited 08/29/2012

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

Über den Autor

Falko Timme ist der Besitzer von Boost Your Site mit Timme Hosting - ultra-schnelles nginx-WebhostingTimme Hosting (ultra-schnelles nginx Webhosting). Er ist der Hauptzuständige für HowtoForge (seit 2005) und einer der Kernentwickler von ISPConfig (seit 2000), außerdem hat er zum O’Reilly Buch “Linux System Administration” beigetragen.
vgwort />

 

 

One Response to “nginx: Besucher mit dem GeoIP Modul nach Ländern blocken (Debian/Ubuntu)”

  1. nedodu Sagt:

    Hochinteressant, meine IP-Lösung via CGI-PHP war immer sehr lastig. Gibt’s das auch für Apache 2?

Kommentar

Du musst eingeloggt um einen Kommentar zu hinterlassen.