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.

