Wäre es nicht besser aus Performancegründen per Ipset abzubilden?
Länder IP Ban mit ipset
Re: Länder IP Ban mit ipset
Genau das war auch mein Gedanke als ich das Skript gesehen hab.
Fail2Ban arbeitet ja bekanntermaßen mit iptables, um IP-Adressen zu sperren. Wenn man tausende IPs über fail2ban-client set banip blockiert, kann das schnell zu Performance-Problemen führen. Jede IP wird als eigene Regel in iptables angelegt, was nicht nur die Verarbeitung und/oder den Verbindungsaufbau verlangsamt, sondern auch zu längeren Ladezeiten beim Restart von Fail2Ban führt. Auch die Speicher- und CPU-Auslastung steigt deutlich an, da die Regeln einzeln durchlaufen werden müssen.
Für genau solche Anwendungsfälle ist wie du sagst, ipset deutlich besser geeignet. Es erlaubt das Verwalten vieler IPs in einer einzigen iptables-Regel. Die Prüfung, ob eine IP gesperrt ist läuft per Hash-Set, also direkt unabhängig davon, ob 10 oder 10.000 IPs enthalten sind. Performance und Systemressourcen profitieren davon spürbar.
Re: Länder IP Ban mit ipset
Dann binden wir es via IPSets (einmal für IPv4 und einmal für IPv6) in NFTables ein, das sorgt für weit bessere Performance.
Tobias
Re: Länder IP Ban mit ipset
Eigentlich war's nicht geplant, da ich dachte, es wird jeder (kompetente) Serveradministrator mit etwas Hirnschmalz selbst hinkriegen.
Na dann hier mal eine Anleitung wie es mit ipsets funktioniert.
1. Pakete installieren (falls noch nicht vorhanden)
Code: Select all
apt update
apt install ipset iptables-persistent ipset-persistent curl
Code: Select all
ipset create abuseipdb hash:ip family inet hashsize 4096 maxelem 500000
Code: Select all
iptables -I INPUT -m set --match-set abuseipdb src -j DROP
netfilter-persistent save
Code: Select all
#!/usr/bin/env bash
set -eu
LIST_URL="https://raw.githubusercontent.com/borestad/blocklist-abuseipdb/refs/heads/main/abuseipdb-s100-30d.ipv4"
SET="abuseipdb"
TMP="${SET}_tmp"
ipset create "$TMP" hash:ip family inet hashsize 4096 maxelem 500000 -exist
curl -s "$LIST_URL" | grep -v '^#' | cut -d' ' -f1 | while read -r ip; do
[[ -n "$ip" ]] && ipset ad
d "$TMP" "$ip" -exist
done
ipset swap "$SET" "$TMP"
ipset destroy "$TMP"
5. Cronjob einrichten
Code: Select all
crontab -e
Code: Select all
30 4 * * * update-abuseipdb.sh >/dev/null 2>&1
Re: Länder IP Ban mit ipset
Danke!
Von solchen Anleitungen lebt unser Forum.
Ich schätze pro kompetenten Admin gibt es hier sicher 10 Noobs welche von der Erfahrung der Pros profitieren.
Nur so kann man lernen.
Allerdings gibt es hier auch noch stille Mitleser welche man lieber nicht wecken sollte...
Oder doch? Zeige dich!

Tobi
-----------------------------
wewoco.de
Das Forum für Reseller, Digital-Agenturen, Bildschirmarbeiter und Mäuseschubser
Re: Länder IP Ban mit ipset
11

Natürlich!
Kuckuck

Meine Ländersperre ist in der Forumssoft eingepflegt, weil ich Massen Bots Besucher aus Singapur hatte und mein Forum lahm legte.
Nun sehen sie eine leere Seite und haben kein Interesse mehr


- Jolinar
- Community Moderator
- Posts: 4049
- Joined: Sat 30. Jan 2016, 07:11
- Location: Weimar (Thüringen)
- Contact:
Re: Länder IP Ban mit ipset
Ich glaub, da hat sich ein Fehler eingeschlichen:
Code: Select all
curl -s "$LIST_URL" | grep -v '^#' | cut -d' ' -f1 | while read -r ip; do
[[ -n "$ip" ]] && ipset ad
d "$TMP" "$ip" -exist
done
Code: Select all
curl -s "$LIST_URL" | grep -v '^#' | cut -d' ' -f1 | while read -r ip; do
[[ -n "$ip" ]] && ipset add "$TMP" "$ip" -exist
done
Nachtrag:
Wenn du einmal am Verbessern deines Scripts bist, könntest du ja noch eine Prüfung einbauen, ob auf dem System iptables oder nftables zum Einsatz kommt. So wäre das Script auch dann noch valide, wenn iptables irgendwann aus den Systemen verschwindet.
Vielleicht sowas in der Art (Codesnippet mit KI erstellt, nicht getestet^^):
Code: Select all
# --- Prüfung und Regelsetzung ---
IPTABLES_VERSION_OUTPUT=$(iptables -V 2>&1)
if echo "$IPTABLES_VERSION_OUTPUT" | grep -q "(nf_tables)"; then
echo "Info: iptables (nf_tables backend) erkannt. Setze Regel mit iptables-nft."
# Die Regel für iptables-nft ist die gleiche wie für iptables-legacy
iptables -I INPUT -m set --match-set abuseipdb src -j DROP
elif echo "$IPTABLES_VERSION_OUTPUT" | grep -q "(legacy)"; then
echo "Info: iptables (legacy backend) erkannt. Setze Regel mit iptables-legacy."
iptables -I INPUT -m set --match-set abuseipdb src -j DROP
elif command -v nft &>/dev/null && nft list ruleset &>/dev/null; then
echo "Info: nftables direkt erkannt. Setze Regel mit nft."
# Hier wäre der nftables-spezifische Befehl, falls du ihn verwenden möchtest
# Beispiel (ersetze 'filter' und 'input' durch deine tatsächlichen Tabellen/Ketten, falls abweichend):
# nft add rule ip filter input ip saddr @abuseipdb drop
# Für dieses spezielle Szenario (ipset mit DROP) würde der iptables-Befehl über die Kompatibilitätsschicht immer noch funktionieren.
# Daher ist es meist nicht nötig, hier auf nft umzuschwenken, wenn die iptables-Regel auch mit nftables-Backend funktioniert.
iptables -I INPUT -m set --match-set abuseipdb src -j DROP # Weiterhin iptables-Befehl nutzen
else
echo "Warnung: Weder iptables-legacy noch nftables eindeutig erkannt. Versuche trotzdem iptables-Befehl."
echo "Bitte überprüfen Sie Ihre Firewall-Konfiguration manuell."
iptables -I INPUT -m set --match-set abuseipdb src -j DROP # Versuchen Sie es trotzdem
fi
Data Collector für Community Support
___
Ich verwende zwei verschiedene Schriftfarben in meinen Beiträgen /
I use two different font colors in my posts:
- In dieser Farbe schreibe ich als Moderator und gebe moderative Hinweise oder begründe moderative Eingriffe /
In this color, I write as a moderator and provide moderative guidance or justify moderative interventions - In dieser Farbe schreibe ich als Community Mitglied und teile meine private Meinung und persönlichen Ansichten mit /
In this color, I write as a community member and share my personal opinions and views
Re: Länder IP Ban mit ipset
Aii peinlicher Fehler mit dem Zeilenumbruch. phpBB hat mich scheinbar wieder mit den Tags überfordert.

Sehr gute Idee übrigens mit der Prüfung auf iptables oder nftables. Ich hatte tatsächlich schon überlegt, beim Einfügen auch direkt die Validität zu prüfen, wobei ich (hoffentlich) davon ausgehe, dass das Repository eine plausible/korrekte Quelle ist.Jolinar wrote: ↑Tue 1. Jul 2025, 20:01 Nachtrag:
Wenn du einmal am Verbessern deines Scripts bist, könntest du ja noch eine Prüfung einbauen, ob auf dem System iptables oder nftables zum Einsatz kommt. So wäre das Script auch dann noch valide, wenn iptables irgendwann aus den Systemen verschwindet.
Vielleicht sowas in der Art (Codesnippet mit KI erstellt, nicht getestet^^):
Werde mich die Tage hinsetzen und mal ein aktualisiertes Skript schreiben. Danke für euren Input!
Re: Länder IP Ban mit ipset
Script & Länder können und sollten erweitert und optimiert werden, ich verwende eine externe FW und habe die KH FW deaktiviert, mein script ist auch etwas umfangreicher, aber unten mal ein kurzes Beispiel dazu (ungetestet).
Die KH Tasks werden bei aktivierter KH Firewall die country chains löschen wenn diese nicht als persistent integriert wurden und werden dann unwirksam!
z.b.
Code: Select all
#!/bin/bash
cd /tmp
ipset -N -exist china hash:net
timeout 10 curl -s https://www.ipdeny.com/ipblocks/data/countries/cn.zone | grep -oP '^[0-9\./]+' > cn.zone
for i in $(cat cn.zone ); do ipset -A china $i; done
ipset -N -exist bangladesh hash:net
timeout 10 curl -s https://www.ipdeny.com/ipblocks/data/countries/bd.zone | grep -oP '^[0-9\./]+' > bd.zone
for i in $(cat bd.zone ); do ipset -A bangladesh $i; done
ipset -N -exist brazil hash:net
timeout 10 curl -s https://www.ipdeny.com/ipblocks/data/countries/br.zone | grep -oP '^[0-9\./]+' > br.zone
for i in $(cat br.zone ); do ipset -A brazil $i; done
iptables -I INPUT -p all -m set --match-set china src -j DROP
iptables -I OUTPUT -p all -m set --match-set china src -j DROP
iptables -I FORWARD -p all -m set --match-set china src -j DROP
iptables -I INPUT -p all -m set --match-set bangladesh src -j DROP
iptables -I OUTPUT -p all -m set --match-set bangladesh src -j DROP
iptables -I FORWARD -p all -m set --match-set bangladesh src -j DROP
iptables -I INPUT -p all -m set --match-set brazil src -j DROP
iptables -I OUTPUT -p all -m set --match-set brazil src -j DROP
iptables -I FORWARD -p all -m set --match-set brazil src -j DROP
rm -rf /tmp/*.zone
Code: Select all
ipset -N -exist china6 hash:net family inet6
timeout 10 curl -s https://raw.githubusercontent.com/ipverse/rir-ip/master/country/cn/ipv6-aggregated.txt > cn1.zone
awk '/^([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4}(:\/[0-9]{1,2})?([[:space:]]|$)/{print $1}' /tmp/cn1.zone > /tmp/cn.zone
for i in $(cat cn.zone ); do ipset -A china6 $i; done
ip6tables -I INPUT -p all -m set --match-set china6 src -j DROP
ip6tables -I OUTPUT -p all -m set --match-set china6 src -j DROP
ip6tables -I FORWARD -p all -m set --match-set china6 src -j DROP
Code: Select all
ipset list china | wc -l
ipset list china
ipset list china6 | wc -l
ipset list china6
iptables -L -n --line-numbers
ip6tables -L -n --line-numbers
Re: Länder IP Ban mit ipset

Wäre vieleicht besser und weniger Aufwand nur Whitelists zu füttern ...
Als Standard einfach alles dicht machen und per Anfrage und "sorgfältiger" Prüfung erst Zugriff erlauben ... quasi

Die AbuseIPDB Reporting Statistics (eher nur die Spitze vom Eisbärsch) aber schon eine nette Steigerung erkennbar!
https://www.abuseipdb.com/statistics