Firewall-Check fuer den Dashboard-Port einbauen

- firewall-check.sh (auch ./setup.sh firewall): prueft Listener, Container-
  Portweiterleitung (DNAT), ip_forward, firewalld, ufw/ufw-docker, iptables
  (INPUT, DOCKER-USER), natives nftables, CSF, Shorewall und lokalen HTTPS-Test
- Legt fehlende Regeln an (Rueckfrage, --yes ohne, --check nur pruefen);
  Podman: podman network reload --all bei fehlender Weiterleitung
- Erkennt "TCP offen, aber kein HTTPS" (conmon haelt Port nur reserviert)
- setup.sh: kein firewall-cmd --reload mehr (loescht ggf. Container-Regeln),
  up ruft stattdessen den Firewall-Check auf
- README: Abschnitt Firewall-Check

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
duffyduck
2026-10-07 13:34:44 +02:00
co-authored by Claude Opus 5.5
parent e6aad53fb5
commit 174c10505a
3 changed files with 380 additions and 15 deletions
+35 -1
View File
@@ -69,7 +69,7 @@ Voraussetzungen: Docker **oder** Podman, ca. 8 GB RAM frei, ca. 10 GB Platz für
Als root (`sudo ./setup.sh ...`) passt das Skript das System zusätzlich an:
- `vm.max_map_count=262144` (dauerhaft in `/etc/sysctl.d/99-wazuh.conf`)
- firewalld: Port für das Dashboard freigeben
- Firewall-Check: Dashboard-Port prüfen und fehlende Regeln anlegen (siehe unten)
- Podman: `podman-restart.service` aktivieren, damit der Stack nach einem Reboot startet
Ohne root gibt es dafür nur Hinweise. Mit `WAZUH_SKIP_SYSCTL=1` bleibt der Kernel-Parameter
@@ -147,6 +147,38 @@ Der erste Start dauert 1–3 Minuten, bis der Indexer bereit ist.
erzeugt. Der Manager schreibt seine Agentless- und Localfile-Konfiguration beim Start aus
`hosts.yml` neu (`manager/generate.py`).
## Dashboard nicht erreichbar? Firewall-Check
```bash
sudo ./setup.sh firewall # = sudo ./firewall-check.sh (prüft, fragt vor Änderungen)
sudo ./setup.sh firewall --yes # fehlende Regeln ohne Rückfrage anlegen
./setup.sh firewall --check # nur prüfen
```
Geprüft wird der Dashboard-Port aus `.env` (anderer Port: `--port N`, Dienst ohne HTTPS: `--tcp`):
| Prüfung | Automatische Behebung |
|---|---|
| Lauscht etwas auf dem Port (nicht nur auf 127.0.0.1)? | – |
| Container-Portweiterleitung (DNAT) vorhanden? | Podman: `podman network reload --all`. Docker: nur Hinweis, weil `systemctl restart docker` alle Container neu startet. |
| `net.ipv4.ip_forward` | einschalten (dauerhaft) |
| firewalld (Zone des Interfaces mit Default-Route) | Port freigeben, sofort und dauerhaft, **ohne** `--reload` |
| ufw, auch ufw-docker | `ufw allow` bzw. `ufw route allow` |
| iptables (INPUT-Policy, DOCKER-USER) | ACCEPT-Regel. Wird gespeichert, wenn netfilter-persistent oder iptables-services vorhanden ist. |
| natives nftables (eigene `input`-Kette mit drop) | `nft insert rule …` (dauerhaft selbst in nftables.conf eintragen) |
| CSF, Shorewall | erkennen, nur Hinweis |
| Lokaler HTTPS-Test (localhost und Server-IP) | – |
**Typischer Fall „netstat zeigt den Port, aber nichts kommt an“:** Bei Podman hält `conmon`
den Port reserviert, auch wenn die Portweiterleitung fehlt. Das passiert z. B., wenn die
Firewall nach dem Container-Start neu geladen wurde (`firewall-cmd --reload`, Neustart von
iptables/nftables). Der Check erkennt das am fehlenden DNAT bzw. an „TCP offen, aber kein
HTTPS“ und lädt die Podman-Regeln neu.
`./setup.sh up` ruft den Check nach dem Start automatisch auf, als root mit `--yes`. Sperren
außerhalb des Servers (Cloud-Firewall, Proxmox-Firewall, Netzwerk-Firewall) kann er nicht
sehen. Dafür von einem anderen Rechner testen: `curl -kI https://<server>:443`
## Wo finde ich die Daten im Dashboard?
Per SSH geholte Logs und Agentless-Ergebnisse laufen **über den Manager**. Im Dashboard
@@ -180,6 +212,8 @@ Ports 1514 und 1515 sind nicht nach außen veröffentlicht. Nur der Collector er
| Pfad | Zweck |
|---|---|
| `hosts.yml` | Die einzige Stelle für Hosts und Optionen |
| `setup.sh` | Einrichtung und Betrieb (erkennt Docker/Podman) |
| `firewall-check.sh` | Erreichbarkeit des Dashboard-Ports prüfen und reparieren |
| `docker-compose.yml` | Stack. Nach außen geht nur das Dashboard (`DASHBOARD_PORT`) |
| `.env` | Version, Zeitzone, Passwörter (von `setup.sh` erzeugt, nicht committen) |
| `ssh/` | `id_ed25519` (privater Schlüssel, nicht committen), `known_hosts` |