ansibleguy.infra_nftables

Ansible-Rolle - NFTables
Rolle zur Bereitstellung der NFTables-Firewall auf Linux-Servern.
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
- NFTables: Wiki
- Schau dir das Beispiel an!
- Praktische Anwendungsfälle (Docker, Proxmox, Netzwerk-Firewall)
- Integration von Fail2Ban mit NFTables
- Fehlerbehebungsanleitung
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
- Aktivierte Funktionen (müssen vom Kernel unterstützt werden)
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
- Variablen sind Schlüssel-Wert-Paare.
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
Ansible Role to provision NFTables firewall on linux servers
ansible-galaxy install ansibleguy.infra_nftables