
Инструмент мониторинга сетевых подключений в реальном времени, созданный на Rust и GTK4, отображающий активные подключения с живой статистикой ввода/вывода в современном графическом интерфейсе.
# Network Monitor  Инструмент мониторинга сетевых соединений в реальном времени, созданный на Rust и GTK4, отображающий активные соединения с живой статистикой ввода-вывода в современном графическом интерфейсе. [](https://github.com/grigio/network-monitor/actions/workflows/rust.yml) [](https://deps.rs/repo/github/grigio/network-monitor) ## Возможности - **Мониторинг в реальном времени**: Непрерывно отслеживает активные сетевые соединения - **Статистика ввода-вывода**: Показывает живые скорости загрузки/отдачи для каждого соединения - **Идентификация процессов**: Отображает программу и PID, связанные с каждым соединением - **Действия с процессами**: Правый клик по строке для копирования её значения/команды или завершения процесса, владеющего соединением (Terminate или Force Kill, с подтверждением) - **Сохранение выделения**: Выделенная строка сохраняет подсветку между обновлениями и отображается в строке состояния - **Современный интерфейс GTK4**: Чистый, отзывчивый графический интерфейс в стиле Libadwaita - **Терминальный интерфейс (TUI)**: Интерактивный терминальный интерфейс с теми же возможностями мониторинга - **Разрешение адресов**: Упрощает распространённые адреса (localhost, any, mDNS) - **Фильтрация соединений**: Отфильтровывает соединения localhost для более чистого вывода - **Интеграция с GNOME**: Правильная поддержка WM class для закрепления в доке и интеграции с рабочим столом - **Двойная установка**: Поддерживает как локальную для пользователя, так и общесистемную установку - **Надёжная обработка ошибок**: Комплексное восстановление после ошибок с понятными инструкциями по настройке - **Оптимизация производительности**: Кэширование процессов и компоновки для улучшенной отзывчивости ## Требования - Rust 1.70+ (редакция 2021) - Библиотеки разработки GTK4 - Библиотеки разработки Libadwaita - Система Linux с файловой системой `/proc` - Linux 5.8+ (для гранулярных возможностей eBPF) - Nightly Rust и `bpf-linker` (для компиляции eBPF) ### Установка на Ubuntu/Debian: ```bash sudo apt update sudo apt install libgtk-4-dev libadwaita-1-dev ``` ### Установка на Fedora: ```bash sudo dnf install gtk4-devel libadwaita-devel ``` ## Установка ### Способ 1: Установка из исходников с интеграцией в рабочий стол 1. Клонируйте репозиторий: ```bash git clone <repository-url> cd network-monitor ``` 2. Установите локально (без sudo): ```bash ./scripts/install.sh ``` 3. Или установите общесистемно (требуется sudo): ```bash sudo ./scripts/install.sh ``` Скрипт установки выполнит: - Сборку бинарников GTK4 и TUI (debug для локальной, release для общесистемной установки) - Установку бинарников в `~/.local/bin/` (локально) или `/usr/local/bin/` (общесистемно) - Установку desktop-файла с правильным WM class для закрепления в доке GNOME - Установку иконок в соответствующие каталоги иконок - Обновление кэша иконок и базы данных рабочего стола - Обеспечение возможности закрепления приложения в доке/панели GNOME ### Способ 2: Сборка и запуск напрямую 1. Клонируйте репозиторий: ```bash git clone <repository-url> cd network-monitor ``` 2. Соберите и запустите: ```bash cargo run ``` Или соберите в режиме release: ```bash cargo build --release ./target/release/network-monitor ``` ### Способ 3: Сборка и запуск версии TUI 1. Клонируйте репозиторий: ```bash git clone <repository-url> cd network-monitor ``` 2. Соберите и запустите TUI: ```bash cargo build --bin nmt ./target/debug/nmt ``` Или соберите в режиме release: ```bash cargo build --release --bin nmt ./target/release/nmt ``` ## Удаление ### Удаление установленной версии Удаление локальной установки: ```bash ./scripts/uninstall.sh ``` Общесистемное удаление (требуется sudo): ```bash sudo ./scripts/uninstall.sh ``` Скрипт удаления удалит бинарник, desktop-файл и иконки из соответствующих мест и обновит все необходимые кэши. ## Использование ### Графический интерфейс GTK4 Запустите приложение мониторинга сети: ```bash cargo run ``` Приложение откроет окно GTK4, отображающее: - **Process(ID)**: Имя процесса и PID с точным сопоставлением сокета процессу - **Protocol**: Протокол TCP/UDP - **Source**: Локальная конечная точка (в читаемом формате) - **Destination**: Удалённая конечная точка (в читаемом формате) - **Status**: Состояние соединения (ESTABLISHED, LISTEN и т.д.) - **TX**: Скорость отдачи, рассчитанная по статистике ввода-вывода процесса - **RX**: Скорость загрузки, рассчитанная по статистике ввода-вывода процесса - **Path**: Полный путь команды и аргументы из `/proc/[pid]/cmdline` **Действия со строками** - **Левый клик**: выбрать строку (также отображается в нижней строке состояния) - **Правый клик**: открыть контекстное меню с *Copy Value*, *Copy Command* и *Kill "process" (PID)*, которое спрашивает, выполнить Terminate (SIGTERM) или Force Kill (SIGKILL) - **Delete**: завершить текущую выделенную строку (тот же диалог подтверждения) - **Ctrl+C**: скопировать содержимое ячейки - **Кнопка Refresh** в заголовке окна: обновить немедленно (список также обновляется каждые 3 с) ### Терминальный интерфейс (TUI)  Запустите терминальный интерфейс: ```bash cargo run --bin nmt ``` TUI предоставляет те же возможности мониторинга в интерактивном терминальном интерфейсе: **Управление с клавиатуры:** - `q` - Выйти из приложения - `r` - Переключить разрешение имён хостов - `R` - Обновить соединения вручную - `a` - Переключить автообновление (интервал 2 секунды) - `↑/↓` - Навигация по соединениям - `←/→` - Горизонтальная прокрутка таблицы - `k` / **правый клик** - Открыть меню завершения для строки (Terminate / Force Kill / Cancel) - `1-8` - Сортировка по столбцам (Process(ID), Protocol, Source, Destination, Status, TX, RX, Path) Мышь: левый клик выбирает строку, правый клик выбирает её и открывает меню завершения. **Возможности:** - Мониторинг соединений в реальном времени с автообновлением - Сортируемые столбцы с визуальными индикаторами - Горизонтальная прокрутка для широких таблиц - Умный подбор ширины столбцов - последний столбец занимает всю оставшуюся ширину - Цветовая кодировка протоколов (TCP/TCP6 зелёным, UDP/UDP6 жёлтым) - Подсветка активного соединения - Информация о процессе и PID - Отображение скорости ввода-вывода в реальном времени - Тот же порядок столбцов, что и в версии GTK4, для единообразия ### Разрешение адресов Распространённые адреса упрощаются для читаемости: - `0.0.0.0:*` или `*:*` → `ANY` - `127.0.0.1:*` или `[::1]:*` → `LOCALHOST` - `224.0.0.251:*` → `MDNS` ## Как это работает ### Бэкенд eBPF (событийно-ориентированный) Приложение использует kprobes уровня ядра (`tcp_v4_connect`, `tcp_v6_connect`, `tcp_close`, `inet_csk_accept`) вместо опроса `/proc/net`. Это обеспечивает: - **Событийно-ориентированность**: Доставка событий менее чем за миллисекунду, без накладных расходов на опрос (~1-3% CPU) - **Прямой PID**: Захватывается в точке пробы через `bpf_get_current_pid_tgid()`, без сканирования inode - **Короткоживущие соединения**: Никогда не пропускаются между интервалами опроса ### Режим eBPF Бэкенд eBPF обеспечивает **событийно-ориентированный** мониторинг соединений с меньшими накладными расходами и событиями в реальном времени по сравнению с подходом опроса `/proc/net` по умолчанию. Он может захватывать короткоживущие соединения, которые опрос может пропустить. **Предварительные требования:** ```bash rustup toolchain install nightly cargo install bpf-linker ``` **Сборка и запуск:** ```bash cargo build ``` **Запуск от обычного пользователя** (требуется ядро 5.8+): Один раз предоставьте бинарнику необходимые возможности Linux: ```bash sudo setcap cap_bpf,cap_net_admin,cap_perfmon+ep target/debug/network-monitor ./target/debug/network-monitor ``` Или для версии TUI: ```bash sudo setcap cap_bpf,cap_net_admin,cap_perfmon+ep target/debug/nmt ./target/debug/nmt ``` Для release-сборок скорректируйте путь соответствующим образом: ```bash sudo setcap cap_bpf,cap_net_admin,cap_perfmon+ep target/release/network-monitor ``` Приложение завершится с сообщением о настройке, если eBPF недоступен (отсутствуют возможности или неподдерживаемое ядро). ## Архитектура - **GTK4**: Современный кроссплатформенный GUI-фреймворк - **Libadwaita**: UI-компоненты в стиле GNOME - **Tokio**: Асинхронная среда выполнения для параллельных операций - **Aya + eBPF**: Трассировка соединений на уровне ядра с помощью kprobes для событий в реальном времени - **Прямой PID**: Идентификация процесса через `bpf_get_current_pid_tgid()` в точке пробы - **Системные вызовы**: Прямое чтение `/proc/[pid]/io` для статистики ввода-вывода - **Обработка ошибок**: Комплексные типы ошибок с корректным восстановлением с помощью `thiserror` - **Кэширование производительности**: Кэширование компоновки UI для оптимальной производительности ## Пакеты Linux [](https://repology.org/project/network-monitor/versions) ## Пожертвования Если вы находите этот проект полезным, пожалуйста, рассмотрите возможность сделать пожертвование для поддержки его разработки. - **Monero**: `88LyqYXn4LdCVDtPWKuton9hJwbo8ZduNEGuARHGdeSJ79BBYWGpMQR8VGWxGDKtTLLM6E9MJm8RvW9VMUgCcSXu19L9FSv` - **Bitcoin**: `bc1q6mh77hfv8x8pa0clzskw6ndysujmr78j6se025` ## Лицензия Этот проект с открытым исходным кодом. Подробности см. в файле LICENSE.