Nft monitor trace

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen

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:

  1. Eine Regel setzt für die gewünschten Pakete das Trace-Flag.
  2. nft monitor trace gibt 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, continue oder 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

  1. Auf it2XX eine Trace-Tabelle nach obigem Muster anlegen.
  2. Das Trace-Flag für ICMP von der Adresse eines Nachbarsystems setzen.
  3. nft monitor trace starten und vom Nachbarsystem aus einen Ping absetzen.
  4. Die durchlaufenen Chains und das Verdict notieren.
  5. Eine Drop-Regel für ICMP in die Filter-Chain einfügen und den Ping wiederholen.
  6. Die Ausgabe mit dem vorherigen Durchlauf vergleichen.
  7. 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 log in der jeweiligen Regel geeigneter als ein Trace.