
Uno strumento di monitoraggio delle connessioni di rete in tempo reale costruito con Rust e GTK4, che mostra le connessioni attive con statistiche I/O in tempo reale in un'interfaccia grafica moderna.
# Network Monitor  Uno strumento di monitoraggio delle connessioni di rete in tempo reale realizzato con Rust e GTK4, che visualizza le connessioni attive con statistiche I/O in tempo reale in un'interfaccia grafica moderna. [](https://github.com/grigio/network-monitor/actions/workflows/rust.yml) [](https://deps.rs/repo/github/grigio/network-monitor) ## Funzionalità - **Monitoraggio in tempo reale**: monitora continuamente le connessioni di rete attive - **Statistiche I/O**: mostra le velocità di upload/download in tempo reale per ogni connessione - **Identificazione dei processi**: visualizza il programma e il PID associati a ciascuna connessione - **Azioni sui processi**: fai clic con il tasto destro su una riga per copiarne il valore/comando o per terminare il processo che possiede la connessione (Terminate o Force Kill, con conferma) - **Selezione persistente**: la riga selezionata mantiene la sua evidenziazione tra i vari aggiornamenti ed è mostrata nella barra di stato - **Interfaccia GTK4 moderna**: interfaccia grafica pulita e reattiva con stile Libadwaita - **Interfaccia terminale (TUI)**: interfaccia terminale interattiva con le stesse capacità di monitoraggio - **Risoluzione degli indirizzi**: semplifica gli indirizzi comuni (localhost, any, mDNS) - **Filtro delle connessioni**: filtra le connessioni localhost per un output più pulito - **Integrazione con GNOME**: supporto corretto della WM class per il pinning nel dock e l'integrazione con il desktop - **Doppia installazione**: supporta sia l'installazione locale all'utente che a livello di sistema - **Gestione robusta degli errori**: recupero completo dagli errori con chiare indicazioni di configurazione - **Prestazioni ottimizzate**: caching dei processi e del layout per una reattività migliorata ## Requisiti - Rust 1.70+ (edizione 2021) - Librerie di sviluppo GTK4 - Librerie di sviluppo Libadwaita - Sistema Linux con filesystem `/proc` - Linux 5.8+ (per le capacità granulari eBPF) - Rust nightly e `bpf-linker` (per la compilazione eBPF) ### Installazione su Ubuntu/Debian: ```bash sudo apt update sudo apt install libgtk-4-dev libadwaita-1-dev ``` ### Installazione su Fedora: ```bash sudo dnf install gtk4-devel libadwaita-devel ``` ## Installazione ### Metodo 1: Installazione dal sorgente con integrazione desktop 1. Clona il repository: ```bash git clone <repository-url> cd network-monitor ``` 2. Installa localmente (sudo non richiesto): ```bash ./scripts/install.sh ``` 3. Oppure installa a livello di sistema (richiede sudo): ```bash sudo ./scripts/install.sh ``` Lo script di installazione: - Compila sia i binari GTK4 che TUI (debug per locale, release per sistema) - Installa i binari in `~/.local/bin/` (locale) o `/usr/local/bin/` (sistema) - Installa il file desktop con la WM class corretta per il pinning nel dock di GNOME - Installa le icone nelle directory appropriate - Aggiorna la cache delle icone e il database desktop - Assicura che l'applicazione possa essere aggiunta al dock/dashboard di GNOME ### Metodo 2: Compilazione ed esecuzione diretta 1. Clona il repository: ```bash git clone <repository-url> cd network-monitor ``` 2. Compila ed esegui: ```bash cargo run ``` Oppure compila in modalità release: ```bash cargo build --release ./target/release/network-monitor ``` ### Metodo 3: Compilazione ed esecuzione della versione TUI 1. Clona il repository: ```bash git clone <repository-url> cd network-monitor ``` 2. Compila ed esegui la TUI: ```bash cargo build --bin nmt ./target/debug/nmt ``` Oppure compila in modalità release: ```bash cargo build --release --bin nmt ./target/release/nmt ``` ## Disinstallazione ### Rimuovere la versione installata Rimozione dell'installazione locale: ```bash ./scripts/uninstall.sh ``` Rimozione a livello di sistema (richiede sudo): ```bash sudo ./scripts/uninstall.sh ``` Lo script di disinstallazione rimuove il binario, il file desktop e le icone dalle posizioni appropriate e aggiorna tutte le cache rilevanti. ## Utilizzo ### Interfaccia grafica GTK4 Avvia l'applicazione di monitoraggio della rete: ```bash cargo run ``` L'applicazione aprirà una finestra GTK4 che mostra: - **Process(ID)**: nome del processo e PID con una mappatura accurata socket-processo - **Protocol**: protocollo TCP/UDP - **Source**: endpoint locale (risolto in un formato leggibile) - **Destination**: endpoint remoto (risolto in un formato leggibile) - **Status**: stato della connessione (ESTABLISHED, LISTEN, ecc.) - **TX**: velocità di upload calcolata dalle statistiche I/O del processo - **RX**: velocità di download calcolata dalle statistiche I/O del processo - **Path**: percorso completo del comando e argomenti da `/proc/[pid]/cmdline` **Azioni sulle righe** - **Clic sinistro**: seleziona una riga (mostrata anche nella barra inferiore) - **Clic destro**: apre il menu contestuale con *Copy Value*, *Copy Command* e *Kill "process" (PID)*, che chiede se Terminate (SIGTERM) o Force Kill (SIGKILL) - **Delete**: termina la riga attualmente selezionata (stessa finestra di conferma) - **Ctrl+C**: copia il contenuto della cella - **Pulsante Refresh** nella barra dell'intestazione: aggiorna immediatamente (la lista si aggiorna anche ogni 3s) ### Interfaccia terminale (TUI)  Avvia l'interfaccia terminale: ```bash cargo run --bin nmt ``` La TUI fornisce le stesse capacità di monitoraggio in un'interfaccia terminale interattiva: **Controlli da tastiera:** - `q` - Esce dall'applicazione - `r` - Attiva/disattiva la risoluzione dei nomi host - `R` - Aggiorna manualmente le connessioni - `a` - Attiva/disattiva l'aggiornamento automatico (intervalli di 2 secondi) - `↑/↓` - Naviga tra le connessioni - `←/→` - Scorri la tabella orizzontalmente - `k` / **clic destro** - Apre il menu di terminazione per una riga (Terminate / Force Kill / Cancel) - `1-8` - Ordina per colonne (Process(ID), Protocol, Source, Destination, Status, TX, RX, Path) Mouse: il clic sinistro seleziona una riga, il clic destro la seleziona e apre il menu di terminazione. **Funzionalità:** - Monitoraggio delle connessioni in tempo reale con aggiornamento automatico - Colonne ordinabili con indicatori visivi - Scorrimento orizzontale per tabelle larghe - Dimensionamento intelligente delle colonne - l'ultima colonna occupa tutta la larghezza rimanente - Protocolli con codice colore (TCP/TCP6 in verde, UDP/UDP6 in giallo) - Evidenziazione delle connessioni attive - Informazioni su processo e PID - Visualizzazione della velocità I/O in tempo reale - Stesso ordine delle colonne della versione GTK4 per coerenza ### Risoluzione degli indirizzi Gli indirizzi comuni sono semplificati per la leggibilità: - `0.0.0.0:*` o `*:*` → `ANY` - `127.0.0.1:*` o `[::1]:*` → `LOCALHOST` - `224.0.0.251:*` → `MDNS` ## Come funziona ### Backend eBPF (event-driven) L'app utilizza kprobe a livello kernel (`tcp_v4_connect`, `tcp_v6_connect`, `tcp_close`, `inet_csk_accept`) invece del polling di `/proc/net`. Questo fornisce: - **Event-driven**: consegna degli eventi in meno di un millisecondo, nessun overhead di polling (~1-3% CPU) - **PID diretto**: catturato al punto di probe tramite `bpf_get_current_pid_tgid()`, nessuna scansione degli inode - **Connessioni di breve durata**: mai perse tra gli intervalli di polling ### Modalità eBPF Il backend eBPF fornisce un monitoraggio delle connessioni **event-driven** con un overhead inferiore ed eventi in tempo reale, rispetto all'approccio predefinito di polling di `/proc/net`. Può catturare connessioni di breve durata che il polling potrebbe perdere. **Prerequisiti:** ```bash rustup toolchain install nightly cargo install bpf-linker ``` **Compila ed esegui:** ```bash cargo build ``` **Esegui come utente normale** (richiede kernel 5.8+): Concedi le capacità Linux richieste al binario una volta sola: ```bash sudo setcap cap_bpf,cap_net_admin,cap_perfmon+ep target/debug/network-monitor ./target/debug/network-monitor ``` Oppure per la versione TUI: ```bash sudo setcap cap_bpf,cap_net_admin,cap_perfmon+ep target/debug/nmt ./target/debug/nmt ``` Per le build release, modifica il percorso di conseguenza: ```bash sudo setcap cap_bpf,cap_net_admin,cap_perfmon+ep target/release/network-monitor ``` L'app terminerà con un messaggio di configurazione se eBPF non è disponibile (capacità mancanti o kernel non supportato). ## Architettura - **GTK4**: framework GUI moderno e multipiattaforma - **Libadwaita**: componenti UI in stile GNOME - **Tokio**: runtime asincrono per operazioni concorrenti - **Aya + eBPF**: tracciamento delle connessioni a livello kernel con kprobe per eventi in tempo reale - **PID diretto**: identificazione del processo tramite `bpf_get_current_pid_tgid()` al punto di probe - **Chiamate di sistema**: lettura diretta di `/proc/[pid]/io` per le statistiche I/O - **Gestione degli errori**: tipi di errore completi con recupero graduale tramite `thiserror` - **Caching delle prestazioni**: caching del layout UI per prestazioni ottimali ## Pacchetti Linux [](https://repology.org/project/network-monitor/versions) ## Donazioni Se trovi utile questo progetto, considera di fare una donazione per supportarne lo sviluppo. - **Monero**: `88LyqYXn4LdCVDtPWKuton9hJwbo8ZduNEGuARHGdeSJ79BBYWGpMQR8VGWxGDKtTLLM6E9MJm8RvW9VMUgCcSXu19L9FSv` - **Bitcoin**: `bc1q6mh77hfv8x8pa0clzskw6ndysujmr78j6se025` ## Licenza Questo progetto è open source. Consulta il file LICENSE per i dettagli.