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.
This commit is contained in:
@@ -0,0 +1,204 @@
|
||||
# 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
|
||||
|
||||
```bash
|
||||
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
|
||||
|
||||
```bash
|
||||
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
|
||||
|
||||
```bash
|
||||
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:
|
||||
|
||||
```bash
|
||||
# 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
|
||||
|
||||
```yaml
|
||||
# host_vars/<hostname>/ipt_firewall.yml
|
||||
fw_http_server_ips: "$ext_ips" # oder konkrete IP
|
||||
```
|
||||
|
||||
### Beispiel: SSH auf bestimmten Port einschränken
|
||||
|
||||
```yaml
|
||||
fw_ssh_ports: "2222"
|
||||
```
|
||||
|
||||
### Beispiel: LXC-Gäste eintragen
|
||||
|
||||
```yaml
|
||||
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:
|
||||
|
||||
```bash
|
||||
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.
|
||||
Reference in New Issue
Block a user