Nft monitor trace
nft monitor trace
Mit nft monitor trace lässt sich der Weg eines Pakets durch das
nftables-Regelwerk verfolgen. Für jede durchlaufene Regel wird ein Ereignis
ausgegeben. Damit lässt sich feststellen, an welcher Stelle ein Paket verworfen
wird oder warum eine erwartete Regel nicht greift.
Die Ausgabe entsteht nicht automatisch. Ein Paket wird nur dann verfolgt, wenn es zuvor durch eine Regel markiert wurde.
Voraussetzungen
- Kernel-Modul für Trace-Ereignisse laden
modprobe nfnetlink_log
- Version prüfen (Trace-Unterstützung ab nftables 0.9)
nft --version
Prinzip
Das Verfolgen von Paketen erfolgt in zwei Schritten:
- Eine Regel setzt für die gewünschten Pakete das Trace-Flag.
nft monitor tracegibt die dabei entstehenden Ereignisse aus.
Das Flag wird mit meta nftrace set 1 gesetzt.
Trace-Tabelle anlegen
Die Trace-Regeln werden in einer eigenen Tabelle abgelegt. So bleibt das produktive Regelwerk unverändert und die Trace-Tabelle kann anschliessend vollständig entfernt werden.
- Tabelle anlegen
nft add table inet trace
- Chain mit hoher Priorität anlegen (läuft vor dem eigentlichen Regelwerk)
nft add chain inet trace prerouting '{ type filter hook prerouting priority -300; }'
Die Priorität -300 sorgt dafür, dass das Flag gesetzt wird, bevor
das Paket die Filter-Chains erreicht. Andernfalls werden die vorher
durchlaufenen Regeln nicht angezeigt.
Trace aktivieren
Das Trace-Flag sollte immer möglichst eng eingegrenzt werden. Ein Trace ohne Filter erzeugt auf einem produktiven System sofort unbrauchbare Datenmengen.
- Einzelnen Host verfolgen
nft add rule inet trace prerouting ip saddr 192.168.2XX.10 meta nftrace set 1
- Einzelnen Dienst verfolgen
nft add rule inet trace prerouting tcp dport 443 meta nftrace set 1
- Kombination aus Quelle und Ziel
nft add rule inet trace prerouting ip saddr 192.168.2XX.10 ip daddr 192.168.2XX.20 meta nftrace set 1
- ICMP verfolgen (für Tests mit ping)
nft add rule inet trace prerouting ip protocol icmp meta nftrace set 1
Ausgabe anzeigen
- Trace-Ereignisse anzeigen
nft monitor trace
- Ausgabe im JSON-Format
nft -j monitor trace
Das Kommando läuft im Vordergrund und wird mit Strg+C beendet.
Ausgabe lesen
Eine typische Zeile sieht so aus:
trace id 3f2a1b8c inet filter input packet: iif "ens18" ether saddr 52:54:00:1a:2b:3c ip saddr 192.168.2XX.10 ip daddr 192.168.2XX.20 ip protocol tcp tcp dport 22 trace id 3f2a1b8c inet filter input rule ct state established,related accept (verdict accept)
- trace id
- Eindeutige Kennung eines Pakets. Alle Zeilen mit derselben ID gehören zum selben Paket.
- inet filter input
- Family, Tabelle und Chain, in der das Ereignis auftritt.
- packet
- Die Kopfdaten des Pakets. Diese Zeile erscheint einmal pro Chain.
- rule ...
- Die Regel, auf die das Paket zutrifft, gefolgt vom Verdict.
- verdict
- Das Ergebnis:
accept,drop,continueoder ein Sprung in eine andere Chain.
Wird ein Paket verworfen, endet die Kette der Ereignisse mit
(verdict drop). Fehlt die erwartete Regel in der Ausgabe
vollständig, wurde das Paket vorher bereits von einer anderen Regel behandelt.
Trace beenden
Die Trace-Tabelle wird vollständig entfernt. Das produktive Regelwerk bleibt dabei unberührt.
- Trace-Tabelle löschen
nft delete table inet trace
- Prüfen, ob keine Trace-Regeln mehr aktiv sind
nft list ruleset | grep nftrace
Übung
- Auf it2XX eine Trace-Tabelle nach obigem Muster anlegen.
- Das Trace-Flag für ICMP von der Adresse eines Nachbarsystems setzen.
nft monitor tracestarten und vom Nachbarsystem aus einen Ping absetzen.- Die durchlaufenen Chains und das Verdict notieren.
- Eine Drop-Regel für ICMP in die Filter-Chain einfügen und den Ping wiederholen.
- Die Ausgabe mit dem vorherigen Durchlauf vergleichen.
- Die Trace-Tabelle entfernen.
Hinweise
- Trace-Ereignisse werden über nfnetlink an den Userspace gesendet. Bei hohem Paketaufkommen können Ereignisse verloren gehen.
- Auf produktiven Systemen ist das Trace-Flag immer auf eine einzelne Adresse oder einen einzelnen Port einzugrenzen.
- Die Trace-Tabelle nach der Fehlersuche entfernen. Ein vergessenes Trace-Flag erzeugt dauerhaft Last.
- Für dauerhafte Protokollierung ist
login der jeweiligen Regel geeigneter als ein Trace.