Länder IP Ban mit Fail2Ban, KeyHelp und Static Files

Für Modifikationen in und um KeyHelp.
User avatar
NicoMSH
Posts: 127
Joined: Sun 1. Jun 2025, 16:54
Location: nähe Halle

Re: Länder IP Ban mit Fail2Ban, KeyHelp und Static Files

Post by NicoMSH »

habe die loadlist.sh erweitert mit Anzeige von

-> Gesamt in Liste: xxx
-> Neu eingetragen: xxx
-> Übersprungen (bereits vorhanden): xxxx
-> Total im Kernel: xxxx

falls gewünscht bitte den Inhalt der loadlist.sh austauschen mit folgenden Inhalt:

Code: Select all

#!/usr/bin/bash

URL="https://raw.githubusercontent.com/borestad/blocklist-abuseipdb/refs/heads/main/abuseipdb-s100-3d.ipv4"
LOCAL_FILE="/root/banip/ipblocklist.txt"
CLEAN_FILE="/root/banip/clean_ips.txt"
SET_NAME="f2b-iplistblock"

echo "$(date "+%Y-%m-%d %H:%M:%S") - Starte Import der AbuseIPDB-Liste..."

# 1. Liste herunterladen
/usr/bin/wget -q "$URL" -O "$LOCAL_FILE"

if [ -f "$LOCAL_FILE" ] && [ -s "$LOCAL_FILE" ]; then
    # 2. IPs bereinigen
    /usr/bin/grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' "$LOCAL_FILE" > "$CLEAN_FILE"
    
    # 3. IPSet im Kernel befüllen
    if /usr/sbin/ipset list "$SET_NAME" >/dev/null 2>&1; then
        
        COUNT_BEFORE=$(/usr/sbin/ipset list "$SET_NAME" | /usr/bin/grep -c '^[0-9]')
        
        /usr/bin/sed -i "s/^/add $SET_NAME /" "$CLEAN_FILE"
        /usr/sbin/ipset restore -! < "$CLEAN_FILE"
        
        COUNT_AFTER=$(/usr/sbin/ipset list "$SET_NAME" | /usr/bin/grep -c '^[0-9]')
        TOTAL_IN_FILE=$(/usr/bin/wc -l < "$CLEAN_FILE")
        
        ADDED_NOW=$((COUNT_AFTER - COUNT_BEFORE))
        [ "$ADDED_NOW" -lt 0 ] && ADDED_NOW=0
        SKIPPED=$((TOTAL_IN_FILE - ADDED_NOW))
        [ "$SKIPPED" -lt 0 ] && SKIPPED=0

        # --- NEU: Automatisch prüfen, ob iptables-Regel greift, sonst anlegen ---
        if ! /usr/sbin/iptables -C INPUT -m set --match-set "$SET_NAME" src -j DROP 2>/dev/null; then
            /usr/sbin/iptables -I INPUT -m set --match-set "$SET_NAME" src -j DROP
            echo "$(date "+%Y-%m-%d %H:%M:%S") - iptables-Regel wurde automatisch hinzugefügt."
        fi

        echo "$(date "+%Y-%m-%d %H:%M:%S") - Kernel-IPSet erfolgreich aktualisiert."
        echo "   -> Gesamt in Liste: $TOTAL_IN_FILE"
        echo "   -> Neu eingetragen: $ADDED_NOW"
        echo "   -> Übersprungen (bereits vorhanden): $SKIPPED"
        echo "   -> Total im Kernel: $COUNT_AFTER"
        
    else
        echo "$(date "+%Y-%m-%d %H:%M:%S") - FEHLER: IPSet '$SET_NAME' existiert nicht."
    fi
else
    echo "$(date "+%Y-%m-%d %H:%M:%S") - FEHLER: Konnte die Blocklist nicht herunterladen."
fi

# 4. Aufräumen
/usr/bin/rm -f "$LOCAL_FILE" "$CLEAN_FILE"
User avatar
NicoMSH
Posts: 127
Joined: Sun 1. Jun 2025, 16:54
Location: nähe Halle

Re: Länder IP Ban mit Fail2Ban, KeyHelp und Static Files

Post by NicoMSH »

verbesserte live_status.sh (genaueres auslesen und Fehlerbehebeung beim umrechnen in KB, MB und GB

Code: Select all

#!/usr/bin/bash

STATUS_FILE="/root/banip/f2b_status.txt"
COUNTER_CACHE="/root/banip/.daily_bytes_start"
TODAY=$(date '+%Y-%m-%d')

# 1. IP-Anzahl auslesen
IP_COUNT=$(ipset list f2b-iplistblock 2>/dev/null | grep "Number of entries" | awk '{print $4}')
[ -z "$IP_COUNT" ] && IP_COUNT="0"

# 2. Pakete normal auslesen, Bytes EXAKT (ohne K/M Kürzung von iptables)
IPTABLES_STATS=$(iptables -L INPUT -v -n | grep iplistblock)
PACKETS=$(echo "$IPTABLES_STATS" | awk '{print $1}')
[ -z "$PACKETS" ] && PACKETS="0"

# Exakte Bytes holen (mit -x Flag für exakte Zahlen)
BYTES=$(iptables -L INPUT -v -n -x | grep "f2b-iplistblock" | awk '{print $2}')
[ -z "$BYTES" ] && BYTES="0"

# 3. Tages-Zähler Logik (Speichert garantiert nur reine Zahlen im Cache)
RAW_BYTES="$BYTES"

if [ ! -f "$COUNTER_CACHE" ] || [ "$(cat "$COUNTER_CACHE" | cut -d'|' -f1)" != "$TODAY" ]; then
    echo "$TODAY|$RAW_BYTES" > "$COUNTER_CACHE"
    DAILY_BYTES=0
else
    START_BYTES=$(cat "$COUNTER_CACHE" | cut -d'|' -f2)
    [ -z "$START_BYTES" ] && START_BYTES=0
    # Mathematische Differenz mit reinen Zahlen
    DAILY_BYTES=$((RAW_BYTES - START_BYTES))
    [ "$DAILY_BYTES" -lt 0 ] && DAILY_BYTES=0
fi

# Funktion zur sauberen Formatierung von reinen Byte-Zahlen
format_bytes() {
    local b="$1"
    [ -z "$b" ] || [ "$b" -eq 0 ] 2>/dev/null && echo "0 Bytes" && return

    if [ "$b" -ge 1073741824 ]; then
        awk "BEGIN {printf \"%.2f GB\", $b / 1073741824}"
    elif [ "$b" -ge 1048576 ]; then
        awk "BEGIN {printf \"%.2f MB\", $b / 1048576}"
    elif [ "$b" -ge 1024 ]; then
        awk "BEGIN {printf \"%.2f KB\", $b / 1024}"
    else
        echo "$b Bytes"
    fi
}

READABLE_TOTAL=$(format_bytes "$BYTES")
READABLE_DAILY=$(format_bytes "$DAILY_BYTES")

# 4. In die Status-Datei schreiben (Gesamt + Heute ab 0 Uhr)
echo "IPs: $IP_COUNT | Gesamt: $READABLE_TOTAL | Heute (ab 0 Uhr): $READABLE_DAILY (Pakete: $PACKETS) | Upd: $(date '+%H:%M:%S')" > "$STATUS_FILE"

# Direkt ins KeyHelp-Hauptverzeichnis kopieren
cp /root/banip/f2b_status.txt /home/keyhelp/www/keyhelp/f2b_status.txt
chmod 644 /home/keyhelp/www/keyhelp/f2b_status.txt
User avatar
NicoMSH
Posts: 127
Joined: Sun 1. Jun 2025, 16:54
Location: nähe Halle

Re: Länder IP Ban mit Fail2Ban, KeyHelp und Static Files

Post by NicoMSH »

neue live_status.sh

Änderungen:
  • Datenverkehr Gesamt (grüne Box) und Abgefangene / Blockierte Pakete (rote Box) werden bei einem Serverneustart gespeichert und neu eingelesen nachdem der Server wieder hochgefahren ist
  • Datenverkehr Gesamt (grüne Box) und Abgefangene / Blockierte Pakete (rote Box) werden bei einem Fail2Ban Restart gespeichert und neu eingelesen nachdem Fail2ban wieder normal läuft

Code: Select all

#!/usr/bin/bash

STATUS_FILE="/root/banip/f2b_status.txt"
COUNTER_CACHE="/root/banip/.daily_bytes_start"
PERSIST_FILE="/root/banip/.persistent_total"
TODAY=$(date '+%Y-%m-%d')

# IP-Anzahl auslesen
IP_COUNT=$(ipset list f2b-iplistblock 2>/dev/null | grep "Number of entries" | awk '{print $4}')
[ -z "$IP_COUNT" ] && IP_COUNT="0"

# Pakete und Bytes exakt aus iptables auslesen (nur die erste Regel des IPSets)
IPTABLES_STATS=$(iptables -L INPUT -v -n -x | grep "f2b-iplistblock" | head -n 1)
CURRENT_PACKETS=$(echo "$IPTABLES_STATS" | awk '{print $1}')
CURRENT_BYTES=$(echo "$IPTABLES_STATS" | awk '{print $2}')

[ -z "$CURRENT_PACKETS" ] && CURRENT_PACKETS="0"
[ -z "$CURRENT_BYTES" ] && CURRENT_BYTES="0"

# --- PERSISTENZ-SICHERUNG (Überlebt Fail2Ban- & Server-Neustarts) ---
if [ ! -f "$PERSIST_FILE" ]; then
    echo "0|0|0|0" > "$PERSIST_FILE"
fi

SAVED_DATA=$(cat "$PERSIST_FILE")
OFFSET_BYTES=$(echo "$SAVED_DATA" | cut -d'|' -f1)
OFFSET_PACKETS=$(echo "$SAVED_DATA" | cut -d'|' -f2)
LAST_KERNEL_BYTES=$(echo "$SAVED_DATA" | cut -d'|' -f3)
LAST_KERNEL_PACKETS=$(echo "$SAVED_DATA" | cut -d'|' -f4)

[ -z "$OFFSET_BYTES" ] && OFFSET_BYTES=0
[ -z "$OFFSET_PACKETS" ] && OFFSET_PACKETS=0
[ -z "$LAST_KERNEL_BYTES" ] && LAST_KERNEL_BYTES=0
[ -z "$LAST_KERNEL_PACKETS" ] && LAST_KERNEL_PACKETS=0

# Wenn der Kernel-Zähler kleiner ist als beim letzten Mal, gab es einen Reset/Neustart!
if [ "$CURRENT_BYTES" -lt "$LAST_KERNEL_BYTES" ]; then
    OFFSET_BYTES=$((OFFSET_BYTES + LAST_KERNEL_BYTES))
    OFFSET_PACKETS=$((OFFSET_PACKETS + LAST_KERNEL_PACKETS))
fi

# Gesamtsummen (Aktueller Kernel-Wert + kumulierter Offset)
BYTES=$((CURRENT_BYTES + OFFSET_BYTES))
PACKETS=$((CURRENT_PACKETS + OFFSET_PACKETS))

# Für den nächsten Durchlauf speichern
echo "$OFFSET_BYTES|$OFFSET_PACKETS|$CURRENT_BYTES|$CURRENT_PACKETS" > "$PERSIST_FILE"
# -----------------------------------------------------------------

# Tages-Zähler Logik (für die gelbe Box "Heute")
RAW_BYTES="$BYTES"

if [ ! -f "$COUNTER_CACHE" ] || [ "$(cat "$COUNTER_CACHE" | cut -d'|' -f1)" != "$TODAY" ]; then
    echo "$TODAY|$RAW_BYTES" > "$COUNTER_CACHE"
    DAILY_BYTES=0
else
    START_BYTES=$(cat "$COUNTER_CACHE" | cut -d'|' -f2)
    [ -z "$START_BYTES" ] && START_BYTES=0
    DAILY_BYTES=$((RAW_BYTES - START_BYTES))
    [ "$DAILY_BYTES" -lt 0 ] && DAILY_BYTES=0
fi

# Funktion zur sauberen Formatierung von reinen Byte-Zahlen
format_bytes() {
    local b="$1"
    [ -z "$b" ] || [ "$b" -eq 0 ] 2>/dev/null && echo "0 Bytes" && return

    if [ "$b" -ge 1073741824 ]; then
        awk "BEGIN {printf \"%.2f GB\", $b / 1073741824}"
    elif [ "$b" -ge 1048576 ]; then
        awk "BEGIN {printf \"%.2f MB\", $b / 1048576}"
    elif [ "$b" -ge 1024 ]; then
        awk "BEGIN {printf \"%.2f KB\", $b / 1024}"
    else
        echo "$b Bytes"
    fi
}

READABLE_TOTAL=$(format_bytes "$BYTES")
READABLE_DAILY=$(format_bytes "$DAILY_BYTES")

# In die Status-Datei schreiben
echo "IPs: $IP_COUNT | Gesamt: $READABLE_TOTAL | Heute (ab 0 Uhr): $READABLE_DAILY (Pakete: $PACKETS) | Upd: $(date '+%H:%M:%S')" > "$STATUS_FILE"

# Direkt ins KeyHelp-Hauptverzeichnis kopieren
cp /root/banip/f2b_status.txt /home/keyhelp/www/keyhelp/f2b_status.txt
chmod 644 /home/keyhelp/www/keyhelp/f2b_status.txt
User avatar
Tobi
Community Moderator
Posts: 3775
Joined: Thu 5. Jan 2017, 13:24

Re: Länder IP Ban mit Fail2Ban, KeyHelp und Static Files

Post by Tobi »

Kleine Idee…
Poste deine Aktualisierungen als Anhang.
Dann kann man die aktuelle Version mit wget ganz leicht downloaden.
Gruß,
Tobi


-----------------------------
wewoco.de
Das Forum für Reseller, Digital-Agenturen, Bildschirmarbeiter und Mäuseschubser
User avatar
NicoMSH
Posts: 127
Joined: Sun 1. Jun 2025, 16:54
Location: nähe Halle

Re: Länder IP Ban mit Fail2Ban, KeyHelp und Static Files

Post by NicoMSH »

Tobi wrote: ↑Tue 10. Nov 2026, 21:13 Kleine Idee…
Poste deine Aktualisierungen als Anhang.
Dann kann man die aktuelle Version mit wget ganz leicht downloaden.
ahhh auch ne möglichkeit. man kann ja nach einiger zeit nicht mehr editieren^^ Danke für den Vorschlag :)
Hab gleich eine neuerung eingebaut.

loadlist.sh (10.11.2026)
  • [NEU] Botnetze per FireHOL-Liste hinzugefügt
  • [NEU] Datenverkehr Gesamt (grüne Box) und Abgefangene / Blockierte Pakete (rote Box) werden bei einem Serverneustart gespeichert und neu eingelesen nachdem der Server wieder hochgefahren ist
  • [NEU] Datenverkehr Gesamt (grüne Box) und Abgefangene / Blockierte Pakete (rote Box) werden bei einem Fail2Ban Restart gespeichert und neu eingelesen nachdem Fail2ban wieder normal läuft
live_status.sh
keine Änderung

Anleitung: viewtopic.php?p=60218#p60218
____________________________________
loadlist_und_livestatus.zip
(2.74 KiB) Downloaded 2 times
User avatar
NicoMSH
Posts: 127
Joined: Sun 1. Jun 2025, 16:54
Location: nähe Halle

Re: Länder IP Ban mit Fail2Ban, KeyHelp und Static Files

Post by NicoMSH »

Oh ganz vergessen. damit die neuen Botnetze mit in den Kernel können und ihr den server nicht neustarten müsst, sind folgende Befehle nötig, sonst werdet ihr mit Fehlermeldungen zugebommt :p
Dazu müssen wir das ipset von hash:ip auf hash:net stellen

Befehle nacheinander ausführen:

IPTables-Regel vorübergehend lösen

Code: Select all

iptables -D INPUT -m set --match-set f2b-iplistblock src -j DROP
(Falls du früher eine REJECT-Regel statt DROP hattest, suche mit iptables-save | grep f2b-iplistblock nach der genauen Regel und lösche diese.)

Altes IPSet zerstören (Speicher im Kernel freigeben)

Code: Select all

ipset destroy f2b-iplistblock
Neues IPSet mit Netz-Unterstützung anlegen

Code: Select all

ipset create f2b-iplistblock hash:net -exist
Setze die Regel

Code: Select all

iptables -I INPUT -m set --match-set f2b-iplistblock src -j DROPt
Führe nun das neue angepasstes Skript aus, das sowohl die Einzel-IPs (AbuseIPDB) als auch die großen Botnetz-Blöcke (FireHOL) herunterlädt und einträgt

Code: Select all

/usr/bin/bash /root/banip/loadlist.sh
_______________________________________________
loadlist.sh_livestatus.sh.zip
(2.87 KiB) Downloaded 2 times
User avatar
24unix
Posts: 2290
Joined: Sun 21. Jun 2020, 17:16
Location: Kollmar
Contact:

Re: Länder IP Ban mit Fail2Ban, KeyHelp und Static Files

Post by 24unix »

NicoMSH wrote: ↑Tue 10. Nov 2026, 22:09 ahhh auch ne möglichkeit. man kann ja nach einiger zeit nicht mehr editieren^^ Danke für den Vorschlag :)
Attachments auch nicht.

Warum nicht einfach einen Link auf Dein/irgendein Git?
Cheers Micha
--
Backup: The duplicate copy of crucial data that no one bothered to make;
used only in the abstract

https://24unix.net
User avatar
NicoMSH
Posts: 127
Joined: Sun 1. Jun 2025, 16:54
Location: nähe Halle

Re: Länder IP Ban mit Fail2Ban, KeyHelp und Static Files

Post by NicoMSH »

24unix wrote: ↑Tue 10. Nov 2026, 23:11
NicoMSH wrote: ↑Tue 10. Nov 2026, 22:09 ahhh auch ne möglichkeit. man kann ja nach einiger zeit nicht mehr editieren^^ Danke für den Vorschlag :)
Attachments auch nicht.

Warum nicht einfach einen Link auf Dein/irgendein Git?
habe kein git oder dergleichen.


Änderung der loadlist.sh

[NEU] es kann passieren, dass die FireHOL-Liste IP-Bereiche das gesamte Loopback- oder Class-A-Netzwerk im Bereich 127.0.0.0/8 und aus dem privaten/Docker-Netzwerk (Standard-IP-Brücke 172.17.0.1 oder angrenzende Bereiche) mitverschluckt oder dass Docker-interne Ports durch die Firewall abgewürgt werden. Das neue Update enthält jetzt eine Filterregel, die lokale Netze (127.0.0.0/8, 10.0.0.0/8, etc.) und auch Docker (sowohl 127. als auch 172.16. / 172.17.) rigoros aus der Import-Datei rausfiltert und ausschliesst.

Falls dies geschehen sein sollte, müssen einmalig diese befehle ausgeführt werden:

Prüfe ob Deine lokale IP versehentlich gesperrt wurde:
Docker

Code: Select all

ipset test f2b-iplistblock 172.17.0.1
Lokale IP

Code: Select all

ipset test f2b-iplistblock 127.0.0.1
steht dort "172.17.0.1 is in set f2b-iplistblock." und/oder "127.0.0.1 is in set f2b-iplistblock."
müsst ihr folgende Befehle einmal ausführen:

Entfernt alle Einträge aus dem Kernel

Code: Select all

ipset flush f2b-iplistblock
Fügt alle Einträge wieder hinzu (mit den neuen Ausnahmen)

Code: Select all

/usr/bin/bash /root/banip/loadlist_2.sh
Testet jetzt nocheinmal ob die IP's gesperrt sind

Docker

Code: Select all

ipset test f2b-iplistblock 172.17.0.1
Lokale IP

Code: Select all

ipset test f2b-iplistblock 127.0.0.1
in beiden Fällen sollte jetzt "172.17.0.1 is NOT in set f2b-iplistblock." und/oder "127.0.0.1 is NOT in set f2b-iplistblock."
_______________________________________
Wer jetzt noch aus reiner Neugierde Live verfolgen will wie die Bots geblockt werden kann folgendes tun:
Kurzzeitig eine Firewallregel hinzufügen

Code: Select all

iptables -I INPUT 1 -m set --match-set f2b-iplistblock src -j LOG --log-prefix "[FIREWALL-BLOCK] " --log-level 4
jetzt könnt ihr mit

Code: Select all

tail -f /var/log/kern.log | grep --line-buffered "FIREWALL-BLOCK"
live Verfolgen was alles geblockt wird.

:!: Lass das Logging am besten nicht tagelang im Dauermodus laufen, da bei massiven Angriffen das Logfile (kern.log) schnell anwachsen kann. Du kannst die Logging-Regel wenn Du genug gesehen hast ganz einfach wieder entfernen mit

Code: Select all

iptables -D INPUT -m set --match-set f2b-iplistblock src -j LOG --log-prefix "[FIREWALL-BLOCK] " --log-level 4
_______________________________________
loadlist.sh_live_status.sh.zip
(3.03 KiB) Downloaded 2 times
User avatar
24unix
Posts: 2290
Joined: Sun 21. Jun 2020, 17:16
Location: Kollmar
Contact:

Re: Länder IP Ban mit Fail2Ban, KeyHelp und Static Files

Post by 24unix »

NicoMSH wrote: ↑Wed 11. Nov 2026, 08:52 habe kein git oder dergleichen.
GitLab, Codeberg, oder Gitea selber hosten.
Für Gitea habe ich *.deb Pakete.
Cheers Micha
--
Backup: The duplicate copy of crucial data that no one bothered to make;
used only in the abstract

https://24unix.net
Post Reply