Files
oopen-server/roles/ipt-server
chris 9798ca9cd6 Add ipt-server role with firewall configuration and management
- Created handlers for reloading systemd and restarting firewall services.
- Implemented tasks to ensure the existence of configuration directories and files.
- Deployed host-specific and shared configuration files using templates.
- Added scripts for managing IPv4 and IPv6 firewalls.
- Configured systemd service units for ipt-firewall and ip6t-firewall.
- Enabled and started firewall services on system boot.
2026-06-26 19:30:01 +02:00
..

ipt-server — Ansible Role

Verwaltet die iptables/ip6tables-basierte Firewall (ipt-firewall-server / ip6t-firewall-server) auf Debian-Hosts.

Die Rolle ist die einzige autorisierte Stelle für Firewall-Änderungen. Direkte Edits in /etc/ipt-firewall/ auf dem Host werden beim nächsten Ansible-Run überschrieben, sobald fw_manage_config: true gesetzt ist.


Verzeichnisstruktur

roles/ipt-server/
├── defaults/main.yml          # Alle Variablen mit Defaults
├── files/
│   ├── etc/ipt-firewall/      # Geteilte Conf-Dateien (nicht host-spezifisch)
│   │   ├── default_settings.conf
│   │   ├── include_functions.conf
│   │   ├── logging_ipv4.conf
│   │   ├── logging_ipv6.conf
│   │   ├── post_declarations.conf
│   │   ├── ban_ipv4.list.sample
│   │   └── ban_ipv6.list.sample
│   ├── etc/systemd/system/
│   │   ├── ipt-firewall.service
│   │   └── ip6t-firewall.service
│   └── usr/local/sbin/
│       ├── ipt-firewall-server    # IPv4-Firewall-Skript
│       └── ip6t-firewall-server   # IPv6-Firewall-Skript
├── handlers/main.yml
├── tasks/main.yml
└── templates/
    └── etc/ipt-firewall/
        ├── interfaces_ipv4.conf.j2   # Host-spezifisch: Interfaces + IPs
        ├── interfaces_ipv6.conf.j2
        ├── main_ipv4.conf.j2         # Host-spezifisch: Dienste, Regeln
        └── main_ipv6.conf.j2

Host-spezifische Konfiguration liegt ausschließlich in:

host_vars/<hostname>/ipt_firewall.yml

Neuen Host aufnehmen

Voraussetzungen

  • Host ist im Ansible-Inventory (hosts) eingetragen.
  • SSH-Zugang mit sudo-Rechten ist vorhanden.
  • git ist auf dem Host installiert (wird für keinen anderen Zweck gebraucht — die Rolle selbst benötigt kein git auf dem Host).

Schritt 1 — host_vars anlegen

cd /path/to/ansible/oopen-server

# Interfaces und IPs von Hand in die Datei eintragen:
mkdir -p host_vars/<hostname>
cat > host_vars/<hostname>/ipt_firewall.yml << 'EOF'
---
fw_manage_config: true

# --- Netzwerk
fw_ext_interfaces:
  - "eth0"
fw_ext_ips_v4:
  - "1.2.3.4"
fw_ext_ips_v6:
  - "2001:db8::1"
EOF

Alle weiteren Variablen sind optional — sie greifen auf die Defaults in defaults/main.yml zurück. Nur abweichende Werte müssen gesetzt werden.

Für eine vollständige Variablenreferenz: defaults/main.yml.

Schritt 2 — Dry-run

ansible-playbook ipt-server.yml --limit <hostname> --check --diff

Der Diff zeigt genau, welche Dateien angelegt und welche Config-Werte gesetzt werden. Prüfen, ob Interfaces, IPs und Dienste stimmen.

Schritt 3 — Scharf stellen

ansible-playbook ipt-server.yml --limit <hostname>

Was passiert:

  • Firewall-Skripte werden nach /usr/local/sbin/ kopiert.
  • Geteilte Conf-Dateien werden nach /etc/ipt-firewall/ kopiert.
  • Systemd-Units werden installiert, Dienste werden aktiviert und gestartet.
  • Config-Dateien (interfaces_*.conf, main_*.conf) werden aus den Templates erzeugt und die Firewall wird gestartet.

Konfiguration ändern

Alle Änderungen erfolgen ausschließlich in der host_vars-Datei des Hosts:

host_vars/<hostname>/ipt_firewall.yml

Danach:

# Vorschau:
ansible-playbook ipt-server.yml --limit <hostname> --check --diff

# Anwenden (ändert Config, startet Firewall bei Änderungen neu):
ansible-playbook ipt-server.yml --limit <hostname>

Ansible erkennt automatisch, ob sich eine Config-Datei geändert hat. Nur bei tatsächlichen Änderungen wird die Firewall neu gestartet.

Beispiel: HTTP-Server aktivieren

# host_vars/<hostname>/ipt_firewall.yml
fw_http_server_ips: "$ext_ips"   # oder konkrete IP

Beispiel: SSH auf bestimmten Port einschränken

fw_ssh_ports: "2222"

Beispiel: LXC-Gäste eintragen

fw_lxc_guest_ips_v4:
  - "10.0.3.10"
  - "10.0.3.11"
fw_lxc_guest_ips_v6:
  - "fd00::10"
  - "fd00::11"

Firewall-Skripte aktualisieren

Wenn ipt-firewall-server oder ip6t-firewall-server im ipt-server-Repository aktualisiert werden, müssen die neuen Versionen manuell in die Rolle übernommen werden:

SRC=/path/to/ipt-server
DST=roles/ipt-server/files/usr/local/sbin

cp $SRC/ipt-firewall-server  $DST/
cp $SRC/ip6t-firewall-server $DST/
chmod 750 $DST/ipt-firewall-server $DST/ip6t-firewall-server

Ebenso für geteilte Conf-Dateien in roles/ipt-server/files/etc/ipt-firewall/.

Nach dem Commit werden die neuen Skripte beim nächsten Ansible-Run auf alle Hosts deployed.


Wichtige Variablen

Variable Default Bedeutung
fw_manage_config false true = Ansible verwaltet Config-Dateien vollständig
fw_ext_interfaces [] Externe Netzwerk-Interfaces, z.B. ["eth0"]
fw_ext_ips_v4 [] Externe IPv4-Adressen
fw_ext_ips_v6 [] Externe IPv6-Adressen
fw_ssh_server_ips "$ext_ips" IPs auf denen SSH erlaubt ist
fw_ssh_ports "$standard_ssh_port" SSH-Port(s)
fw_http_server_ips "" IPs auf denen HTTP/HTTPS erlaubt ist
munin_remote_ipv4 "" Munin-Server IPv4
munin_remote_ipv6 "" Munin-Server IPv6

Alle Variablen mit Beschreibung und Defaults: defaults/main.yml.

Variablen die mit $ beginnen (z.B. $ext_ips, $standard_ssh_port) sind Bash-Variablen — sie werden nicht von Ansible aufgelöst, sondern zur Laufzeit vom Firewall-Skript expandiert.


Ban-Listen

/etc/ipt-firewall/ban_ipv4.list und ban_ipv6.list werden beim ersten Ausrollen aus den Beispiel-Dateien der Rolle erzeugt und danach nicht mehr durch Ansible angefasst — sie können auf dem Host direkt bearbeitet werden.