Initial commit
This commit is contained in:
commit
bab3ac4cc4
3 files changed
+195
No files matched your search
@@ -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
@@ -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
|
||||
@@ -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 "──────────────────────────────────────────────────────────"
|
||||
Reference in new issue
Block a user