Ansible KIT Firewall-Konfiguration
Firewall-Konfiguration mit Ansible
Dieser Artikel zeigt wie man mehrere Firewall-VMs automatisiert mit Ansible konfiguriert. Wir verwenden eine Ansible-Rolle die Netzwerk-Interfaces, Hostnamen, DNS-Auflösung und NAT mit nftables einrichtet.
Voraussetzungen
- Ansible ist auf dem Control-Node installiert (Ansible Grundlagen)
- Alle Firewall-VMs sind erreichbar (SSH)
- User
kitist auf allen VMs vorhanden und hatsudo NOPASSWD-Rechte - SSH-Schlüssel ist hinterlegt
Variablen
Jede Firewall-VM hat zwei individuelle Werte:
| Variable | Bedeutung | Beispiel |
|---|---|---|
fw_xx |
Teilnehmernummer (201–213) | 212
|
fw_y |
Klassensaal (1–16) | 16
|
Diese Werte werden in alle Konfigurationsdateien als Jinja2-Variablen eingesetzt, z.B. 172.26.Vorlage:Fw xx.1.
- Hinweis zur Domain
Die Domain lautet it212.int – also itVorlage:Fw xx.int in den Templates (nicht it2Vorlage:Fw xx.int).
Projektstruktur
ansible-fw/
├── ansible.cfg
├── site.yml
├── inventory/
│ └── hosts.ini
└── roles/
└── fw/
├── tasks/
│ └── main.yml
├── handlers/
│ └── main.yml
└── templates/
├── interfaces.j2
├── hosts.j2
├── resolv.conf.j2
├── nftables.conf.j2
└── 99-ipforward.conf.j2
Inventory
In der Datei inventory/hosts.ini werden alle Firewall-VMs definiert.
Jeder Host bekommt seine eigene fw_xx-Variable. Die gemeinsamen Variablen stehen unter [firewalls:vars].
[firewalls] fw201 ansible_host=192.168.16.201 fw_xx=201 fw202 ansible_host=192.168.16.202 fw_xx=202 ... fw213 ansible_host=192.168.16.213 fw_xx=213 [firewalls:vars] ansible_user=kit ansible_become=true ansible_become_method=sudo fw_y=16
ansible.cfg
Die ansible.cfg im Projektverzeichnis setzt Standardwerte damit man diese nicht jedes Mal auf der Kommandozeile angeben muss.
[defaults] inventory = inventory/hosts.ini remote_user = kit host_key_checking = False [privilege_escalation] become = True become_method = sudo
Playbook
Das Playbook site.yml ist bewusst einfach gehalten – es ruft nur die Rolle fw auf.
---
- name: Firewall-VMs konfigurieren
hosts: firewalls
gather_facts: false
roles:
- fw
Rolle: fw
Tasks
Die Datei roles/fw/tasks/main.yml führt alle Konfigurationsschritte der Reihe nach aus:
- Hostname setzen
/etc/hostskonfigurieren/etc/network/interfaceskonfigurieren/etc/resolv.confkonfigurieren/etc/nftables.confkonfigurieren- nftables aktivieren und starten
- IP-Forward konfigurieren
- Reboot
Wenn sich interfaces oder nftables.conf ändern, lösen die Tasks automatisch die zugehörigen Handler aus (Neustart des Dienstes).
Templates
Alle Konfigurationsdateien werden als Jinja2-Templates verwaltet. Ansible befüllt die Variablen beim Ausführen pro Host automatisch.
Hostname
Der Hostname wird direkt per Ansible-Modul gesetzt:
fw.it{{ fw_xx }}.int
/etc/hosts
127.0.0.1 localhost
127.0.1.1 fw.it{{ fw_xx }}.int fw
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
/etc/resolv.conf
search it{{ fw_xx }}.int
nameserver 192.168.{{ fw_y }}.88
/etc/network/interfaces
#WAN
auto enp0s3
iface enp0s3 inet static
address 192.168.{{ fw_y }}.{{ fw_xx }}/24
gateway 192.168.{{ fw_y }}.254
post-up ip route add 10.88.0.0/16 via 192.168.{{ fw_y }}.88
#DMZ
auto enp0s8
iface enp0s8 inet static
address 10.88.{{ fw_xx }}.1/24
#LAN
auto enp0s9
iface enp0s9 inet static
address 172.26.{{ fw_xx }}.1/24
#SERVERS
auto enp0s10
iface enp0s10 inet static
address 10.{{ fw_xx }}.1.1/24
/etc/nftables.conf
Die Firewall verwendet NAT mit Masquerading. Pakete aus DMZ, LAN und SERVERS werden über das WAN-Interface (enp0s3) nach außen weitergeleitet.
Interner Verkehr innerhalb 192.168.Y.0/24 und 10.88.0.0/16 wird nicht genattet (RETURN).
define LAN = 172.26.{{ fw_xx }}.0/24
define SERVER = 10.{{ fw_xx }}.1.0/24
define DMZ = 10.88.{{ fw_xx }}.0/24
flush ruleset
table ip nat {
chain postrouting {
type nat hook postrouting priority 100; policy accept;
ip saddr $DMZ ip daddr 192.168.{{ fw_y }}.0/24 return
ip saddr $DMZ ip daddr 10.88.0.0/16 return
ip saddr $DMZ oif enp0s3 masquerade
ip saddr $LAN oif enp0s3 masquerade
ip saddr $SERVER oif enp0s3 masquerade
}
}
IP-Forward
Damit die Firewall Pakete zwischen den Interfaces weiterleitet, muss IP-Forwarding aktiviert sein:
net.ipv4.ip_forward=1
Diese Einstellung wird in /etc/sysctl.d/99-ipforward.conf gespeichert und ist nach dem Reboot dauerhaft aktiv.
Ausführen
- Alle Hosts
ansible-playbook site.yml
- Nur einzelne Hosts (z.B. zum Testen)
ansible-playbook site.yml --limit fw212,fw213
- Nur bestimmte Tasks ausführen (Tags, falls definiert)
ansible-playbook site.yml --limit fw212 --tags nftables