Ansible KIT Firewall-Konfiguration

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen

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 kit ist auf allen VMs vorhanden und hat sudo 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:

  1. Hostname setzen
  2. /etc/hosts konfigurieren
  3. /etc/network/interfaces konfigurieren
  4. /etc/resolv.conf konfigurieren
  5. /etc/nftables.conf konfigurieren
  6. nftables aktivieren und starten
  7. IP-Forward konfigurieren
  8. 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

Siehe auch