Ubuntu 14.04.x Apache 2.4.7 GeoIP Blocking mit IPv4 und IPv6 einrichten
Aus znilwiki
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 Herrn Tilmann vom TeamTerraByte. Netterweise 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.
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
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.
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.
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.
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!
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:
Telekom IPv6
Test aus Achim bei Bremen
Telekom IPv4
Test aus Achim bei Bremen
EWE-Tel IPv6
Test aus Achim bei Bremen
Unbekannt aus Bremen IPv4
HE-Net IPv6
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
GeoIP Blocking einrichten
Hier schreibe ich morgen oder so weiter!