Apache2 - Nur bestimmte IPs zulassen

Manchmal möchte man nicht jedem Zugriff auf seinem Server gewähren, etwa dem Homeserver oder privaten Bereichen auf Webservern. Zum Glück geht das Sperren von IPs mit jedem Webserver relativ einfach, man legt einfach eine .htaccess mit folgendem Inhalt an:

order deny,allow deny from all allow from xxx.xxx.xxx.xxx

Soweit ist ja noch alles einfach, wenn man aber jetzt den Zugriff nur vom privaten Netz aus erlauben will, steht vor einem Problem:
Oft hat man eine dynamische IP - ok, legt man sich halt ne DynDNS Adresse zu und probiert es erneut.

order deny,allow deny from all allow from domain.com

So funktioniert das leider nicht, da der rDNS-Eintrag der DynDNS nicht nach der IP auflöst, sondern nach dem Hostnamen. Das Ergebnis: Die Ergebnisse decken sich nicht, die Anfrage wird abgewiesen.

Die Lösung ? Mit etwas Batch und einem Cronjob auf dem Server sehr einfach:
Zuerst braucht man ein kleines Batchskript, das die DynDNS-Adresse auflöst und die IP dann in die .htaccess an passender Stelle einträgt.

1
2
3
4
5
6
7
#!/bin/bash
INPUT_FILE="Pfad zur .htaccess"
IP_ADDRESS=`nslookup domain.com | grep Address | sed -n '$p' | sed -e 's/Address: //g'`
#echo $IP_ADDRESS;
PATTERN="'9s/Allow from.*/Allow from $IP_ADDRESS/'"
eval sed -i $PATTERN $INPUT_FILE
#echo $PATTERN $INPUT_FILE;

Das Skript speichert man an einem passenden Ort und erstellt dann einen kleinen Cronjob, der z.B. das Skript einmal in der Stunde aufruft.
crontab -e 10 04 * * * sh /root/scripts/Pfad zur .htaccess

Nun sollte alles funktioneren, bei Problemen kann ich euch ja helfen ;)