Initial commit

This commit is contained in:
Thorsten committed 2026-05-12 15:51:17 +02:00
commit bab3ac4cc4
3 files changed
+195

No files matched your search

+37
View File
@@ -0,0 +1,37 @@
# f2b-docker-unblock
Kleines CLI-Tool zum schnellen **Entbannen aller IPs in allen Fail2Ban-Jails** – optimiert für Docker-Setups (z. B. mit Traefik).
---
## ✨ Features
- 🔓 Entfernt **alle gebannten IPs** aus allen Jails
- 🐳 Unterstützt **Fail2Ban im Docker-Container**
- 🔍 Erkennt Container automatisch (oder manuell übergeben)
- ✅ Verifiziert, ob Unban erfolgreich war
- 💬 Klare, farbige Ausgabe mit Emojis
- 🛡️ Fehlerresistent (bricht nicht bei Einzelproblemen ab)
---
## 📦 Installation
### 1. Script speichern
Empfohlener Speicherort:
```bash
/usr/local/bin/f2b-docker-unblock
```
### 1. Script ausführbar machen
```bash
chmod +x /usr/local/bin/f2b-docker-unblock
```
## 📦 Ausführen
```bash
f2b-docker-unblock [optional FAIL2BAN_CONTAINER]
```
+61
View File
@@ -0,0 +1,61 @@
#!/usr/bin/env bash
set -euo pipefail
CACHE_FILE="/tmp/f2b-container"
resolve_container() {
# 1. Versuch: Compose Label
local c
c=$(docker ps \
--filter "label=com.docker.compose.service=fail2ban" \
--format '{{.Names}}' \
| head -n 1)
if [[ -n "$c" ]]; then
echo "$c"
return
fi
# 2. Fallback: Kandidaten
local CANDIDATES=("fail2ban" "fail-2-ban" "f2b")
for name in "${CANDIDATES[@]}"; do
if docker ps --format '{{.Names}}' | grep -qx "$name"; then
echo "$name"
return
fi
done
return 1
}
# --- Cache verwenden ---
if [[ -f "$CACHE_FILE" ]]; then
CONTAINER=$(<"$CACHE_FILE")
# prüfen ob er noch läuft
if ! docker ps --format '{{.Names}}' | grep -qx "$CONTAINER"; then
CONTAINER=""
fi
else
CONTAINER=""
fi
# --- neu auflösen wenn nötig ---
if [[ -z "${CONTAINER:-}" ]]; then
CONTAINER=$(resolve_container || true)
if [[ -z "$CONTAINER" ]]; then
echo "❌ Kein fail2ban-Container gefunden"
exit 1
fi
echo "$CONTAINER" > "$CACHE_FILE"
fi
# --- Aufruf ---
if [[ $# -eq 0 ]]; then
docker exec -i "$CONTAINER" fail2ban-client -h
else
docker exec -i "$CONTAINER" fail2ban-client "$@"
fi
+97
View File
@@ -0,0 +1,97 @@
#!/bin/bash
set -uo pipefail
ok() { echo -e "✅ $1"; }
info() { echo -e "ℹ️ $1"; }
warn() { echo -e "⚠️ $1"; }
err() { echo -e "❌ $1"; }
echo ""
echo "──────────────────────────────────────────────────────────"
# Wenn kein Container angegeben → automatisch suchen
if [[ $# -eq 0 ]]; then
info "Kein fail2ban Container angegeben, versuche Autodetect"
CONTAINER=$(docker ps --format '{{.Names}}' | grep -i fail2ban | head -n1)
if [[ -z "$CONTAINER" ]]; then
err "Kein Fail2Ban Container gefunden"
echo "──────────────────────────────────────────────────────────"
exit 1
else
info "Container gefunden"
fi
else
CONTAINER="$1"
# Existiert der Container überhaupt?
if ! docker ps -a --format '{{.Names}}' | grep -Fxq "$CONTAINER"; then
err "Container '$CONTAINER' existiert nicht"
echo "──────────────────────────────────────────────────────────"
exit 1
fi
# Läuft der Container?
if ! docker ps --format '{{.Names}}' | grep -Fxq "$CONTAINER"; then
err "Container '$CONTAINER' läuft nicht"
echo "──────────────────────────────────────────────────────────"
exit 1
fi
fi
info "Verwende Container: $CONTAINER"
echo "──────────────────────────────────────────────────────────"
echo ""
JAILS=$(docker exec "$CONTAINER" fail2ban-client status \
| awk -F: '/Jail list/ {print $2}' | xargs)
IFS=',' read -ra JAIL_ARRAY <<< "$JAILS"
for JAIL in "${JAIL_ARRAY[@]}"; do
JAIL=$(echo "$JAIL" | xargs)
IPS=$(docker exec "$CONTAINER" fail2ban-client status "$JAIL" \
| awk -F: '/Banned IP list/ {print $2}' | xargs)
if [[ -z "$IPS" ]]; then
ok "$JAIL → keine Bans"
continue
fi
info "🔓 $JAIL → entbanne: $IPS"
COUNT=0
FAILED=0
for IP in $IPS; do
if docker exec "$CONTAINER" fail2ban-client set "$JAIL" unbanip "$IP" >/dev/null 2>&1; then
((COUNT++))
else
((FAILED++))
warn "$JAIL → konnte $IP nicht entbannen"
fi
done
REMAINING=$(docker exec "$CONTAINER" fail2ban-client status "$JAIL" \
| awk '/Currently banned/ {print $4}')
if [[ "$REMAINING" == "0" ]]; then
ok "$JAIL → $COUNT IP(s) entfernt"
else
err "$JAIL → $REMAINING IP(s) noch gebannt"
fi
done
echo ""
echo "──────────────────────────────────────────────────────────"
ok "Fertig."
echo "──────────────────────────────────────────────────────────"