Menuepunkt: Firewall-Regeln uebernehmen

Der Bericht sagte bisher nur, was fehlt - gesetzt wurde es entweder auf
der Kommandozeile mit "firewall open --apply" oder gar nicht. Unter
Einstellungen > Firewall stehen jetzt zwei Aktionen: pruefen und
uebernehmen.

Beim Uebernehmen wird zuerst nach einem Quellnetz gefragt und erst
danach angezeigt, was ausgefuehrt wird. Die Reihenfolge ist Absicht -
das Quellnetz aendert die Kommandos, und was im Fenster steht, soll
auch das sein, was laeuft. Ohne root-Rechte wird ueber sudo neu
aufgerufen; zum Schluss zeigt die Oberflaeche den Stand danach.

Dabei zwei Dinge in Ordnung gebracht:

  - cmd_firewall gab auch nach erfolgreichem Uebernehmen noch 1 zurueck
    (den urspruenglichen Befund). Die Oberflaeche las das als
    "FEHLGESCHLAGEN", obwohl die Regeln gesetzt waren.
  - Die aktiven Zonen werden einmal je Aufruf ermittelt statt erneut
    fuer jede Regelzeile.

Die FW_*-Schluessel fehlen in einer aelteren .env noch; im Menue steht
dann <leer>. Die Beschriftungen nennen deshalb die Vorgabe, die in dem
Fall gilt.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-20 20:01:12 +02:00
co-authored by Claude Opus 5
parent b912578f27
commit 989256e082
3 changed files with 86 additions and 16 deletions
+16 -1
View File
@@ -1889,7 +1889,22 @@ Ausstellung scheitern. Darauf weist der Bericht hin.
In der Oberfläche steckt derselbe Bericht unter **Firewall prüfen**, samt
Rückfrage, ob die fehlenden Freigaben gleich gesetzt werden sollen. Die
Schalter dazu liegen unter **Einstellungen → Firewall: was offen sein muss**.
Schalter liegen unter **Einstellungen → Firewall: was offen sein muss**, und
dort stehen auch zwei Aktionen:
| Menüpunkt | was er tut |
|---|---|
| `>> Firewall jetzt prüfen` | derselbe Bericht wie `firewall check` |
| `>> Firewall-Regeln übernehmen (Ports öffnen)` | fragt erst nach einem Quellnetz, zeigt **danach** die Kommandos, die genau so ausgeführt werden, und setzt sie nach Bestätigung |
Die Reihenfolge ist Absicht: das Quellnetz ändert die Kommandos, deshalb wird
es vor der Anzeige erfragt – was im Fenster steht, wird auch ausgeführt. Ohne
`root` wird über `sudo` neu aufgerufen. Zum Schluss zeigt die Oberfläche den
Stand danach, damit man nicht raten muss, ob es gewirkt hat.
> Sind die `FW_*`-Schlüssel in einer älteren `.env` noch nicht vorhanden, steht
> im Menü `<leer>` – es gelten dann die Vorgaben (`single`, alles aus). Sobald
> ein Wert gesetzt wird, landet der Schlüssel in der `.env`.
### Von Hand
+15 -1
View File
@@ -1882,7 +1882,21 @@ restriction makes issuance fail. The report points this out.
The GUI offers the same report under **Firewall prüfen**, including a prompt to
set the missing rules right away. The switches live under **Einstellungen →
Firewall: was offen sein muss**.
Firewall: was offen sein muss**, which also holds two actions:
| Menu entry | what it does |
|---|---|
| `>> Firewall jetzt pruefen` | the same report as `firewall check` |
| `>> Firewall-Regeln uebernehmen (Ports oeffnen)` | asks for a source network first, **then** shows the commands that will run verbatim, and applies them after confirmation |
The order is deliberate: the source network changes the commands, so it is
asked before they are shown – what you see in the window is what runs. Without
`root` the call is repeated through `sudo`. Afterwards the GUI shows the state
that resulted, so you do not have to guess whether it worked.
> If an older `.env` does not have the `FW_*` keys yet, the menu shows
> `<leer>` – the defaults apply then (`single`, everything off). As soon as a
> value is set, the key is written to `.env`.
### By hand
+55 -14
View File
@@ -2966,11 +2966,11 @@ cert|CERT_DOMAIN|text|FQDN fuer selbstsignierte Zertifikate||
cert|CERT_DAYS|int|Gueltigkeit in Tagen||
cert|CERT_COUNTRY|text|Laenderkuerzel||
cert|CERT_ORG|text|Organisation||
firewall|FW_ROLE|choice|Rolle im verteilten Monitoring|single:central:remote|
firewall|FW_EC_SYSLOG|choice|Event Console: Syslog annehmen (514)|off:udp:tcp:beide|
firewall|FW_EC_SNMPTRAP|choice|Event Console: SNMP-Traps (162/udp)|off:on|
firewall|FW_EC_TCP|choice|Event Console: Status ueber TCP (6558)|off:on|
firewall|FW_AGENT|choice|Checkmk-Agent auf diesem Host (6556)|off:on|
firewall|FW_ROLE|choice|Rolle im verteilten Monitoring (leer = single)|single:central:remote|1
firewall|FW_EC_SYSLOG|choice|Event Console: Syslog 514 (leer = aus)|off:udp:tcp:beide|1
firewall|FW_EC_SNMPTRAP|choice|Event Console: SNMP-Traps 162/udp (leer = aus)|off:on|1
firewall|FW_EC_TCP|choice|Event Console: Status ueber TCP 6558 (leer = aus)|off:on|1
firewall|FW_AGENT|choice|Checkmk-Agent dieses Hosts 6556 (leer = aus)|off:on|1
firewall|FW_EXTRA_PORTS|text|Weitere Ports (3000/tcp=Grafana,...)||1
EOF
}
@@ -4784,6 +4784,8 @@ gui_settings_category() {
items+=("__npm__" ">> Proxy Manager: Stand und Admin-Port anzeigen")
items+=("__npmrst__" ">> Datenbank zuruecksetzen (Konto neu anlegen lassen)") ;;
backup) items+=("__jobs__" ">> Backup-Jobs verwalten") ;;
firewall) items+=("__fwcheck__" ">> Firewall jetzt pruefen")
items+=("__fwapply__" ">> Firewall-Regeln uebernehmen (Ports oeffnen)") ;;
esac
items+=("back" "zurueck")
local sel
@@ -4796,6 +4798,8 @@ gui_settings_category() {
__npmrst__) gui_npm_reset || true; continue ;;
__test__) gui_image_test || true; continue ;;
__jobs__) gui_jobs_menu || true; continue ;;
__fwcheck__) gui_firewall || true; continue ;;
__fwapply__) gui_firewall_apply || true; continue ;;
__npm__) local f; f="$(mktemp)"
{ NO_COLOR=1 cmd_npm_enable; NO_COLOR=1 cmd_npm_port; } >"$f" 2>&1 || true
ui_text "NGINX Proxy Manager" "$f"; rm -f "$f"; continue ;;
@@ -5118,6 +5122,7 @@ gui_cert() {
ui_run "Zertifikat erzeugen" bash -c "cd '$PROJECT_DIR' && '$SELF' cert --domain '$domain' --days '$days' ${a[*]+${a[*]}}"
}
# Bericht anzeigen; fehlt etwas, das Uebernehmen anbieten
gui_firewall() {
local tmp rc=0
tmp="$(mktemp)"
@@ -5131,27 +5136,54 @@ gui_firewall() {
ui_yesno "Firewall" "Es fehlen Freigaben.
Sollen die benoetigten Ports jetzt geoeffnet werden?
Die Regeln werden dauerhaft gesetzt." || return 0
Die benoetigten Ports jetzt oeffnen?" || return 0
gui_firewall_apply
}
local src=""
if ui_yesno "Firewall" "Nur fuer ein bestimmtes Quellnetz freigeben?
# Regeln uebernehmen. Erst wird gefragt, ob auf ein Quellnetz begrenzt
# werden soll - denn davon haengen die Kommandos ab, die danach zur
# Bestaetigung angezeigt werden. Was dort steht, wird auch ausgefuehrt.
gui_firewall_apply() {
local src="" tmp rc=0
if ui_yesno "Firewall-Regeln uebernehmen" "Nur fuer ein bestimmtes Quellnetz freigeben?
Ja = nur dieses Netz darf zugreifen
Nein = Freigabe fuer alle Quellen"; then
src="$(ui_input "Firewall" "Quellnetz in CIDR-Schreibweise:" "$(primary_ip | sed 's/\.[0-9]*$/.0\/24/')")" || src=""
src="$(ui_input "Firewall-Regeln uebernehmen" "Quellnetz in CIDR-Schreibweise:" \
"$(primary_ip | sed 's/\.[0-9]*$/.0\/24/')")" || return 0
[ -n "$src" ] || return 0
fi
local -a a=(firewall open --apply --yes)
if [ -n "$src" ]; then a+=(--source "$src"); fi
local -a opt=(open)
if [ -n "$src" ]; then opt+=(--source "$src"); fi
tmp="$(mktemp)"
cmd_firewall "${opt[@]}" >"$tmp" 2>&1 || rc=$?
if [ "$rc" -eq 0 ]; then
ui_text "Firewall - nichts zu tun" "$tmp"
rm -f "$tmp"; return 0
fi
ui_text "Firewall - diese Regeln werden gesetzt" "$tmp"
rm -f "$tmp"
ui_yesno "Firewall-Regeln uebernehmen" "Die angezeigten Regeln jetzt dauerhaft setzen?" || return 0
local -a a=(firewall "${opt[@]}" --apply --yes)
if [ "$(id -u)" -eq 0 ]; then
ui_run "Firewall freigeben" "$SELF" "${a[@]}" || true
ui_run "Firewall-Regeln uebernehmen" "$SELF" "${a[@]}" || true
elif command -v sudo >/dev/null 2>&1; then
gui_run_interactive sudo -- "$SELF" "${a[@]}"
else
ui_msg "Firewall" "Dafuer werden root-Rechte benoetigt.
Bitte als root erneut aufrufen."
return 0
fi
# Zeigen, was dabei herausgekommen ist
tmp="$(mktemp)"
cmd_firewall check >"$tmp" 2>&1 || true
ui_text "Firewall - Stand danach" "$tmp"
rm -f "$tmp"
return 0
}
@@ -5317,10 +5349,12 @@ fw_detect() {
# sie oft in verschiedenen Zonen - dann sagt die Standardzone allein
# nichts darueber aus, ob ein Port erreichbar ist.
fw_zones() {
if [ -n "${_FW_ZONES:-}" ]; then printf '%s\n' "$_FW_ZONES"; return 0; fi
local z
z="$(firewall-cmd --get-active-zones 2>/dev/null | grep -v '^[[:space:]]' || true)"
if [ -z "$z" ]; then z="$(firewall-cmd --get-default-zone 2>/dev/null || true)"; fi
printf '%s\n' "$z" | sed '/^$/d'
_FW_ZONES="$(printf '%s\n' "$z" | sed '/^$/d')"
printf '%s\n' "$_FW_ZONES"
}
# Dienstnamen von firewalld auf port/protokoll abbilden
@@ -5532,6 +5566,8 @@ cmd_firewall() {
done
local be role; be="$(fw_detect)"
# Zonen einmal ermitteln - sonst fragt jede Regelzeile erneut nach
if [ "$be" = firewalld ]; then _FW_ZONES=""; _FW_ZONES="$(fw_zones)"; fi
role="$(fw_lc "${FW_ROLE:-single}")"
case "$role" in central|remote) : ;; *) role=single ;; esac
@@ -5640,6 +5676,11 @@ cmd_firewall() {
|| warn "Neuladen fehlgeschlagen."
fi
ok "Regeln gesetzt."
echo
# Gesetzt ist gesetzt - der Rueckgabewert darf jetzt nicht mehr
# den urspruenglichen Befund melden, sonst liest die Oberflaeche
# das als fehlgeschlagen.
return 0
else
printf '\n Automatisch setzen: %s firewall open --apply\n' "$SELF"
printf ' Nur fuer ein Netz : %s firewall open --apply --source 10.0.0.0/24\n' "$SELF"