
Multi-Host-UFW-Firewall-Dashboard — erklärt Regeln in einfachem Englisch, erkennt Sicherheitslücken und bietet Verbindungsdiagnosen
Multi-Host-UFW-Firewall-Dashboard. Verbindet sich per SSH zu Linux-Hosts, analysiert Firewall-Regeln und lauschende Ports, erklärt alles in einfacher Sprache und weist auf Sicherheitslücken hin.

| Route | Description |
|---|---|
/ | Übersichts-Dashboard mit Host-Karten, Dienst-Pills und Lückenzählern |
Browser --> Cloudflare Tunnel --> Reverse Proxy --> FencePost (:8890)
FastAPI container
|-- SSH --> Host 1 (ufw status, ss -tlnp)
|-- SSH --> Host 2
|-- SSH --> Host N
'-- POST --> Notification webhook
FencePost ist schreibgeschützt – es ändert nie Firewall-Regeln, sondern berichtet nur darüber.
<user> ALL=(ALL) NOPASSWD: /usr/sbin/ufw status verbose, /usr/sbin/ufw status numbered, /usr/bin/ss -tlnp
git clone <repo-url> && cd fencepost
# Add your SSH key
cp ~/.ssh/your_key ssh/id_ed25519
chmod 600 ssh/id_ed25519
# Create your environment file from the template
cp .env.example .env
# Edit .env with real credentials
timezone: Australia/Melbourne
hosts:
- name: My Server
hostname: 192.168.1.10
ssh_user: deploy
ssh_port: 22
is_docker_host: false
networks:
"192.168.1.0/24": "LAN"
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
# Load env vars (bash/zsh)
export $(grep -v '^#' .env | xargs)
uvicorn app.main:app --reload --port 8890
Öffne http://localhost:8890.
Hinweis: Im lokalen Modus wird der SSH-Schlüssel unter dem in config.yaml angegebenen Pfad (ssh.key_path) verwendet. Für die lokale Entwicklung kannst du dies überschreiben, um auf dein lokales ssh/id_ed25519 zu verweisen:
ssh:
key_path: ssh/id_ed25519
timeout: 10
docker compose up -d --build
Öffne http://localhost:8890. Der Container liest die Anmeldedaten automatisch über compose.yaml aus .env.
Anmeldedaten werden in .env gespeichert (gitignored) und von compose.yaml referenziert. Übertrage niemals Geheimnisse in das Repository.
app/
main.py # FastAPI routes and auth
models.py # HostFirewallState, UFWRule, ListeningPort dataclasses
parser.py # Parses ufw status and ss output
explainer.py # Translates rules to plain English
diagnose.py # Connection diagnostic engine
gap_detector.py # Finds uncovered listening ports
ssh_client.py # Paramiko wrapper, parallel host fetching
eventfeed.py # Change detection and webhook posting
templates/
base.html # Layout, CSS, navigation
overview.html # Host dashboard grid
host_detail.html # Per-host tabbed detail view
diagnose.html # Connection diagnostic form and results
login.html # Authentication page
config.yaml # Host definitions, VLANs, devices, timezone
compose.yaml # Docker Compose service definition
Dockerfile # Python 3.12 slim image
.env.example # Template for environment variables
ssh/ # SSH key directory (key not committed)
data/ # Runtime state (last_state.json, not committed)
config.yaml unter hosts: hinzussh-copy-id -i ssh/id_ed25519.pub user@host/etc/sudoers.d/fencepost auf dem Host mit den erforderlichen NOPASSWD-Regelndocker compose up -d --buildWenn in config.yaml mit einer NOTIFICATIONS_API_KEY-Umgebungsvariable konfiguriert, sendet FencePost bei jeder Dashboard-Aktualisierung Änderungsereignisse:
Die Ereignisse enthalten Idempotenzschlüssel, um Duplikate zu vermeiden.
MIT
/host/{name} | Host-Details mit Tab-Ansicht: erklärte Regeln, ungeschützte Ports, lauschende Ports, Rohausgabe |
/diagnose | Verbindungsdiagnose-Tool mit Regel-für-Regel-Trace-Visualisierung |
/login | Sitzungsbasierte Authentifizierung |
| Section | Purpose |
|---|
timezone | IANA-Zeitzone für angezeigte Zeitstempel (z. B. Australia/Melbourne, UTC) |
hosts | Array von SSH-Zielen: name, hostname, ssh_user, ssh_port, is_docker_host |
ssh | key_path (Pfad zum privaten Schlüssel) und timeout in Sekunden |
networks | CIDR-zu-Name-Zuordnung für VLANs – wird in Regelerklärungen und Diagnosen verwendet |
devices | Benannte IPs für die Schnellauswahl-Schaltflächen der Diagnoseseite |
notifications | Optionaler Webhook: url, channel (API-Schlüssel per Umgebungsvariable gesetzt) |
| Variable | Default | Description |
|---|
FENCEPOST_USERNAME | admin | Anmelde-Benutzername |
FENCEPOST_PASSWORD | fencepost | Anmelde-Passwort |
FENCEPOST_SECRET_KEY | change-me | Signaturschlüssel für Session-Cookies |
FENCEPOST_CONFIG | config.yaml | Pfad zur Konfigurationsdatei |
NOTIFICATIONS_API_KEY | Bearer-Token für den Benachrichtigungs-Webhook |