Firewall: Ports auch wieder zumachen

"firewall open" kannte nur eine Richtung. Wer die Event Console wieder
abschaltet oder einen Eintrag aus FW_EXTRA_PORTS streicht, behielt die
Freigabe - der Port stand offen, ohne dass noch etwas dahinter lauscht.

"firewall close" bietet an, was offen ist, zu diesem Aufbau gehoert und
gerade nicht gebraucht wird. Dazu zaehlen die bekannten Ports des Stacks
und alles, was "firewall open --apply" selbst geoeffnet hat; das merkt
sich firewall-opened.conf, damit ein gestrichener FW_EXTRA_PORTS-Eintrag
nicht in Vergessenheit geraet.

Drei Sicherungen, weil hier das Aussperren droht:

  - SSH wird nie geschlossen: Port 22, der Port aus "sshd -T" und der
    Port der laufenden Sitzung aus SSH_CONNECTION
  - fremde Freigaben bleiben unberuehrt - wer 3306 fuer seine Datenbank
    offen hat, behaelt sie
  - Sammelregeln wie "80,443/tcp" werden gemeldet statt geloescht, sonst
    faellt ein noch gebrauchter Port mit weg

Bei ufw wird bewusst nicht nach Regelnummern geloescht. Die Nummern
verschieben sich beim ersten Loeschen, und da je Port ein eigener
Aufruf erzeugt wird, haette der naechste die falsche Regel getroffen -
im Test waere so eine 443er-Freigabe gefallen. Geloescht wird ueber die
Regelangabe, bei nftables ueber den Handle, bei iptables mit derselben
Angabe, mit der die Regel eingetragen wurde.

Nebenbei: fw_state_del liess die Datei stehen, wenn der letzte Eintrag
entfernt wurde - "grep -v" liefert dann 1. Unter "set -e" brach damit
ausserdem der Ablauf ab, noch vor dem Neuladen der Firewall.

In der Oberflaeche liegt das unter Einstellungen > Firewall als
"Nicht mehr benoetigte Ports schliessen".

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-20 20:40:02 +02:00
co-authored by Claude Opus 5
parent 59304ae02d
commit 06ae4807ba
4 changed files with 420 additions and 7 deletions
+36 -1
View File
@@ -1997,6 +1997,41 @@ anlegt.
80 nicht: Let's Encrypt prüft die Domain von außen, eine Begrenzung lässt die
Ausstellung scheitern. Darauf weist der Bericht hin.
### Wieder zumachen
`firewall open` kennt nur eine Richtung. Schaltet man die Event Console wieder
ab oder streicht einen Eintrag aus `FW_EXTRA_PORTS`, bleibt die Freigabe
stehen – der Port ist offen, ohne dass noch etwas dahinter lauscht. Dafür gibt
es die Gegenrichtung:
```bash
./scripts/cmk-manage.sh firewall close # Kommandos nur anzeigen
sudo ./scripts/cmk-manage.sh firewall close --apply
```
Angeboten wird nur, was **offen ist, zu diesem Aufbau gehört und gerade nicht
gebraucht wird**. Dazu zählen die Ports aus der Tabelle oben und alles, was
`firewall open --apply` selbst geöffnet hat – das merkt sich das Werkzeug in
`firewall-opened.conf`, damit ein gestrichener `FW_EXTRA_PORTS`-Eintrag nicht
in Vergessenheit gerät.
Drei Sicherungen sind eingebaut:
| | |
|---|---|
| **SSH bleibt offen** | Port 22, der Port, auf dem `sshd` wirklich lauscht (aus `sshd -T`), und der Port der laufenden Sitzung (`SSH_CONNECTION`) |
| **Fremde Freigaben bleiben** | Wer 3306 für seine Datenbank offen hat, behält sie – geschlossen wird nur, was dieser Aufbau kennt |
| **Sammelregeln bleiben** | Eine Regel wie `80,443/tcp` deckt mehrere Ports ab; sie wird nicht angefasst, sondern gemeldet |
Bei ufw wird dabei bewusst **nicht** nach Regelnummern gelöscht: die
verschieben sich beim ersten Löschen, der nächste Aufruf träfe die falsche
Regel. Stattdessen wird über die Regelangabe gelöscht
(`ufw delete allow 514/udp`), bei nftables über den Handle und bei iptables mit
derselben Regelangabe, mit der sie eingetragen wurde.
In der Oberfläche liegt das unter **Einstellungen → Firewall → Nicht mehr
benötigte Ports schließen**.
> **Docker und ufw:** Veröffentlichte Container-Ports umgehen ufw sonst über die
> `DOCKER-USER`-Kette. Hier nicht – beide Container laufen im Host-Netz, es
> gelten die Hostregeln unverändert.
@@ -2261,7 +2296,7 @@ Eine Dateiauswahl mit Verzeichnisnavigation ist eingebaut.
| `npm-reset` | Datenbank beiseitelegen, damit das Konto neu entsteht |
| `proxy status\|list\|certs\|add\|del` | Proxy-Hosts über die API anlegen und verwalten |
| `cert …` | selbstsigniertes Zertifikat erzeugen |
| `firewall [check\|open]` | prüfen, ob die benötigten Ports offen sind (firewalld, ufw, nftables, iptables) |
| `firewall [check\|open\|close]` | prüfen, öffnen und nicht mehr Benötigtes wieder schließen (firewalld, ufw, nftables, iptables) |
| `shell` | Root-Shell im Checkmk-Container |
| `omd …` | beliebiges `omd`-Kommando im Container |