Country‑Block per nftables – einfache Lösung ohne Zusatztools
Posted: Thu 16. Apr 2026, 17:01
Ich stelle hier meine Country‑Block‑Lösung für KeyHelp bereit, die vollständig auf nftables basiert und ohne zusätzliche Tools oder Plugins auskommt. Alle benötigten Pakete sind vorhanden. Es muss nichts installiert werden und es resultieren keinerlei Kollisionen mit Keyhelp.
Diese Lösung deckt ausschließlich IPv4‑Adressen ab.
IPv6 wird bewusst nicht berücksichtigt, da die meisten öffentlich dokumentierten Angriffsstatistiken weiterhin klar von IPv4‑Traffic dominiert werden und auch auf meinen eigenen Servern nahezu das gesamte „Grundrauschen“ aus IPv4‑Netzen stammt.
Ob ein zusätzlicher IPv6‑Country‑Block in der Praxis einen spürbaren Mehrwert bringt, hängt stark von der jeweiligen Umgebung ab. Für viele typische Hosting‑Szenarien ist der Nutzen derzeit eher gering, kann aber bei Bedarf jederzeit ergänzt werden.
Die blockierten Länder sind:
China (cn), Hongkong (hk), Macau (mo), Nigeria (ng), Russland (ru), Ukraine (ua), Rumänien (ro), Brasilien (br), Indien (in), Vietnam (vn), Indonesien (id), Türkei (tr), Iran (ir), Pakistan (pk) und Saudi‑Arabien (sa). Das sind laut aktuellem Stand ca. 32.000 IP-Bereiche.
Diese Länder führen in vielen öffentlich einsehbaren Statistiken regelmäßig die Listen automatisierter Angriffe an.
Die getroffene Auswahl ist eine bewusste Abwägung zwischen Schutz und Offenheit und kann von jedem individuell angepasst werden.
1. nftables‑Konfiguration
In der nftables‑Konfiguration werden pro Land Sets angelegt, die später durch das Script befüllt werden.
Lege die Datei an: /etc/nftables/country-block.conf:
Bereits vorhandene /etc/nftables.conf anpassen
Du findest in dieser Datei ganz am Ende folgende Zeile:Füge DAVOR eine neue Zeile ein:Wenn die zitierte Zeile für fail2ban ganz fehlt (auf Debian-/Ubuntu-Systemen ohne Keyhelp) dann einfach am Ende der Datei hinzufügen.
Keyhelp rührt meines Wissen nach Erstinstallation diese Datei nicht mehr an. Falls doch (z.B. bei BS-Upgrade) muss nur diese Zeile erneut hinzugefügt werden.
Testen der nftables‑Konfiguration:
Wenn keine Fehlermeldung erscheint, ist die Konfiguration gültig.
Nach erfolgreichem Test kann nftables neu geladen werden:
2. Country‑Block‑Script
Das Script lädt die IP‑Ranges der gewünschten Länder, leert die Sets und füllt sie neu. Das Ganze läuft über eine Batchdatei, die am Ende verarbeitet wird. Somit erfolgt nur 1 Aufruf pro Land statt ~32.000 mal für alle IP-Bereiche und das Script benötigt nur max. 5 Sekunden. Eine Logdatei wird autom. unter /root/country-block.log angelegt und beinhaltet immer nur den letzten Durchlauf zur Kontrolle.
Neue Datei: /root/country-block.sh
3. Cronjob
Der Cronjob aktualisiert die Listen beim Systemstart sowie einmal pro Woche.
Anlegen: /etc/cron.d/country-block
4. Manuelles Update
Jederzeit möglich mittels Aufruf vonDieser Befehl sollte an dieser Stelle 1x ausgeführt werden um zu initialisieren.
5. Anpassung
Die Länderliste kann jederzeit im Script geändert werden:
Natürlich muss auch in /etc/nftables/country-block.conf entspr. ergänzt werden nach Hinzufügen bzw. Entfernen von Ländern.
Nach Änderungen an der Datei muss die nftables Konfiguration erneut getestet und geladen werden.
Weitere Country‑Codes und Zonenlisten findest du bei ipdeny.
6. Vollständige Deinstallation / Rückbau
Include‑Eintrag aus /etc/nftables.conf entfernen oder auskommentieren:
Country‑Block‑Datei löschen:
nftables neu laden: (Reload entfernt die Sets automatisch, weil sie nicht mehr definiert sind.)
Cronjob entfernen:
Script löschen:
Anmerkungen:
Ich habe bewusst die Listen nach Ländern gruppiert und in nftables nicht einfach alles unter einem Chain "countryblock" o.ä. definiert. Auf diese Weise ist es z.B. jederzeit möglich, die geblockten Pakete nach Ländern zu ermitteln.
Hierfür existiert ein ebenfalls von mir erstelltes Munin-Plugin. Falls daran Interesse besteht werde ich das hier nachreichen.
Diese Lösung deckt ausschließlich IPv4‑Adressen ab.
IPv6 wird bewusst nicht berücksichtigt, da die meisten öffentlich dokumentierten Angriffsstatistiken weiterhin klar von IPv4‑Traffic dominiert werden und auch auf meinen eigenen Servern nahezu das gesamte „Grundrauschen“ aus IPv4‑Netzen stammt.
Ob ein zusätzlicher IPv6‑Country‑Block in der Praxis einen spürbaren Mehrwert bringt, hängt stark von der jeweiligen Umgebung ab. Für viele typische Hosting‑Szenarien ist der Nutzen derzeit eher gering, kann aber bei Bedarf jederzeit ergänzt werden.
Die blockierten Länder sind:
China (cn), Hongkong (hk), Macau (mo), Nigeria (ng), Russland (ru), Ukraine (ua), Rumänien (ro), Brasilien (br), Indien (in), Vietnam (vn), Indonesien (id), Türkei (tr), Iran (ir), Pakistan (pk) und Saudi‑Arabien (sa). Das sind laut aktuellem Stand ca. 32.000 IP-Bereiche.
Diese Länder führen in vielen öffentlich einsehbaren Statistiken regelmäßig die Listen automatisierter Angriffe an.
Die getroffene Auswahl ist eine bewusste Abwägung zwischen Schutz und Offenheit und kann von jedem individuell angepasst werden.
1. nftables‑Konfiguration
In der nftables‑Konfiguration werden pro Land Sets angelegt, die später durch das Script befüllt werden.
Lege die Datei an: /etc/nftables/country-block.conf:
Code: Select all
# Country block sets (IPv4)
#Die Regeln werden automatisch in die bestehende chain input eingefügt.
set block_cn { type ipv4_addr; flags interval; }
set block_hk { type ipv4_addr; flags interval; }
set block_mo { type ipv4_addr; flags interval; }
set block_ng { type ipv4_addr; flags interval; }
set block_ru { type ipv4_addr; flags interval; }
set block_ua { type ipv4_addr; flags interval; }
set block_ro { type ipv4_addr; flags interval; }
set block_br { type ipv4_addr; flags interval; }
set block_in { type ipv4_addr; flags interval; }
set block_vn { type ipv4_addr; flags interval; }
set block_id { type ipv4_addr; flags interval; }
set block_tr { type ipv4_addr; flags interval; }
set block_ir { type ipv4_addr; flags interval; }
set block_pk { type ipv4_addr; flags interval; }
set block_sa { type ipv4_addr; flags interval; }
# Country block rules
ip saddr @block_cn counter drop
ip saddr @block_hk counter drop
ip saddr @block_mo counter drop
ip saddr @block_ng counter drop
ip saddr @block_ru counter drop
ip saddr @block_ua counter drop
ip saddr @block_ro counter drop
ip saddr @block_br counter drop
ip saddr @block_in counter drop
ip saddr @block_vn counter drop
ip saddr @block_id counter drop
ip saddr @block_tr counter drop
ip saddr @block_ir counter drop
ip saddr @block_pk counter drop
ip saddr @block_sa counter drop
Bereits vorhandene /etc/nftables.conf anpassen
Du findest in dieser Datei ganz am Ende folgende Zeile:
Code: Select all
include "/etc/nftables/fail2ban.conf"Code: Select all
include "/etc/nftables/country-block.conf"Keyhelp rührt meines Wissen nach Erstinstallation diese Datei nicht mehr an. Falls doch (z.B. bei BS-Upgrade) muss nur diese Zeile erneut hinzugefügt werden.
Testen der nftables‑Konfiguration:
Code: Select all
nft -c -f /etc/nftables.confNach erfolgreichem Test kann nftables neu geladen werden:
Code: Select all
nft -f /etc/nftables.conf2. Country‑Block‑Script
Das Script lädt die IP‑Ranges der gewünschten Länder, leert die Sets und füllt sie neu. Das Ganze läuft über eine Batchdatei, die am Ende verarbeitet wird. Somit erfolgt nur 1 Aufruf pro Land statt ~32.000 mal für alle IP-Bereiche und das Script benötigt nur max. 5 Sekunden. Eine Logdatei wird autom. unter /root/country-block.log angelegt und beinhaltet immer nur den letzten Durchlauf zur Kontrolle.
Neue Datei: /root/country-block.sh
Code: Select all
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
LOGFILE="/root/country-block.log"
IPV4_URL="https://www.ipdeny.com/ipblocks/data/countries"
COUNTRIES="cn hk mo ng ru ua ro br in vn id tr ir pk sa"
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') $1" >> "$LOGFILE"
}
: > "$LOGFILE"
log "Starte Country-Block Update (per-country only)"
declare -A DATA
SECONDS=0
#
# 1) Länderlisten EINMAL herunterladen
#
for c in $COUNTRIES; do
log "Lade $c..."
DATA[$c]=$(curl -s "$IPV4_URL/$c.zone")
done
#
# 2) Alle Sets leeren
#
for c in $COUNTRIES; do
nft flush set inet filter block_$c
done
#
# 3) Batch-Inserts pro Land
#
for c in $COUNTRIES; do
log "Fülle block_$c..."
# Batch-Block öffnen
echo "add element inet filter block_$c {" > /tmp/batch_$c.nft
# Elemente einfügen
while read ip; do
[ -n "$ip" ] || continue
echo " $ip," >> /tmp/batch_$c.nft
done <<< "${DATA[$c]}"
# Batch-Block schließen
echo "}" >> /tmp/batch_$c.nft
# Einmaliger nft-Aufruf
nft -f /tmp/batch_$c.nft
# Batch-Datei entfernen
rm /tmp/batch_$c.nft
done
log "Update abgeschlossen in ${SECONDS}s."
3. Cronjob
Der Cronjob aktualisiert die Listen beim Systemstart sowie einmal pro Woche.
Anlegen: /etc/cron.d/country-block
Code: Select all
SHELL=/bin/bash
@reboot root /root/country-block.sh
15 2 * * 1 root /root/country-block.sh
4. Manuelles Update
Jederzeit möglich mittels Aufruf von
Code: Select all
/root/country-block.sh5. Anpassung
Die Länderliste kann jederzeit im Script geändert werden:
Code: Select all
COUNTRIES="cn hk mo ng ru ua ro br in vn id tr ir pk sa"
Nach Änderungen an der Datei muss die nftables Konfiguration erneut getestet und geladen werden.
Weitere Country‑Codes und Zonenlisten findest du bei ipdeny.
6. Vollständige Deinstallation / Rückbau
Include‑Eintrag aus /etc/nftables.conf entfernen oder auskommentieren:
Code: Select all
include "/etc/nftables/country-block.conf"Code: Select all
rm /etc/nftables/country-block.confCode: Select all
systemctl reload nftablesCronjob entfernen:
Code: Select all
rm /etc/cron.d/country-blockCode: Select all
rm /root/country-block.shIch habe bewusst die Listen nach Ländern gruppiert und in nftables nicht einfach alles unter einem Chain "countryblock" o.ä. definiert. Auf diese Weise ist es z.B. jederzeit möglich, die geblockten Pakete nach Ländern zu ermitteln.
Hierfür existiert ein ebenfalls von mir erstelltes Munin-Plugin. Falls daran Interesse besteht werde ich das hier nachreichen.

