RHEL / CentOS Um nun beim Systemstart nftable-Regeln zur Firewall hinzuzufügen?
Ich verwende firewalld auf RHEL 8 und muss auch einige nftable-Regeln hinzufügen.
(Die nftable-Regeln basieren auf der Antwort auf CentOS 8 als NAT-Router mit nft und firewalld - wie kann TFTP übergeben werden? )
In einer laufenden Firewall funktioniert dies gut mit dem Befehl nft -f.
Dies geht jedoch bei einem Neustart verloren.
In der RedHat-Dokumentation (hinter paywall) wird vorgeschlagen, den Dienst nftables.service zum Laden von Regeln beim Neustart zu verwenden. Dies funktioniert jedoch nicht in Verbindung mit firewalld. Die beiden Dienste werden als widersprüchlich aufgeführt, und selbst wenn dies nicht der Fall wäre, würde firewalld wahrscheinlich die nftable-Regeln löschen.
Gibt es eine andere Möglichkeit, die nftable-Regeln beim Neustart zu laden?
Antworten
Das Dienstprogramm firewalld löscht bei Verwendung des Backends nftables keine Tabellen, die nicht dazu gehören :
Löschen Sie nur die Regeln der Firewall
Da nftables Namespaces (über Tabellen) zulässt, führt Firewalld keine vollständige Leerung der Firewall-Regeln mehr durch . Es werden nur Regeln in der Firewall- Tabelle gelöscht . Dadurch werden Szenarien vermieden, in denen benutzerdefinierte Benutzerregeln oder Regeln, die von anderen Tools installiert wurden, unerwartet gelöscht werden, wenn firewalld neu gestartet oder neu geladen wurde.
Das Gleiche muss nur beim Verwalten anderer Tabellen getan werden.
In der vorherigen Antwort ist dies bereits geschehen: Die nftables- Regeln löschen idempotent nur ihre eigene Tabelle : handletftp
.
Leider ist das bei nftables.service
der Stop- Aktion nicht der Fall :
ExecStop=/sbin/nft flush ruleset
Man muss nur sicherstellen, dass der Stop-Teil des systemd-Dienstes nicht alle Regeln direkt löscht, während der Job noch ausgeführt wird. Dieser Job wird in speziellen delegiert werden nftables Regeln für die Stopp - Aktion.
Hier ist eine praktische Methode: Duplizieren (z. B. :) systemctl cat nftables.services
und Ändern nftables.service
in eine instanziierte Version [email protected]
, die eingefügt werden soll /etc/systemd/system/[email protected]
:
[Unit]
Description=Idempotent nftables rules for %I
Wants=network-pre.target
Before=network-pre.target
[Service]
Type=oneshot
ProtectSystem=full
ProtectHome=true
ExecStart=/sbin/nft -f /etc/nftables/idempotent/%I.nft
# As the rules are idempotent, ExecReload is same as ExecStart
ExecReload=/sbin/nft -f /etc/nftables/idempotent/%I.nft
# The stop rules should only have the first boilerplate parts
ExecStop=/sbin/nft -f /etc/nftables/idempotent/stop-%I.nft
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
Erstellen Sie das oben verwendete dedizierte Konfigurationsverzeichnis:
mkdir -p /etc/nftables/idempotent
Platzieren Sie Regeln, die für jede definierte Tabelle immer so beginnen, sodass das Laden der Regeln unabhängig von anderen Tabellen und idempotent ist (Beispiel mit Tabellen ip foo
und bridge bar
):
table ip foo
delete table ip foo
table bridge bar
delete table bridge bar
table ip foo {
...
}
table bridge bar {
....
}
oder verwenden Sie einfach eine Tabelle pro Datei. Die flush ruleset
Aussage ist verboten, da sie global ist.
Der Grund, warum eine Tabelle erstellt, gelöscht und neu erstellt wird, besteht darin, das Ergebnis idempotent zu erhalten: Während das Löschen einer nicht vorhandenen Tabelle ein Fehler ist und das gesamte Laden atomar fehlschlagen würde, wird eine vorhandene Tabelle deklariert, ohne sie zu definieren (durch Hinzufügen einer leeren Tabelle). scheitert nie und tut nichts anderes , als es leer zu erstellen, wenn es vorher nicht existiert hat. In beiden Fällen (beim Booten nicht vorhanden, beim Neuladen vorhanden) kann das Löschen jetzt funktionieren, sodass der Platz bleibt, um die Tabelle direkt danach wirklich zu definieren. All dies geschieht in derselben Transaktion und ist immer noch atomar: Kein Paket wird jemals mit einer fehlenden IP-Foo- Tabelle ausgewertet, wenn es zuvor existiert hat.
Bereiten Sie eine Stoppversion von oben vor, die nur gelöscht wird (hier werden die leeren Deklarationen nicht unbedingt benötigt und können entfernt werden, wenn nur eine Tabelle vorhanden ist. Sie sollten jedoch beibehalten werden, wenn mehr als eine Tabelle vorhanden ist: Fehler gilt für die gesamte Transaktion):
table ip foo
delete table ip foo
table bridge bar
delete table bridge bar
und alles an ihren Standort bringen:
/etc/nftables/idempotent/foobar.nft
/etc/nftables/idempotent/stop-foobar.nft
Dies kann jetzt aktiviert werden mit:
systemctl enable --now local-idempotent-nft@foobar
Beispiel aus der Frage des vorherigen OP:
in /etc/nftables/idempotent/handletftp.nft
:
table ip handletftp
delete table ip handletftp
table ip handletftp {
ct helper helper-tftp {
type "tftp" protocol udp
}
chain sethelper {
type filter hook forward priority 0; policy accept;
ip saddr 192.168.1.0/24 ip daddr 10.0.10.10 udp dport 69 ct helper set "helper-tftp"
}
}
Im /etc/nftables/idempotent/stop-handletftp.nft
table ip handletftp
delete table ip handletftp
Aktivieren und Starten:
systemctl enable --now local-idempotent-nft@handletftp
Stoppen Sie es:
systemctl stop local-idempotent-nft@handletftp
Dadurch bleiben die Regeln von Firewalld bestehen . Wenn Sie die Firewall stoppen oder neu starten, bleiben diese Regeln ebenfalls bestehen.
Es gibt wahrscheinlich Verbesserungen zu tun:
- nftables hat eine include- Anweisung, die irgendwie verwendet werden könnte, um eine Verdoppelung der Boilerplate zu vermeiden.
- Das spezifische Beispiel für TFTP basiert darauf, dass das Laden
nf_nat_tftp
nicht automatisch erfolgt (im Gegensatz dazunf_conntrack_tftp
wird es automatisch aus der Referenz in den Regeln geladen oder im Gegensatz zu Firewalld, dasnf_nat_tftp
explizit geladen wird ). Daher sollten verwandte, aber nicht streng nftables- Konfigurationen berücksichtigt werden (diese eine Einstellung könnte einfach eingegeben werden/etc/modules-load.d/
).