
rustnet v1.6.0
Netzwerküberwachung pro Prozess für Ihr Terminal mit Deep Packet Inspection. Plattformübergreifend, sandboxed.
RustNet
Prozessbezogenes Netzwerk-Monitoring für dein Terminal: Live-TCP-, UDP- und QUIC-Verbindungen mit Deep Packet Inspection, standardmäßig in einer Sandbox.
Echtzeit-Einblick in jede Verbindung, die dein Rechner aufbaut, wem sie gehört und welches Protokoll sie spricht. Kein tcpdump, kein X11-Forwarding und kein Root-Piping.
Funktionen
- Prozesszuordnung: Jede TCP-, UDP- und QUIC-Verbindung wird ihrem Eigentümerprozess zugeordnet – per eBPF unter Linux, PKTAP unter macOS, ETW mit automatischem IP-Helper-Fallback unter Windows und nativen APIs unter FreeBSD. Die Details umfassen PID, ausführbare Datei, Benutzer-/Gruppennamen, Übereinstimmungsgrad und eine begrenzte Elternprozess-Kette auf jeder Plattform. Wireshark und tcpdump können das nicht;
netstat/sskönnen keinen Live-Status anzeigen. - Deep Packet Inspection: Erkennt HTTP, HTTPS/TLS mit SNI, DNS, SSH, FTP, QUIC, MQTT, BitTorrent, STUN, NTP, mDNS, LLMNR, DHCP, SNMP, SSDP und NetBIOS – ohne externe Dissectors.
- Annotierter PCAPNG-Export:
--pcapng-exportschreibt einen Wireshark-bereiten Mitschnitt mit Prozess, PID, Richtung, DPI/SNI und GeoIP als Kommentare pro Paket. Öffne ihn in Wireshark und jedes Paket nennt bereits seinen Eigentümerprozess – ganz ohne Nachbearbeitung. Klassisches--pcap-exportmit einer JSONL-Begleitdatei zur Offline-Korrelation ist ebenfalls verfügbar. - Sicherheits-Sandboxing: Landlock (Linux 5.13+), Seatbelt (macOS), Token-Privilegienabsenkung + Job-Object-Blockierung von Kindprozessen (Windows). Senkt die Privilegien sofort nach der Initialisierung von libpcap. Siehe SECURITY.md.
- Netzwerkanalysen: Echtzeit-Umlaufzeiten für TCP, QUIC-Handshakes, DNS-Antworten und ICMP-Echo sowie Erkennung von TCP-Wiederholungen, Paketen in falscher Reihenfolge und Fast Retransmit.
- Intelligenter Verbindungslebenszyklus: Protokollbewusste Timeouts mit Weiß-→-Gelb-→-Rot-Anzeigen für veraltete Verbindungen. Mit
tlassen sich historische (geschlossene) Verbindungen für Forensik-Zwecke sichtbar halten. - Filtern im Vim/fzf-Stil:
port:,src:,dst:,sni:,process:,state:,proto:sowie Regex über/(?i)pattern/. - GeoIP-Anreicherung: Länderabfragen über lokale MaxMind-GeoLite2-Daten. Keine Netzwerkaufrufe.
- LAN-Geräteidentifikation: MAC-Adresse und Hersteller (aus der eingebetteten IEEE-OUI-Datenbank) für direkt erreichbare Peers und das Gateway, passiv aus ARP-Datenverkehr gelernt und im Detailbereich angezeigt.
- Kubernetes-Zuordnung (optionales
kubernetes-Feature): Verbindungen werden ihrem Pod, Namespace und Container zugeordnet und im Detailbereich, in JSON-/PCAPNG-Exporten sowie in den Filternpod:,ns:,container:angezeigt. Im offiziellen Docker-Image aktiviert; in einem Cluster kannst du das kubectl-rustnet-Plugin verwenden, um es als ephemeren Debug-Pod auszuführen. Siehe USAGE.md. - Plattformübergreifend: Linux, macOS, Windows, FreeBSD.
Warum RustNet?
RustNet schließt die Lücke zwischen einfachen Verbindungswerkzeugen (netstat, ss) und Paketanalysatoren (Wireshark, tcpdump):
- Prozesszuordnung: Sieh, welche Anwendung jede Verbindung besitzt. Wireshark kann das nicht bieten, weil es nur Pakete sieht, keine Sockets.
- Verbindungszentrierte Ansicht: Verfolge Zustände, Bandbreite und Protokolle pro Verbindung in Echtzeit
- SSH-freundlich: Die TUI funktioniert über SSH, sodass du schnell sehen kannst, was auf einem entfernten Server passiert – ohne X11-Weiterleitung oder Datenverkehrsmitschnitt.
RustNet ergänzt Paketmitschnitt-Werkzeuge. Nutze RustNet, um zu sehen, was Verbindungen aufbaut. Für die direkte Wireshark-Analyse schreibt --pcapng-export Live-Paketkommentare mit PID-/Prozesskontext nach dem Best-Effort-Prinzip. Für die Korrelation nach dem Mitschneiden verwende --pcap-export zusammen mit der JSONL-Begleitdatei und optional scripts/pcap_enrich.py. Details findest du unter PCAP-Export und Vergleich mit ähnlichen Werkzeugen.
Basiert auf ratatui, libpcap, eBPF (libbpf-rs), DashMap, crossbeam, ring, MaxMind GeoLite2 und Landlock. Die vollständige Aufschlüsselung der Abhängigkeiten findest du in ARCHITECTURE.md.
eBPF-erweiterte Prozessidentifikation (Linux-Standard)
RustNet verwendet unter Linux standardmäßig eBPF-Programme im Kernel für eine bessere Leistung und Prozessidentifikation mit geringerem Overhead.
Prozessnamen:
- eBPF zeichnet die TGID und den
comm-Namen des Prozessgruppen-Leiters auf (ein auf 16 Zeichen begrenztes Kernel-Feld) statt des Namens des aktiven Threads. Dadurch zeigen mehrthreadige Anwendungen den Hauptprozessnamen statt Threadnamen wie „Socket Thread“. - RustNet ermittelt anschließend den aktuellen Namen erneut über
/proc/<tgid>/comm, stellt gekürztecomm-Namen aus dem Dateinamen der ausführbaren Datei wieder her (z. B. wird aus „chromium-browse“ „chromium-browser“) und löst den vollständigen Pfad der ausführbaren Datei auf, der in der Detailansicht angezeigt wird. - Kurzlebige Prozesse, die beendet werden, bevor diese Anreicherung greift, behalten den per eBPF erfassten 16-Zeichen-Namen.
Fallback-Verhalten:
- Wenn eBPF nicht geladen werden kann oder die Berechtigungen nicht ausreichen, fällt RustNet automatisch auf die standardmäßige Prozessidentifikation über procfs zurück.
- Der Standardmodus löst Namen auf demselben Weg per procfs-Scan auf, allerdings mit höherem CPU-Aufwand.
- eBPF ist standardmäßig aktiviert; es sind keine besonderen Build-Flags nötig.
Um eBPF zu deaktivieren und den reinen procfs-Modus zu verwenden, erstelle mit:
cargo build --release --no-default-features
Technische Informationen findest du in ARCHITECTURE.md.
Prozessaktivität und Schnittstellenüberwachung
RustNet kombiniert Verkehrsaufzeichnung auf Prozessebene mit Echtzeit-Statistiken der Netzwerkschnittstellen:
- Tab „Übersicht“: Zeigt aktive Schnittstellen mit aktuellen Raten, Fehlern und Verlusten
- Tab „Aktivität“ (Taste
3): Sortiert Prozesse nach Egress (TX) oder Ingress (RX), einschließlich aufbewahrtem und rollierendem Datenverkehr, Raten, Anteilen, Verbindungen und Zielen - Security-Workflow: Sortiere nach Egress, identifiziere einen unerwarteten Uploader und prüfe dann seinen wichtigsten entfernten Peer sowie den aufbewahrten Datenverkehr, selbst nachdem die Verbindung geschlossen wurde.
- Schnittstellendetails (Taste
iim Tab „Aktivität“): Zeigt die ursprünglichen umfassenden Metriken für jede Schnittstelle - Plattformübergreifend: Linux (sysfs), macOS/FreeBSD (getifaddrs), Windows (GetIfTable2-API)
- Intelligentes Filtern: Windows schließt virtuelle/Filter-Adapter automatisch aus
Ausführliche Dokumentation zur Interpretation der Schnittstellenstatistiken und zum plattformspezifischen Verhalten findest du in USAGE.md.
Verfügbare Metriken:
- Gesamte Bytes und Pakete (RX/TX)
- Fehlerzähler (Empfang und Senden)
- Paketverluste (Warteschlangenüberläufe)
- Kollisionen (veraltet, in modernen Netzwerken selten genutzt)
Die Statistiken werden alle 2 Sekunden in einem Hintergrund-Thread mit minimaler Leistungsbeeinträchtigung gesammelt.
Screenshots
| Übersicht Verbindungstabelle mit Live-Statistiken und Sparklines ![]() | Details Pro-Verbindungs-SNI, Cipher, GeoIP, DPI ![]() |
| Diagramm Verkehrsdiagramm, App-Verteilung, Top-Prozesse ![]() | Aktivität Prozess-Egress/Ingress, 60-Sekunden-Abdeckung, Zuordnung und entfernte Peers ![]() |
Schnellstart
Installation
Homebrew (macOS / Linux):
brew install rustnet
Ubuntu (22.04 LTS+) / Linux Mint 21+ / Pop!_OS 22.04+:
sudo add-apt-repository ppa:domcyrus/rustnet
# on Pop!_OS: sudo apt-manage add ppa:domcyrus/rustnet
sudo apt update && sudo apt install rustnet
Fedora (42+):
sudo dnf copr enable domcyrus/rustnet
sudo dnf install rustnet
openSUSE Tumbleweed:
sudo zypper addrepo https://download.opensuse.org/repositories/home:/domcyrus:/rustnet/openSUSE_Tumbleweed/home:domcyrus:rustnet.repo
sudo zypper refresh
sudo zypper install rustnet
Arch Linux:
sudo pacman -S rustnet
Nix / NixOS:
nix-shell -p rustnet
# Then inside the shell: sudo rustnet
Von crates.io:
cargo install rustnet-monitor
Windows (Chocolatey):
# Run in Administrator PowerShell
# Requires Npcap (https://npcap.com) installed with "WinPcap API-compatible Mode" enabled
choco install rustnet
Andere Plattformen:
- FreeBSD: Lade von den rustnet-bsd-Releases herunter
- Docker, Quellcode-Builds, andere Linux-Distributionen: Detaillierte Anweisungen findest du in INSTALL.md
RustNet ausführen
Paketmitschnitt erfordert erhöhte Rechte:
# Quick start (all platforms)
sudo rustnet
# Linux: Grant capabilities to run without sudo (recommended)
sudo setcap 'cap_net_raw,cap_bpf,cap_perfmon+eip' $(which rustnet)
rustnet
Häufige Optionen:
rustnet -i eth0 # Specify network interface
rustnet --show-localhost # Show localhost connections
rustnet --no-resolve-dns # Disable reverse DNS lookups (enabled by default)
rustnet -r 500 # Set refresh interval (ms)
rustnet --theme tokyo-night # Theme: muted (default), vivid, catppuccin-mocha, tokyo-night, gruvbox, nord
rustnet --pcapng-export capture.pcapng # Annotated PCAPNG for Wireshark
Das Theme und individuelle Farbüberschreibungen können auch in ~/.config/rustnet/config.toml festgelegt werden; --theme hat Vorrang. Das Schema findest du in USAGE.md.
Detaillierte Berechtigungseinrichtung findest du in INSTALL.md und alle Optionen in USAGE.md.
Falls du Capabilities gesetzt hast, die TUI aber weiterhin
eBPF unavailableanzeigt, siehe eBPF Unavailable Despite Capabilities Being Set im Abschnitt zur Fehlerbehebung.
Tastatursteuerung
| Key | Aktion |
|---|---|
q | Beenden (zweimal drücken zum Bestätigen) |
Ctrl+C | Sofort beenden |
x | Alle Verbindungen löschen (zweimal drücken zum Bestätigen) |
Tab oder ] | Nächster Tab |
Shift+Tab oder [ | Vorheriger Tab |
1–5 | Zu Übersicht / Details / Aktivität / Diagramm / Hilfe springen |
↑/k ↓/j | Nach oben/unten navigieren |
g G | Zur ersten/letzten Verbindung springen |
Enter | Verbindungsdetails anzeigen |
Esc | Zurückgehen oder Filter löschen |
c | Entfernte Adresse kopieren |
p | Dienstnamen/Ports umschalten |
d | Hostnamen/IPs in der Übersicht oder Egress/Ingress in der Aktivität umschalten |
s S | Sortierspalten durchschalten / Richtung umschalten |
a | Prozessgruppierung umschalten |
Space | Prozessgruppe erweitern/einklappen |
←/→ oder h/l | Gruppe einklappen/erweitern |
PageUp/PageDown oder Ctrl+B/F | Seitennavigation |
t | Historische (geschlossene) Verbindungen umschalten |
i | Systeminfo in der Übersicht oder Schnittstellendetails in der Aktivität umschalten |
r | Ansicht zurücksetzen (Gruppierung, Sortierung, Filter) |
/ | Filtermodus öffnen |
h | Hilfe umschalten |
Detaillierte Tastatursteuerungen und Navigationstipps findest du in USAGE.md.
Filtern & Sortieren
Schnelle Filterbeispiele:
/google # Search for "google" anywhere
/port:443 # Filter by port
/process:firefox # Filter by process
/state:established # Filter by connection state
/dport:443 sni:github.com # Combine filters
Sortieren:
- Drücke
s, um die sortierbaren Spalten durchzuschalten (Prozess, Adressen, Dienst, Anwendung, Status, Bandbreite) - Drücke
S(Umschalt+s), um die Sortierrichtung umzuschalten - Bandbreitenfresser finden: Drücke
s, bis „Bandwidth Total ↓“ erscheint (sortiert nach kombinierter Upload-/Download-Geschwindigkeit)
Die vollständige Filtersyntax und den Sortierleitfaden findest du in USAGE.md.
Erweiterte Filterbeispiele
Stichwortfilter:
port:44– Ports, die „44“ enthalten (443, 8080, 4433)sport:80– Quellports, die „80“ enthaltendport:443– Zielports, die „443“ enthaltensrc:192.168– Quell-IPs, die „192.168“ enthaltendst:github.com– Ziele, die „github.com“ enthaltenprocess:ssh– Prozessnamen, die „ssh“ enthaltensni:api– SNI-Hostnamen, die „api“ enthaltenapp:openssh– SSH-Verbindungen, die OpenSSH verwendenstate:established– Nach Protokollstatus filternproto:tcp– Nach Protokolltyp filtern
Statusfilter:
state:syn_recv– Halboffene Verbindungen (SYN-Flood-Erkennung)state:established– Nur bestehende Verbindungenstate:quic_connected– Aktive QUIC-Verbindungenstate:dns_query– DNS-Abfrageverbindungen
Kombinierte Beispiele:
sport:80 process:nginx– Nginx-Verbindungen von Port 80dport:443 sni:google.com– HTTPS zu Googleprocess:firefox state:quic_connected– Firefox-QUIC-Verbindungendport:22 app:openssh state:established– Bestehende OpenSSH-Verbindungen
Verbindungslebenszyklus & visuelle Indikatoren
RustNet verwendet intelligente Timeouts und visuelle Warnungen, bevor Verbindungen entfernt werden:
Visuelle Veraltungsanzeigen:
- Weiß: Aktiv (< 75 % des Timeouts)
- Gelb: Veraltet (75–90 % des Timeouts)
- Rot: Kritisch (> 90 % des Timeouts)
Protokollbewusste Timeouts:
- HTTP/HTTPS: 10 Minuten (unterstützt Keep-Alive)
- SSH: 30 Minuten (lange Sitzungen)
- Allgemein etabliertes TCP: 5 Minuten
- QUIC verbunden: 3 Minuten (oder der Idle-Timeout des Transport-Parameters vom Peer, falls vorhanden);
Initial/Handshaking: 60 Sekunden - DNS: 30 Sekunden
- TCP CLOSED: 15 Sekunden Archivierungsfrist
Beispiel: Eine HTTP-Verbindung wird nach 7,5 Minuten gelb, nach 9 Minuten rot und nach 10 Minuten entfernt.
Vollständige Details zu den Timeouts findest du in USAGE.md.
Dokumentation
- INSTALL.md – Detaillierte Installationsanweisungen für alle Plattformen, Berechtigungseinrichtung und Fehlerbehebung
- USAGE.md – Vollständiger Benutzerleitfaden einschließlich Befehlszeilenoptionen, Filtern, Sortieren und Protokollierung
- SECURITY.md – Sicherheitsfunktionen einschließlich Landlock-Sandboxing und Berechtigungsverwaltung
- ARCHITECTURE.md – Technische Architektur, Plattformimplementierungen und Leistungsdetails
- CONTRIBUTING.md – Beitrags-Workflow, Qualitätsanforderungen und Projektrichtlinien
- PROFILING.md – Leitfaden zur Leistungsanalyse mit Flamegraph-Einrichtung und Optimierungstipps
- ROADMAP.md – Geplante Funktionen und zukünftige Verbesserungen
- RELEASE.md – Release-Prozess für Maintainer
Mitwirken
Beiträge sind willkommen! Richtlinien für die Mitarbeit findest du in CONTRIBUTING.md.
Eine Liste der Personen, die zu diesem Projekt beigetragen haben, findest du in CONTRIBUTORS.md.
Lizenz
Dieses Projekt ist unter der Apache License, Version 2.0 lizenziert – siehe die Datei LICENSE für Details.
Danksagungen
- Erstellt mit ratatui für die Terminal-Benutzeroberfläche
- Paketmitschnitt unterstützt durch libpcap
- Inspiriert von Werkzeugen wie
tshark/wireshark/tcpdump,sniffnet,netstat,ss,iftopund bandwhich - Ein Teil des Codes ist vibe-coded (OMG) / mögen die LLM-Götter mit dir sein
Dokumentation verschoben
Einige Abschnitte wurden zur besseren Organisation in eigene Dateien verschoben:
- Berechtigungseinrichtung: Jetzt in INSTALL.md – Berechtigungseinrichtung
- Installationsanweisungen: Jetzt in INSTALL.md
- Detaillierte Verwendung: Jetzt in USAGE.md
- Architekturdetails: Jetzt in ARCHITECTURE.md



