nginx: Besucher mit dem GeoIP Modul nach Ländern blocken (Debian/Ubuntu)

Version 1.0
Author: Falko Timme
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

1 Kommentar(e)

Zum Posten von Kommentaren bitte

Kommentare

Von: nedodu am: 2012-08-31 10:23:51

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