Geo-Blocking als Sicherheitsfunktion für Port 80 und Port 443 auf dem Raspberry Pi

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.