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

Für Modifikationen in und um KeyHelp.
User avatar
NicoMSH
Posts: 123
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: 123
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
Post Reply