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

Für Modifikationen in und um KeyHelp.
User avatar
NicoMSH
Posts: 126
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: 126
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: 126
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: 126
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 1 time
User avatar
NicoMSH
Posts: 126
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 1 time
User avatar
24unix
Posts: 2289
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
Post Reply