ansibleguy.infra_nftables

NFTables-Logo

Ansible-Rolle - NFTables

Rolle zur Bereitstellung der NFTables-Firewall auf Linux-Servern.

Kauf mir einen Kaffee

Molecule-Teststatus YamlLint-Teststatus PyLint-Teststatus Ansible-Lint-Teststatus Ansible Galaxy

Molecule-Logs: Kurz, Voll

Getestet:

  • Debian 11
  • Debian 12

Installation

# aktuellste Version
ansible-galaxy role install git+https://github.com/ansibleguy/infra_nftables

# aus Galaxy
ansible-galaxy install ansibleguy.infra_nftables

# oder in benutzerdefinierten Rollenpfad
ansible-galaxy install ansibleguy.infra_nftables --roles-path ./roles

Dokumentation

Fehlersuche


Verwendung

Möchtest du eine einfache Ansible-GUI? Schau dir meine Ansible WebUI an.

Konfiguration

Definiere die Konfiguration nach Bedarf:

nftables:
  # enable:  # Funktionen müssen vom Kernel unterstützt werden
  #   sets: true
  #   nat: true
  #   deb11_backport: false  # Verwende das Backports-Repository von Debian 11, um neuere Versionen auf Debian 10 zu installieren
  #   bash_completion: false

  _defaults:  # Standardwerte, die von allen Tabellen und Ketten geerbt werden
    table:
      type: 'inet'
    
    chain:
      policy: 'drop'
      type: 'filter'
      priority: 0
      log:
        drop: true

    rules:
      _all: []  # Regeln, die zu allen Ketten aller Tabellen hinzugefügt werden
      incoming: []  # Regeln, die zur 'incoming' Kette aller Tabellen hinzugefügt werden

  tables:
    example:
      # type: 'inet'  # ipv4 + ipv6
      _defaults:
        rules:
          _all: []  # Regeln, die zu allen Ketten dieser Tabelle hinzugefügt werden

      vars:
        dns_servers: ['1.1.1.1', '1.1.0.0', '8.8.8.8', '8.8.4.4']
        private_ranges: ['192.168.0.0/16', '172.16.0.0/12', '10.0.0.0/8']

      sets:
        blacklist:
          flags: ['dynamic', 'timeout']
          settings:
            timeout: '3m'

      counters:
        invalid_packages:
          comment: 'Ungültig'

      chains:
        incoming:
          hook: 'input'
          rules:
            - sequence: 1
              raw: 'ct state invalid counter name invalid_packages log prefix "DROP invalid states" drop'
            - seq: 2
              raw: 'ct state {established, related} counter accept comment "Erlaube offene Sitzungen"'
            - s: 3
              raw: 'iifname "lo" accept comment "Erlaube Loopback-Verkehr"'
            - {proto: 'icmp', type: 'echo-request', limit: 'rate 10/second', comment: 'Erlaube ICMP-Ping'}
            - {proto: 'icmpv6', type: 'echo-request', limit: 'rate 10/second', comment: 'Erlaube ICMP-Ping'}
            - {proto: 'icmp', code: 30, limit: 'rate 10/second', comment: 'Erlaube ICMP-Traceroute'}
            - {proto: 'icmpv6', limit: 'rate 10/second', comment: 'Erlaube notwendige ICMPv6-Typen für IPv6',
               type: ['nd-neighbor-solicit', 'nd-router-advert', 'nd-neighbor-advert']}
            - {proto: 'udp', port: 46251, counter: 'invalid_packages'}

        outgoing:
          hook: 'output'
          # policy: 'accept'
          rules:
            - {dest: '$dns_servers', proto: 'udp', port: 53}
            - {dest: '$dns_servers', proto: 'tcp', port: [53, 853]}
            - {proto: ['tcp', 'udp'], port: [80, 443]}
            - {proto: ['icmp', 'icmpv6'], comment: 'Erlaube ausgehende ICMP-Nachrichten'}

        route:
          hook: 'forward'

        translate:
          hook: 'postrouting'
          type: 'nat'
          policy: 'accept'
          rules:
            - {'src': '$private_ranges', oif: 'eno2', masquerade: true}  # dynamisches ausgehendes NAT
            - {'src': '$private_ranges', oif: 'eno3', snat: '192.168.0.1'}  # statisches ausgehendes NAT

Wenn du Gruppen- und Hostregeln zusammenführen möchtest, kannst du es so machen:

# Definiere die grundlegenden Regeln, die von allen Hosts verwendet wird: 'fw_rules_all'
# Definiere dienstspezifische Regeln als: 'fw_rules_group'
# Definiere hostspezifische Regeln als: 'fw_rules_host'

- name: NFTables
  become: true
  hosts: all
  vars:
    nftables:
      tables:
        example:
          chains: "{{ fw_rules_all |
          combine(fw_rules_group|default({}), recursive=true, list_merge='append') |
          combine(fw_rules_host|default({}), recursive=true, list_merge='append') }}"

  pre_tasks:
    - debug:
        var: nftables

  roles:
    - ansibleguy.infra_nftables

Ausführung

Führe das Playbook aus:

ansible-playbook -K -D -i inventory/hosts.yml playbook.yml

Es gibt auch einige nützliche Tags:

  • config_table => nur aktuelle Regelsets bereitstellen
  • config
  • purge

Um Fehler zu debuggen, kannst du zur Laufzeit die 'debug'-Variable setzen:

ansible-playbook -K -D -i inventory/hosts.yml playbook.yml -e debug=yes

Funktionalität

  • Paketinstallation

    • Ansible-Abhängigkeiten (minimal)
    • NFTables
  • Konfiguration

    • Möglichkeit, Variablen auf globaler Ebene zu definieren

    • Variablen, Mengen, Zähler und Limits auf Tabellenebene

    • Variablen auf Kettenebene

    • Konfiguration wird vor dem Schreiben validiert

    • Standardkonfiguration:

      • Aktivierte Funktionen (müssen vom Kernel unterstützt werden)
        • Mengen
        • NAT
      • Keine Regeln werden standardmäßig hinzugefügt
      • Tabellen
        • Tabellen-Typ = inet
      • Ketten
        • Ketten-Typ = filter
        • Ketten-Policy = drop
        • Priorität = 0
        • Zähler hinzufügen = ja
        • implizite Drop-Logs = ja
      • Mengen
        • Mengen-Typ = ipv4_addr
        • Zähler hinzufügen = ja
      • Regeln
        • Policy = accept (auf 'none' setzen, wenn du es explizit entfernen möchtest)
        • Protokollierung von Drops = ja
    • Standard-Opt-Ins:

      • Bereinigung von nicht verwalteten Konfigurationsdateien, die in '/etc/nftables.d/' gespeichert sind
    • Standard-Opt-Outs:

      • Installation von NFTables aus den Debian 11 Backports, wenn du auf Debian 10 arbeitest (neuere Version)
      • Hinzufügen eines Bash-Vervollständigungs-Skripts für den Befehl 'nft'

Info

  • Hinweis: Die meisten Funktionen der Rolle können aktiviert oder deaktiviert werden.

    Für alle verfügbaren Optionen siehe die Standardkonfiguration im Hauptstandarddatei!

  • Warnung: Nicht jede Einstellung/Variable, die du angibst, wird auf Gültigkeit überprüft. Eine fehlerhafte Konfiguration könnte die Rolle beschädigen!

  • Info: Du kannst DNS-Resolution und IP-Blocklisten-Funktionen zu NFTables hinzufügen, indem du die ansibleguy.addons_nftables Rolle verwendest!

  • Warnung: Einige Kernfunktionen (NAT/Mengen) werden möglicherweise nicht von Mainstream-Distribution-Kernels unterstützt.

    Siehe: Fehlerbehebungsanleitung - 'Nicht unterstützte Operation'

  • Info: Lies die Hook-Dokumentation, um zu erfahren, wann und wie du Hooks und Prioritäten konfigurieren kannst!

  • Info: Regeln können im Wörterbuchformat bereitgestellt werden, wie in den Beispielen zu sehen.

    Dies sind die verfügbaren Felder und Aliase:

    Funktion Schlüssel Hinweis
    Regel-Sequenz s, id, seq, sequence Die Sequenz-ID (integer), um die Regeln innerhalb einer Kette zu sortieren. Wenn keine bereitgestellt wird, wird eine automatisch generierte ID ab 1000 verwendet.
    Eingangs-Schnittstelle if, iif, iifname -
    Ausgangs-Schnittstelle of, oif, oifname -
    Protokoll proto, pr, protocol -
    Protokoll-Subtype t, type -
    Protokoll-Untercode co, code -
    Zieladresse/-netzwerk d, dest, target, destination, 'ip daddr', d6, dest6, target6, 'ip6 daddr' -
    Zielport dp, port, dport, dest_port -
    Quelladresse/-netzwerk s, src, source, 'ip saddr', s6, src6, source6, 'ip6 saddr' -
    Quellport sp, sport, sport, src_port -
    Protokollierung / Lognachricht l, log, 'log prefix' Wenn auf 'True' gesetzt und ein 'Kommentar' bereitgestellt wird, wird dieser als Nachricht verwendet. Andernfalls wird keine Nachricht verwendet.
    Verkehrs-Zähler count, counter Wenn auf 'True' gesetzt, wird ein regel-spezifischer Zähler verwendet. Andernfalls wird der bereitgestellte vordefinierte Zähler verwendet.
    Verkehrs-Limit lim, limit Ein Limit, das für die Regel festgelegt werden soll; siehe: Anonyme Limits und Vordefinierte Limits.
    Regelaktion a, action Wenn keine Aktion bereitgestellt wird, wird standardmäßig 'accept' festgelegt.
    Quell-NAT-Masquerading m, masque, masquerade Wenn NAT-Masquerading verwendet werden soll
    Quell-NAT snat, src_nat, source_nat, outbound_nat, 'snat to' -
    Ziel-NAT dnat, dest_nat, destination_nat, 'dnat to' -
    Umleitung redir, redirect, 'redirect to' Durch die Verwendung von Umleitungen werden Pakete an die lokale Maschine weitergeleitet.
    Regelkommentar c, cmt, comment -
    Benutzer user, uid Stimmen nur mit Datenverkehr überein, der von bestimmten Benutzern stammt.
    Gruppe group, gid Stimmen nur mit Datenverkehr überein, der von einer bestimmten Gruppe stammt.
    Firewall-Mark mark -
    Priorität prio, priority -
    Paketlänge len, length -
    Zeitstempel time, timestamp Stimmen mit dem Zeitstempel des Paketempfangs überein.
    Wochentag day Stimmen mit dem Wochentag überein (0 = Sonntag bis 6 = Samstag oder "Montag", "Dienstag", auch "Freitag", "Samstag")
    Uhrzeit hour Stimmen mit der 24-Stunden "HH:MM:SS"-Uhrzeit überein, wobei Sekunden optional sind.

Nur eine der Aktionen, Quell-NAT, Masquerading oder Ziel-NAT kann für eine Regel festgelegt werden!

  • Info: Spezial-/komplexe Regeln können nicht mit dem Regel-Wörterbuch konfiguriert werden.

    Du kannst den 'raw'-Schlüssel verwenden, um jede benutzerdefinierte Regel bereitzustellen, die direkt dem Regelset hinzugefügt wird.

  • Info: Du kannst Variablen, Mengen, Zähler und Limits auf Tabellenebene definieren.

    • Variablen sind Schlüssel-Wert-Paare.
      var-name: var-value
      var2-name: ['value1', 'value2']
      
    • Mengen haben diese Struktur:
      set-name:
        flags: [list-of-flags]  # optional
        settings:
          setting: value  # optional
      
    • Zähler haben diese Struktur:
      counter-name:
        comment: text  # optional
      
    • Limits haben diese Struktur:
      limit-name:
        rate: 'über 1024 Bytes/Sekunde Burst 512 Bytes'
        comment: text  # optional
      
  • Warnung: Wenn du eine 'count-only'-Regel hinzufügen möchtest, musst du die Aktion ausdrücklich auf 'none' setzen - andernfalls wird der Standardwert 'accept' hinzugefügt!

  • Info: Wenn irgendein nicht unterstütztes Feld zur Regelübersetzung bereitgestellt wird, wird ein Fehler ausgegeben, da dies zu unerwarteten Ergebnissen führen kann!

  • Info: Docker benötigt möglicherweise IPTables als Paketabhängigkeit.

    Siehe: Anwendungsfall Docker-Host

Über das Projekt

Ansible Role to provision NFTables firewall on linux servers

Installieren
ansible-galaxy install ansibleguy.infra_nftables
GitHub Repository
Lizenz
other
Downloads
4.4k
Besitzer
[email protected] | GPG: https://badges.ansibleguy.net/public.gpg