Länder IP Ban mit ipset

Für Modifikationen in und um KeyHelp.
Post Reply
Blubby
Posts: 74
Joined: Tue 5. Mar 2024, 13:10

Länder IP Ban mit ipset

Post by Blubby »

Tobi wrote: Mon 16. Jun 2025, 21:44 Folgende Lösung funktioniert unabhängig auf Debian und Ubuntu, parallel zu KeyHelp.
Wäre es nicht besser aus Performancegründen per Ipset abzubilden?
User avatar
lrab
Posts: 19
Joined: Sat 14. Jun 2025, 14:29

Re: Länder IP Ban mit ipset

Post by lrab »

Blubby wrote: Tue 17. Jun 2025, 00:13 Wäre es nicht besser aus Performancegründen per Ipset abzubilden?
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.
Tobi7889
Posts: 80
Joined: Tue 3. Oct 2023, 22:38
Location: Hannover

Re: Länder IP Ban mit ipset

Post by Tobi7889 »

Korrekt, wir haben zB. von IPTables auf NFTables umgestellt und setzen die IP Sperrliste von AbuseIPDB mittlerweile direkt über NFTables um über ein einfaches CronSkript, welches die Listen holten.

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.
Liebe Grüße
Tobias
User avatar
lrab
Posts: 19
Joined: Sat 14. Jun 2025, 14:29

Re: Länder IP Ban mit ipset

Post by lrab »

Tobi wrote: Mon 30. Jun 2025, 21:57 Nun ja, dort geht es streng genommen um eine angeblich performantere und ressourcenschonendere Lösung. Nur halt leider keine Anleitung wie man das realisieren könnte. Aber vielleicht kommt das ja noch. Ist nicht mein Thema.
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
2. ipset einmalig anlegen

Code: Select all

ipset create abuseipdb hash:ip family inet hashsize 4096 maxelem 500000
3. iptables-Regel setzen

Code: Select all

iptables -I INPUT -m set --match-set abuseipdb src -j DROP
netfilter-persistent save
4. Update-Skript ablegen

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"
Per chmod Skript ausführbar machen nicht vergessen!

5. Cronjob einrichten

Code: Select all

crontab -e

Code: Select all

30 4 * * * update-abuseipdb.sh >/dev/null 2>&1
User avatar
Tobi
Community Moderator
Posts: 3273
Joined: Thu 5. Jan 2017, 13:24

Re: Länder IP Ban mit ipset

Post by Tobi »

lrab wrote: Tue 1. Jul 2025, 09:46 Eigentlich war's nicht geplant, da ich dachte, es wird jeder (kompetente) Serveradministrator mit etwas Hirnschmalz selbst hinkriegen.
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! :lol:
Gruß,
Tobi


-----------------------------
wewoco.de
Das Forum für Reseller, Digital-Agenturen, Bildschirmarbeiter und Mäuseschubser
rolando40
Posts: 11
Joined: Tue 28. Jan 2025, 14:26

Re: Länder IP Ban mit ipset

Post by rolando40 »

Tobi wrote: Tue 1. Jul 2025, 10:30 gibt es hier sicher 10 Noobs
11 :D
Tobi wrote: Tue 1. Jul 2025, 10:30 Von solchen Anleitungen lebt unser Forum.
Natürlich!
Tobi wrote: Tue 1. Jul 2025, 10:30 Oder doch? Zeige dich!
Kuckuck :lol:

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 :P
Image
User avatar
Jolinar
Community Moderator
Posts: 4049
Joined: Sat 30. Jan 2016, 07:11
Location: Weimar (Thüringen)
Contact:

Re: Länder IP Ban mit ipset

Post by Jolinar »

@lrab:
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
Ich vermute mal, du meintest es so:

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
Wenn jemand inkompetent ist, dann kann er nicht wissen, daß er inkompetent ist. (David Dunning)

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
User avatar
lrab
Posts: 19
Joined: Sat 14. Jun 2025, 14:29

Re: Länder IP Ban mit ipset

Post by lrab »

Jolinar wrote: Tue 1. Jul 2025, 20:01 @lrab:
Ich glaub, da hat sich ein Fehler eingeschlichen:
Aii peinlicher Fehler mit dem Zeilenumbruch. phpBB hat mich scheinbar wieder mit den Tags überfordert. :lol:
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^^):
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.

Werde mich die Tage hinsetzen und mal ein aktualisiertes Skript schreiben. Danke für euren Input!
User avatar
Ralph
Posts: 1284
Joined: Mon 30. Mar 2020, 16:14

Re: Länder IP Ban mit ipset

Post by Ralph »

Für country blocking verwende ich ein script was einmalig beim Systemstart ausgeführt wird.
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
kann dann noch für IPv6 erweitert werden z.b.

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
check:

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
User avatar
Ralph
Posts: 1284
Joined: Mon 30. Mar 2020, 16:14

Re: Länder IP Ban mit ipset

Post by Ralph »

Das Problem wird so schnell niemand in den Griff bekommen, nicht mit Geoblocking und auch nicht mit IP Blacklists ... weil die Botnets bereits zu riesig geworden sind und neue attackierende IP Adressen jeden Tag massenhaft hinzukommen :roll:
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 :lol:

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