Seit meine Allsky-Kamera über eine eigene Subdomain öffentlich erreichbar ist, sehe ich regelmäßig Zugriffsversuche aus bestimmten Ländern. Vor allem IPs aus Russland (RU) und China (CN) tauchen überproportional häufig in den Logfiles auf – meistens automatisierte Scanner, Bots oder Credential-Stuffing-Versuche.
Natürlich schützt ein gehärtetes System (Firewall, Fail2Ban, Rate-Limits, HTTPS) bereits recht gut. Aber: Viele dieser Anfragen müsste ich mir gar nicht erst ins System ziehen. Deshalb setze ich zusätzlich auf Geo-Blocking: Der Raspberry Pi wirft TCP-Verbindungen aus bestimmten Ländern einfach ab, und zwar bevor der Webserver sie erreicht.
Was Geo-Blocking leistet – und was nicht
Geo-Blocking ist kein Ersatz für eine Firewall, aber eine sinnvolle Ergänzung. Es verhindert: ständige Portscans aus bekannten Botnet-Hotspots, automatisierte Web-Scanner und sinnlose Verbindungen aus Regionen, aus denen garantiert keine echten Besucher kommen Diese Methode ist natürlich nicht perfekt: Wer ein VPN nutzt, taucht oft als „EU“ oder „USA“ auf. Für die Masse der automatisierten Anfragen funktioniert es aber hervorragend.
Technische Basis: ipset + iptables
Linux bietet mit `ipset` und `iptables` performante Werkzeuge, um große Netzlisten effizient zu blocken. Für jedes Land existieren fertige IPv4- und IPv6-Listen, die regelmäßig aktualisiert werden. Ich blockiere exemplarisch: CN (China) und RU (Russland) Weitere Länder wie Indonesien, Thailand und Co. lassen sich jederzeit ergänzen. Wichtig für mich: Auf keinen Fall möchte ich einen der Update-Server von Letsencrypt blocken – denn der kümmert sich um mein SSL-Zertifikat.
Schritt 1: ipset installieren
sudo apt update sudo apt install ipset
Schritt 2: IP-Set für die geblockten Länder erstellen
sudo ipset create geoblock hash:net family inet
Schritt 3: Länderlisten für Russland und China laden
# China (CN)
wget -O - https://www.ipdeny.com/ipblocks/data/countries/cn.zone \
| sudo xargs -I{} ipset add geoblock {}
# Russland (RU)
wget -O - https://www.ipdeny.com/ipblocks/data/countries/ru.zone \
| sudo xargs -I{} ipset add geoblock {}
Damit enthält `geoblock` jetzt hunderte Netzbereiche, die Linux extrem performant verarbeiten kann.
Schritt 4: Firewall-Regeln einrichten (Port 80 und 443)
sudo iptables -I INPUT -p tcp --dport 80 \ -m set --match-set geoblock src \ -m conntrack --ctstate NEW -j DROP sudo iptables -I INPUT -p tcp --dport 443 \ -m set --match-set geoblock src \ -m conntrack --ctstate NEW -j DROP
Neue HTTP- oder HTTPS-Verbindungen aus Russland und China werden damit komplett abgewiesen.
Schritt 5: Konfiguration persistent speichern
sudo apt install netfilter-persistent sudo netfilter-persistent save
Ergebnis: Der Webserver bleibt sauber
Seit der Aktivierung landen deutlich weniger Zugriffe in meinen Apache-Logs, und Fail2Ban bekommt weniger Arbeit. Die typische Bot-Last aus Russland und China verschwindet fast vollständig.
Optional: IPv6 ebenfalls blockieren
Auch IPv6-Netze lassen sich analog zu IPv4 sperren:
sudo ipset create geoblock6 hash:net family inet6
wget -O - https://www.ipdeny.com/ipv6/ipaddresses/blocks/cn.zone \
| sudo xargs -I{} ipset add geoblock6 {}
wget -O - https://www.ipdeny.com/ipv6/ipaddresses/blocks/ru.zone \
| sudo xargs -I{} ipset add geoblock6 {}
sudo ip6tables -I INPUT -p tcp --dport 80 -m set --match-set geoblock6 src -m conntrack --ctstate NEW -j DROP
sudo ip6tables -I INPUT -p tcp --dport 443 -m set --match-set geoblock6 src -m conntrack --ctstate NEW -j DROP
sudo netfilter-persistent save
Fertig!
Geo-Blocking ist kein Allheilmittel – aber eine sehr effiziente Methode, um das Grundrauschen illegaler Zugriffe zu reduzieren. Für mein Allsky-Projekt ist es ein zusätzlicher Schutzmechanismus, der super-einfach zu implementieren ist.