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
This commit is contained in:
+13
-12
@@ -363,26 +363,24 @@ def parse_bash_config(text):
|
|||||||
varname = m.group(1)
|
varname = m.group(1)
|
||||||
rest = m.group(2).strip()
|
rest = m.group(2).strip()
|
||||||
|
|
||||||
# Quoted value
|
# Quoted value (single or double quotes, may span multiple lines)
|
||||||
if rest.startswith('"'):
|
if rest and rest[0] in ('"', "'"):
|
||||||
# Collect until closing quote (may span multiple lines)
|
quote_char = rest[0]
|
||||||
collected = rest[1:] # strip opening "
|
collected = rest[1:] # strip opening quote
|
||||||
|
parts = []
|
||||||
closed = False
|
closed = False
|
||||||
extra_lines = []
|
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
# Check if closing " is in collected
|
close_pos = collected.find(quote_char)
|
||||||
close_pos = collected.find('"')
|
|
||||||
if close_pos != -1:
|
if close_pos != -1:
|
||||||
value = collected[:close_pos].strip()
|
parts.append(collected[:close_pos])
|
||||||
if extra_lines:
|
# join all parts; split() collapses whitespace and drops empty lines
|
||||||
warnings.append(f" # {varname}: multiline value — verify manually")
|
value = ' '.join(' '.join(parts).split())
|
||||||
result[varname] = value
|
result[varname] = value
|
||||||
closed = True
|
closed = True
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
# Value continues on next line
|
parts.append(collected)
|
||||||
extra_lines.append(collected.strip())
|
|
||||||
i += 1
|
i += 1
|
||||||
if i >= len(lines):
|
if i >= len(lines):
|
||||||
break
|
break
|
||||||
@@ -546,6 +544,9 @@ def render_yaml(hostname, host_vars, all_warnings):
|
|||||||
"",
|
"",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
lines.append("fw_manage_config: false")
|
||||||
|
lines.append("")
|
||||||
|
|
||||||
if all_warnings:
|
if all_warnings:
|
||||||
lines.append("# WARNINGS — manual review needed:")
|
lines.append("# WARNINGS — manual review needed:")
|
||||||
for w in all_warnings:
|
for w in all_warnings:
|
||||||
|
|||||||
@@ -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/<hostname>/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
|
||||||
@@ -10,11 +10,13 @@ wird.
|
|||||||
## Überblick
|
## Überblick
|
||||||
|
|
||||||
Das alte Verfahren:
|
Das alte Verfahren:
|
||||||
|
|
||||||
- Firewall-Skripte und Conf-Dateien wurden manuell oder über die alte `firewall`-Rolle
|
- Firewall-Skripte und Conf-Dateien wurden manuell oder über die alte `firewall`-Rolle
|
||||||
(lineinfile/blockinfile) gepflegt.
|
(lineinfile/blockinfile) gepflegt.
|
||||||
- Änderungen direkt in `/etc/ipt-firewall/` auf dem Host.
|
- Änderungen direkt in `/etc/ipt-firewall/` auf dem Host.
|
||||||
|
|
||||||
Das neue Verfahren:
|
Das neue Verfahren:
|
||||||
|
|
||||||
- Alle Firewall-Einstellungen liegen in `host_vars/${HOSTNAME}/ipt-server.yml`.
|
- Alle Firewall-Einstellungen liegen in `host_vars/${HOSTNAME}/ipt-server.yml`.
|
||||||
- Ansible deployt die Config-Dateien aus Jinja2-Templates.
|
- Ansible deployt die Config-Dateien aus Jinja2-Templates.
|
||||||
- Direktes Editieren auf dem Host ist nicht mehr vorgesehen.
|
- Direktes Editieren auf dem Host ist nicht mehr vorgesehen.
|
||||||
@@ -47,6 +49,7 @@ cat host_vars/${HOSTNAME}/ipt-server.yml
|
|||||||
```
|
```
|
||||||
|
|
||||||
Kontrollpunkte:
|
Kontrollpunkte:
|
||||||
|
|
||||||
- Sind `fw_ext_interfaces`, `fw_ext_ips_v4`, `fw_ext_ips_v6` korrekt?
|
- Sind `fw_ext_interfaces`, `fw_ext_ips_v4`, `fw_ext_ips_v6` korrekt?
|
||||||
- Sind aktivierte Dienste (Mail, HTTP, VPN usw.) vorhanden?
|
- Sind aktivierte Dienste (Mail, HTTP, VPN usw.) vorhanden?
|
||||||
- Sind `munin_remote_ipv4` / `munin_remote_ipv6` eingetragen (falls Munin läuft)?
|
- 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`),
|
Solange `fw_manage_config` nicht auf `true` gesetzt ist (Default: `false`),
|
||||||
überschreibt Ansible **keine** bestehenden Config-Dateien. Es werden nur
|
überschreibt Ansible **keine** bestehenden Config-Dateien. Es werden nur
|
||||||
installiert:
|
installiert:
|
||||||
|
|
||||||
- Firewall-Skripte → `/usr/local/sbin/`
|
- Firewall-Skripte → `/usr/local/sbin/`
|
||||||
- Geteilte Conf-Dateien → `/etc/ipt-firewall/`
|
- Geteilte Conf-Dateien → `/etc/ipt-firewall/`
|
||||||
- Systemd-Units → `/etc/systemd/system/`
|
- Systemd-Units → `/etc/systemd/system/`
|
||||||
@@ -89,7 +93,7 @@ Vergleich.
|
|||||||
```bash
|
```bash
|
||||||
HOSTNAME=<hostname>
|
HOSTNAME=<hostname>
|
||||||
|
|
||||||
ssh ${HOSTNAME} '
|
ssh -t ${HOSTNAME} '
|
||||||
iptables-save | grep -v "^#" | sed "s/\[[0-9]*:[0-9]*\]/[0:0]/g" \
|
iptables-save | grep -v "^#" | sed "s/\[[0-9]*:[0-9]*\]/[0:0]/g" \
|
||||||
> /tmp/fw_before_v4.rules
|
> /tmp/fw_before_v4.rules
|
||||||
ip6tables-save | grep -v "^#" | sed "s/\[[0-9]*:[0-9]*\]/[0:0]/g" \
|
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.
|
erneut ausrollen und den Diff wiederholen.
|
||||||
|
|
||||||
Ab jetzt:
|
Ab jetzt:
|
||||||
|
|
||||||
- Ansible überschreibt die vier Config-Dateien bei jedem Run aus den Templates.
|
- Ansible überschreibt die vier Config-Dateien bei jedem Run aus den Templates.
|
||||||
- Bei Änderungen an Templates oder host_vars wird die Firewall automatisch
|
- Bei Änderungen an Templates oder host_vars wird die Firewall automatisch
|
||||||
neu gestartet.
|
neu gestartet.
|
||||||
|
|||||||
Reference in New Issue
Block a user