Aktionen

Ubuntu 14.04.x Apache 2.4.7 GeoIP Blocking mit IPv4 und IPv6 einrichten

Aus znilwiki

1 Warum?

Ich hatte das GeoIP-Blocking für meine Firewall entdeckt - und eingerichtet: pfsense - GeoIP Blocking auf bestimmte Ports oder Dienste IPv4 IPv6
Leider kann ich den Zugriff auf meine Webseite nicht so einfach damit schützen. Denn diese soll natürlich weltweit erreichbar sein.

Das gilt aber nur für diese Hauptdomäne [1] !
Bei meinen diversen Subdomänen gibt es schon einige die ich nur aus Deutschland erreichen muss - wo außer mir sowieso niemand etwas zu suchen hat, zum Beispiel mein Zabbix-Server oder mein Guacamole-Gateway.

Die Initiale Idee bekam ich durch Tilmann vom TeamTerraByte. Nettweise hat er mich auch gleich eine Anleitung dazu geschickt.
Ich hatte auch schon selbst etwas gegoogelt und rumprobiert ... und es gab dann doch wieder nicht DIE Anleitung.

Die Beispielskripte zum Beispiel aus der Ubuntu-Anleitung https://wiki.ubuntuusers.de/Apache/mod_geoip2/ funktionierten bei mir schonb mal gar nicht - es lag daran das PHP im Fast-CGI lief.
Und trotz langem Googeln bekam ich das ganze nicht für IPv6 zum laufen ... hab es nach einigem probieren und Nachdenken dann doch zum laufen bekommen.

Das ganze war dann schon wieder so viel das ich mir sicher war - in einem halben jahr bekomme ich das nicbt wieder hin.
Also diese Anleitung hier - dann kann ich beim nächsten Webserver wieder bei mir selbst Abschreiben.

Wir tasten uns in diesem Artikel Stück für Stück an die Lösung ran.



2 Subdomain zum Testen beim Domänenhoster anlegen

Das muss nicht sein - aber ich wollte nicht an den anderen Webseiten rumspielen bis es funktioniert. Und die Domäne dient hinterher als Dauertest.
Wer das nicht will überspringt diesen Teil.
Ich habe mir bei meinem Domänenhoster 1und1 die Subdomäne

geoip.znil.net

angelegt und die DNS-Einstellungen für IPv4 und IPv6 zeigen auf diesen Webserver hier:

IPv4: 94.23.49.222
IPv6: 2001:470:1f0b:fe5:192:168:42:10


GeoIP-Blocking-Apache-001.png

Face-wink.png
Tipp: Ihr könnt natürlich auch die Subdomäne nur im Apache anlegen und dann in der lokalen Host-Datei eures Computers auf die IP-Adressen verweisen.




3 Subdomain im Apache anlegen

Das geht über die Verzeichnisse

/etc/apache2/sites-available
/etc/apache2/sites-enabled

wobei im zweiteren nur ein link auf ersteres hinterlegt wird. Eine genaue Anleitung findet Ihr unter

https://wiki.ubuntuusers.de/Apache/Virtual_Hosts/

Da ich faul bin nutze ich auf meinem Server ISPConfig dafür.

Nach dem Anlegen gibt es also eine Konfigurationsdatei für diese Subdomäne:

/etc/apache2/sites-available/geoip.znil.net.vhost

mit - mindestens - folgendem Inhalt:

<VirtualHost 192.168.42.10:80>
               DocumentRoot /var/www/geoip.znil.net/web
               ServerName geoip.znil.net
               ServerAdmin webmaster@znil.net
</VirtualHost>
<VirtualHost [2001:470:1f0b:fe5:192:168:42:10]:80>
               DocumentRoot /var/www/geoip.znil.net/web
               ServerName geoip.znil.net
               ServerAdmin webmaster@znil.net
</VirtualHost>

Ein Abschnitt für IPv4 und einer für IPv6. Bei IPv6 steht die echte öffentliche IP-Adresse, bei IPv4 die interne denn da nutze ich NAT auf Port 80 von der externen IP.

Für den ersten Test muß in die Datei auch nicht mehr rein.



4 GeoIP-Modul für Apache2 nachinstallieren

Das geht recht leicht mit:

apt-get install libapache2-mod-geoip 
a2enmod geoip

Die 2. Zeile ist oft überflüssig, schadet aber auch nicht.



5 GeoIP-Datenbanken installieren

Bei mir auf dem System waren schon die Datenbanken aus dem Ubuntu-Repository installiert,
das geht auch über

apt-get install geoip-database

nachträglich. Diese sind aber schon recht "alt":

-rw-r--r--   1 root root  827301 Apr  7  2014 GeoIP.dat
-rw-r--r--   1 root root 3105495 Apr  7  2014 GeoIPv6.dat

In den anderen Anleitungen werden immer die aktuellen Datenbanken von MAXMIND heruntergeladen, die findet man hier:

https://dev.maxmind.com/geoip/legacy/geolite/

Also machen wir das auch so:

cd /usr/share/GeoIP
wget "http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz"
wget "http://geolite.maxmind.com/download/geoip/database/GeoIPv6.dat.gz"
wget "http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz"
wget "http://geolite.maxmind.com/download/geoip/database/GeoLiteCityv6-beta/GeoLiteCityv6.dat.gz"
wget "http://download.maxmind.com/download/geoip/database/asnum/GeoIPASNum.dat.gz"
wget "http://download.maxmind.com/download/geoip/database/asnum/GeoIPASNumv6.dat.gz"
gunzip Geo*

Moment mal .. das sind jetzt aber 6 Dateien! vorher waren es doch nur 2!
Richtig! Und deshalb funktionierten die meisten anderen (älteren) Anleitungen aus dem Internet nicht zu 100%
Und IPv6 schon gar nicht.
Wir brauchen alle 6.
Nun sieht es im Verzeichnis wie folgt aus:

-rw-r--r--   1 root root  4173619 Mai 16 12:14 GeoIPASNum.dat
-rw-r--r--   1 root root  5050080 Mai 16 12:14 GeoIPASNumv6.dat
-rw-r--r--   1 root root   878459 Mai  3 20:09 GeoIP.dat
-rw-r--r--   1 root root  1638205 Mai  3 20:09 GeoIPv6.dat
-rw-r--r--   1 root root 22219375 Mai  3 20:39 GeoLiteCity.dat
-rw-r--r--   1 root root 22983221 Mai  3 20:02 GeoLiteCityv6.dat

Die Dateien sind nun deutlich aktueller.



6 Die Verwendung der Datenbanken konfigurieren

Nun müssen wir dem GeoIP-Modul im Apache noch erzählen das es diese Datenbanken auch verwenden soll:

nano /etc/apache2/mods-available/geoip.conf

und den Inhalt wie folgt abändern:

<IfModule mod_geoip.c>
  GeoIPEnable On

  GeoIPDBFile /usr/share/GeoIP/GeoIPASNum.dat CheckCache
  GeoIPDBFile /usr/share/GeoIP/GeoIPASNumv6.dat CheckCache
  GeoIPDBFile /usr/share/GeoIP/GeoIP.dat CheckCache
  GeoIPDBFile /usr/share/GeoIP/GeoIPv6.dat CheckCache
  GeoIPDBFile /usr/share/GeoIP/GeoLiteCity.dat CheckCache
  GeoIPDBFile /usr/share/GeoIP/GeoLiteCityv6.dat CheckCache

  GeoIPScanProxyHeaders On

</IfModule>

Erklärung:
GeoIPEnable On schaltet die Funktion an sich an,
GeoIPDBFile lädt die berteffende Datenbank. Das CheckCache dahinter sorgt dafür das er diese im Cache behält - aber trotzdem jedesmal prüft ob es eine neuere Version gibt
GeoIPScanProxyHeaders On versucht er genauer die IP-Adresse des Absenders zu ermitteln um auch solche hinter Proxys zu erkennen.

Wenn Ihr wenig Speicher habt lasst den Paramter CheckCache einfach weg.
Fehler in vielen anderen Anleitungen war hier das Kommentare dahinter geschrieben wurden (mag er nicht) oder das die gleiche Datenbank mit mehren Parametern angegeben wurde - Erlaubt ist nur einmal mit einem Parameter!

Nun müssen wir den Apache einmal neu starten:

service apache2 restart

und das war es auch schon, GeoIP ist fertig zum Einsatz!



7 GeoIP mit Subdomain testen

Wir erstellen nun eine Test-Datei welche uns im Webbrowser die Daten anzeigt die ermittelt werden konnten.
In einem Forum habe ich hierzu ein elegante Lösung gefunden: https://www.apachehaus.com/forum/index.php?topic=668.0 welche uns einfach alle möglichen Informationen auflistet.
Den nachfolgenden Pfad müsst Ihr an euren Speicherpfad des Webverzeichnisses eurer Domäne anpassen:

nano /var/www/geoip.znil.net/web/index.php

Alternativ erstellt Ihr diese in einer bestehenden Domäne unter anderem Namen:

nano /var/www/geoip.znil.net/web/geoiptest.php


<html>
<body>
<?php

/*  2016 von http://znil.net/index.php?title=Ubuntu_14.04.x_Apache_2.4.7_GeoIP_Blocking_mit_IPv4_und_IPv6_einrichten */

print 'GeoIP Test<br><hr>';

foreach($_SERVER as $key=>$val) {
        if(substr($key, 0, 5)=='GEOIP') print $key.': '.$val.'<br>';
        }
print '<br><hr>';

?>
</body>
</html>



Diese können wir nun im Webbrowser aufrufen:

http://geoip.znil.net
http://geoip.znil.net/geoiptest.php


Je nachdem ob Ihr per IPv4 oder IPv6 die Webseite erreicht und bei welchen Internetprovider Ihr seit sieht die Ausgabe unterschiedlich aus:

7.1 Telekom IPv6

Test aus Achim bei Bremen

GeoIP-Blocking-Apache-002.png



7.2 Telekom IPv4

Test aus Achim bei Bremen

GeoIP-Blocking-Apache-003.png



7.3 EWE-Tel IPv6

Test aus Achim bei Bremen

GeoIP-Blocking-Apache-004.png



7.4 Unbekannt aus Bremen IPv4

GeoIP-Blocking-Apache-005.png



7.5 HE-Net IPv6

GeoIP-Blocking-Apache-006.png



8 Test-Fazit

Wir sehen schon - die Angaben sind höchst unterschiedlich.
Den Kontinent und das Land erkennt er zuverlässig - aber ob es noch mehr Daten gibt ist Glückssache.
Im Zweifel sind die Koordinaten in der Mitte des Landes.

Außerdem sieht man das die Schlüsselwörter bei IPv4 und IPv6 unterschiedlich sind:

IPv4                      IPv6
----                      ----
GEOIP_ADDR                GEOIP_ADDR
GEOIP_CONTINENT_CODE      GEOIP_CONTINENT_CODE_V6
GEOIP_COUNTRY_CODE        GEOIP_COUNTRY_CODE_V6
GEOIP_COUNTRY_NAME        GEOIP_COUNTRY_NAME_V6
GEOIP_DMA_CODE            GEOIP_DMA_CODE_V6
GEOIP_METRO_CODE          GEOIP_METRO_CODE_V6
GEOIP_AREA_CODE           GEOIP_AREA_CODE_V6
GEOIP_LATITUDE            GEOIP_LATITUDE_V6
GEOIP_LONGITUDE           GEOIP_LONGITUDE_V6




9 GeoIP Blocking einrichten

Hier schreibe ich morgen oder so weiter!




10 Kommentare


Kommentar hinzufügen
znilwiki freut sich über alle Kommentare. Sofern du nicht anonym bleiben möchtest, trage deinen Namen oder deine Email-Adresse ein oder melde dich an. Du kannst das Feld auch einfach leer lassen.