From 682a08b53ef998db4427e44c0a9df9514f6ad1a5 Mon Sep 17 00:00:00 2001 From: Christoph Date: Mon, 29 Jun 2026 08:13:40 +0200 Subject: [PATCH] Refactor extract-fw-host-vars.py to improve quoted value handling and add fw_manage_config to generated YAML; create ipt-server.yml for a.mx.oopen.de with initial configuration --- extract-fw-host-vars.py | 25 +++++++------- host_vars/a.mx.oopen.de/ipt-server.yml | 45 ++++++++++++++++++++++++++ roles/ipt-server/MIGRATION.md | 7 +++- 3 files changed, 64 insertions(+), 13 deletions(-) create mode 100644 host_vars/a.mx.oopen.de/ipt-server.yml diff --git a/extract-fw-host-vars.py b/extract-fw-host-vars.py index 1535874..6b9b5eb 100755 --- a/extract-fw-host-vars.py +++ b/extract-fw-host-vars.py @@ -363,26 +363,24 @@ def parse_bash_config(text): varname = m.group(1) rest = m.group(2).strip() - # Quoted value - if rest.startswith('"'): - # Collect until closing quote (may span multiple lines) - collected = rest[1:] # strip opening " + # Quoted value (single or double quotes, may span multiple lines) + if rest and rest[0] in ('"', "'"): + quote_char = rest[0] + collected = rest[1:] # strip opening quote + parts = [] closed = False - extra_lines = [] while True: - # Check if closing " is in collected - close_pos = collected.find('"') + close_pos = collected.find(quote_char) if close_pos != -1: - value = collected[:close_pos].strip() - if extra_lines: - warnings.append(f" # {varname}: multiline value — verify manually") + parts.append(collected[:close_pos]) + # join all parts; split() collapses whitespace and drops empty lines + value = ' '.join(' '.join(parts).split()) result[varname] = value closed = True break else: - # Value continues on next line - extra_lines.append(collected.strip()) + parts.append(collected) i += 1 if i >= len(lines): break @@ -546,6 +544,9 @@ def render_yaml(hostname, host_vars, all_warnings): "", ] + lines.append("fw_manage_config: false") + lines.append("") + if all_warnings: lines.append("# WARNINGS — manual review needed:") for w in all_warnings: diff --git a/host_vars/a.mx.oopen.de/ipt-server.yml b/host_vars/a.mx.oopen.de/ipt-server.yml new file mode 100644 index 0000000..96258b3 --- /dev/null +++ b/host_vars/a.mx.oopen.de/ipt-server.yml @@ -0,0 +1,45 @@ +--- +# ipt-firewall configuration for a.mx.oopen.de +# Generated by extract-fw-host-vars.py - review before committing! +# Place in: host_vars//ipt_firewall.yml + +fw_manage_config: true + +# --- Network +fw_ext_interfaces: + - "eth0" +fw_ext_ips_v4: + - "95.217.204.247" +fw_ext_ips_v6: + - "2a01:4f9:4a:47e5::247" + +# --- Munin +munin_remote_ipv4: 37.27.121.227 +munin_remote_ipv6: "2a01:4f9:3070:2bda::227" + +# --- HTTP +fw_http_server_ips: $ext_1_ip + +# --- Mail +fw_smtpd_ips: $ext_1_ip +fw_mail_server_ips: $ext_1_ip +fw_mail_client_ips: $ext_1_ip +fw_dovecot_auth_service: true + +# - meet.oopen.de -> 159.69.74.155 +# - meet.akweb.de -> 148.251.14.136 +# - jo.oopen.de -> 94.16.115.62 +# - +# - meet.akweb.de -> 2a01:4f8:201:7389::136 +# - meet.oopen.de -> 2a01:4f8:231:19a7::155 +fw_dovecot_auth_allowed_networks_v4: 159.69.74.155 148.251.14.136 94.16.115.62 +fw_dovecot_auth_allowed_networks_v6: "2a01:4f8:231:19a7::155 2a01:4f8:201:7389::136" + +# --- Jitsi +fw_jitsi_dovecot_auth: true + +# --- Rsync +fw_rsync_out_ips: $ext_1_ip + +# --- Protection / limits +fw_per_IP_connection_limit: 250 diff --git a/roles/ipt-server/MIGRATION.md b/roles/ipt-server/MIGRATION.md index b5ab050..4295c96 100644 --- a/roles/ipt-server/MIGRATION.md +++ b/roles/ipt-server/MIGRATION.md @@ -10,11 +10,13 @@ wird. ## Überblick Das alte Verfahren: + - Firewall-Skripte und Conf-Dateien wurden manuell oder über die alte `firewall`-Rolle (lineinfile/blockinfile) gepflegt. - Änderungen direkt in `/etc/ipt-firewall/` auf dem Host. Das neue Verfahren: + - Alle Firewall-Einstellungen liegen in `host_vars/${HOSTNAME}/ipt-server.yml`. - Ansible deployt die Config-Dateien aus Jinja2-Templates. - Direktes Editieren auf dem Host ist nicht mehr vorgesehen. @@ -47,6 +49,7 @@ cat host_vars/${HOSTNAME}/ipt-server.yml ``` Kontrollpunkte: + - Sind `fw_ext_interfaces`, `fw_ext_ips_v4`, `fw_ext_ips_v6` korrekt? - Sind aktivierte Dienste (Mail, HTTP, VPN usw.) vorhanden? - Sind `munin_remote_ipv4` / `munin_remote_ipv6` eingetragen (falls Munin läuft)? @@ -61,6 +64,7 @@ Alle Variablen und ihre Bedeutung stehen in `defaults/main.yml`. Solange `fw_manage_config` nicht auf `true` gesetzt ist (Default: `false`), überschreibt Ansible **keine** bestehenden Config-Dateien. Es werden nur installiert: + - Firewall-Skripte → `/usr/local/sbin/` - Geteilte Conf-Dateien → `/etc/ipt-firewall/` - Systemd-Units → `/etc/systemd/system/` @@ -89,7 +93,7 @@ Vergleich. ```bash HOSTNAME= -ssh ${HOSTNAME} ' +ssh -t ${HOSTNAME} ' iptables-save | grep -v "^#" | sed "s/\[[0-9]*:[0-9]*\]/[0:0]/g" \ > /tmp/fw_before_v4.rules ip6tables-save | grep -v "^#" | sed "s/\[[0-9]*:[0-9]*\]/[0:0]/g" \ @@ -155,6 +159,7 @@ entsprechenden Variablen in `host_vars/${HOSTNAME}/ipt-server.yml` nachpflegen, erneut ausrollen und den Diff wiederholen. Ab jetzt: + - Ansible überschreibt die vier Config-Dateien bei jedem Run aus den Templates. - Bei Änderungen an Templates oder host_vars wird die Firewall automatisch neu gestartet.