
netwatch v0.28.2
Диагностика сети в реальном времени в вашем терминале. Одна команда, без настройки, мгновенная видимость.
NetWatch
Смотрите, что ваша сеть делает на самом деле, — вживую, прямо в терминале.
Сетевой монитор, который читает зашифрованный трафик, определяет процесс за каждым соединением и ловит вредоносов, связывающихся с командным центром. Один бинарный файл. Ноль настройки.
Всё сразу, с нулевым количеством служебных элементов — ни строки заголовка, ни меню, ни статус-бара. Загрузка растёт вверх от общей оси времени, отдача — вниз от неё, так что симметрия трафика — это форма, которую вы узнаёте раньше, чем прочитаете число. Цвет кодирует величину, а не серию.
…и стандартный инструмент с десятью вкладками под ним, в одной клавише V и с теми же тёплыми коллекторами — дашборд, программа за каждым сокетом, глубокий анализ пакетов, сетевая карта и то, с чем общается каждая программа.
Большинство сетевых инструментов отвечают на один вопрос — «что использует мою пропускную способность?» — и останавливаются. NetWatch идёт дальше. Он декодирует протоколы в трафике, сообщает вам, какая программа открыла каждое соединение, и отслеживает паттерны, которые означают проблемы: сканирование портов, маячковая активность вредоноса, связывающегося с командным сервером, утечка данных через DNS. Когда что-то выглядит подозрительно, одно нажатие клавиши замораживает переносимый набор доказательств, который можно приложить к отчёту об ошибке.
Воспринимайте его как один бинарный файл без настройки, который выполняет работу измерителя пропускной способности, триажного представления Wireshark и лёгкого детектора вторжений — не покидая терминала.
Он масштабируется под ваш вопрос — в обе стороны: --view dense заполняет большой терминал четырьмя окнами без служебных элементов, а netwatch --lite — это один экран 80×24 для вопроса «что сейчас использует мою сеть?»; полный вид с десятью вкладками появляется, когда ответ — «это нужно расследовать» — в одном нажатии клавиши, с тем же живым захватом.
Создан для защитников «синей команды», специалистов по инцидентам, SRE и владельцев домашних лабораторий, которым нужно видеть, что происходит прямо сейчас, а не разбирать файл захвата через час.
650+ тестов · в песочнице Landlock (Linux) · безопасно разбирает враждебный трафик
И то, чего не делает ни один другой терминальный инструмент: NetWatch узнаёт, с чем общается каждая программа на машине, превращает наблюдаемый базовый уровень в политику одним нажатием клавиши и сообщает вам в тот момент, когда программа начинает общаться с чем-то новым.
Наблюдение → продвижение → предупреждение. Базовый уровень становится политикой одним нажатием клавиши; следующий новый адрес назначения появляется как отклонение (drift).
Почему NetWatch
- 🔓 Читайте зашифрованный трафик, которым управляете — укажите
SSLKEYLOGFILEбраузера или приложения на NetWatch и наблюдайте, как открытый текст его сеансов TLS 1.3 декодируется вживую, как это делает Wireshark. Никакого прокси, никаких сертификатов, ничего посередине. - 🛰️ Узнавайте, с чем общается каждая программа, и получайте уведомление об изменениях — NetWatch отслеживает, каких адресатов достигает каждый процесс (имя хоста из ClientHello, автономная система, порт), и одним нажатием клавиши превращает наблюдаемый базовый уровень в политику исходящих соединений. После этого он предупреждает, когда программа начинает общаться с чем-то новым. Это то, что не может выразить ни одно правило межсетевого экрана:
curlраньше обращался только кapi.github.com, а сегодня обратился к чему-то ещё. Только наблюдение — он никогда не блокирует. - 🧬 Снимайте отпечаток программного обеспечения за соединением — JA4 превращает каждое рукопожатие TLS/QUIC в стабильный отпечаток, позволяя узнать конкретного клиента — или конкретный вредонос — даже если трафик зашифрован, так же, как вы узнаёте браузер по его user-agent. Отталкиваясь от отпечатка, найдите все остальные потоки от того же программного обеспечения.
- 🚨 Обнаруживайте вредоносов, связывающихся с командным центром — встроенное обнаружение C2-биконов (регулярные проверки с низким джиттером), сканирования портов и DNS-туннелирования работает в фоне без настройки. Критическое предупреждение автоматически замораживает запись, так что доказательства уже сохранены, когда вы смотрите.
- ⚙️ Называйте процесс за каждым соединением — сопоставляет каждый сокет с программой, которая его открыла, используя
ss/lsof, с опциональным kprobe eBPF на уровне ядра (Linux, функцияebpf), который также ловит короткоживущие потоки, которые опрос может пропустить. Работает везде; kprobe — это улучшение, а не требование. - 📡 Декодируйте протоколы, а не только порты — настоящий разбор L7 для TLS, QUIC, HTTP и DNS (плюс определение баннера/версии SSH) и ещё дюжины протоколов, с отслеживанием потока и таймингами рукопожатий — так вы видите
api.github.comи отпечаток JA4, а не просто «порт 443». - 🎥 Замораживайте доказательства — включите кольцевую запись и заморозьте любой инцидент в переносимый набор: пакеты плюс соединения, DNS, состояние системы и предупреждения, которые их объясняют. Создано для отчётов об ошибках и посмертных разборов.
- 🛡️ Безопасно по замыслу — после настройки NetWatch сбрасывает привилегии и запирает себя в allow-list файловой системы Landlock (Linux). Инструмент, который разбирает враждебный трафик, не может прочитать ваши SSH-ключи, профили браузера или
/etc/shadow. - 🪟 Уменьшается до одного экрана —
--liteотвечает на вопрос «что использует мою сеть и в порядке ли моё соединение?» на одном экране 80×24 с шестью клавишами, так что он помещается в SSH-сессию к Pi или в tmux-сплит. Одно нажатие клавиши разворачивает полный криминалистический вид с уже тёплыми коллекторами.
Никаких конфигурационных файлов. Никакой настройки. Флаги не требуются.
Установка```bash
brew install netwatch # macOS / Linux nix-shell -p netwatch # NixOS / Nix paru -S netwatch-tui-bin # Arch (prebuilt; netwatch-tui builds from source) scoop install netwatch # Windows cargo install netwatch-tui # anywhere with Rust
Или возьмите готовый бинарный файл из [Releases](https://github.com/matthart1983/netwatch/releases/latest).
Пакеты Nix, Arch и Scoop поддерживаются силами сообщества — спасибо им. Проблемы с упаковкой направляйте им; баги netwatch — сюда. Если пакет отстаёт от релиза, это видно на [странице Repology](https://repology.org/project/netwatch-tui/versions).
<details>
<summary><strong>Все платформы и сборка из исходников</strong></summary>
| Platform | Download |
|----------|----------|
| Linux (x86_64, Debian/Ubuntu) | [`netwatch-linux-x86_64.tar.gz`](https://github.com/matthart1983/netwatch/releases/latest) |
| Linux (aarch64, Debian/Ubuntu) | [`netwatch-linux-aarch64.tar.gz`](https://github.com/matthart1983/netwatch/releases/latest) |
| Linux (x86_64, static — Arch/Fedora/Alpine/любой дистрибутив) | [`netwatch-linux-x86_64-static.tar.gz`](https://github.com/matthart1983/netwatch/releases/latest) |
| Linux (aarch64, static — Arch/Fedora/Alpine/любой дистрибутив) | [`netwatch-linux-aarch64-static.tar.gz`](https://github.com/matthart1983/netwatch/releases/latest) |
| macOS (Intel) | [`netwatch-macos-x86_64.tar.gz`](https://github.com/matthart1983/netwatch/releases/latest) |
| macOS (Apple Silicon) | [`netwatch-macos-aarch64.tar.gz`](https://github.com/matthart1983/netwatch/releases/latest) |
Сборки Linux с `-static` включают libpcap и не имеют зависимостей времени выполнения — используйте их на Arch, Fedora, Alpine или любом дистрибутиве, где сборки по умолчанию сообщают `libpcap.so.0.8: cannot open shared object file`.
**Из исходников:**```bash
git clone https://github.com/matthart1983/netwatch.git && cd netwatch
cargo build --release
Предварительные требования: Rust 1.70+, libpcap (sudo apt install libpcap-dev в Linux, входит в macOS).
Быстрый старт```bash
netwatch # interface stats, connections, config — no privileges needed sudo netwatch # full mode — adds live packet capture + health probes
Вот и всё. Переключайте вкладки с помощью `1`–`9`, нажмите `?` для справки, `q` для выхода. Дашборд полезен уже через пять секунд; всё, что ниже, пригодится, когда нужно копнуть глубже.
> **Linux без `sudo`:** выдайте права на захват один раз и запускайте от имени обычного пользователя —
> `sudo setcap 'cap_net_raw,cap_bpf,cap_perfmon+eip' "$(which netwatch)"`. Повторяйте эту команду после каждого обновления ([подробнее](https://github.com/matthart1983/netwatch/blob/HEAD/docs/REFERENCE.md#running-without-sudo-linux)).
### Посмотрите, как он расшифровывает TLS за 60 секунд
Самый быстрый способ понять, что такое NetWatch, — посмотреть, как он читает открытый текст сеанса TLS 1.3, которым управляете *вы*:```bash
sudo netwatch # 1. launch, then open the Packets tab (4)
SSLKEYLOGFILE=/tmp/sslkeylog.txt curl https://example.com # 2. any client that exports its keys
# 3. filter the Packets tab with: decrypted:true
Расшифрованные данные приложения отображаются прямо в потоке вывода. Промах кейлога никогда не прерывает захват — такая запись просто остаётся непрозрачной. (SSLKEYLOGFILE — это тот же механизм, что использует Wireshark; он работает только с трафиком, которым управляете вы, и никогда — со сторонним или вредоносным трафиком.)
Чтение открытого текста из живой сессии TLS 1.3 — расшифровка прямо в терминале. Без прокси и без man-in-the-middle.
Посмотрите, как он ловит дрейф исходящего трафика за 60 секунд
Цикл из демо выше — в трёх командах:```bash sudo netwatch # 1. launch and open the Egress tab (0). Leave it a minute # while it learns; each process grows a list of destinations # with hostnames, autonomous systems and ports # 2. put the cursor on a process and press Enter — its observed # baseline becomes a rule in egress-policy.toml curl https://example.org # 3. same program, somewhere it has never been
Новый адрес назначения получает вердикт `✗ drift` и оповещение. Ничего не было заблокировано — суть в том, что вас *предупредили*.
Вердикты намеренно не бинарны:
| | |
|---|---|
| `✓ sni` / `✓ ip` | Совпадение с объявленным именем хоста или адресом — точно |
| `~ asn` | Совпадение только по автономной системе — это допускает *всё, чем управляет эта AS*, что для гиперскейлера практически безгранично |
| `? ech` | Encrypted ClientHello: имя скрыто намеренно, поэтому это «нельзя судить», а не «плохо» |
| `✗ drift` | Вне разрешённого списка |
| `— no rule` | Эта программа никогда не была объявлена — ничего не проверялось |
| `✗ undeclared` | Нет правила, при `strict = true` — политика заявляет себя полной, поэтому *отсутствие* и есть результат |
Правила принимают точные имена хостов, `*.wildcards`, автономные системы, CIDR-блоки (`10.0.0.0/8`) и порты. `strict = true` превращает линтер из «сообщи мне, когда моё объявленное ПО ведёт себя неправильно» в «сообщи мне, когда что-то, что я никогда не объявлял, начинает говорить» — а именно так выглядит реальная компрометация.
## Что вы получаете
Десять вкладок, переключение клавишами `1`–`9` и `0`:
| # | Вкладка | Что показывает |
|---|-----|---------------|
| 1 | **Dashboard** | Интерфейсы, график пропускной способности, топ соединений, состояние шлюза/DNS, тепловая карта задержек. Полезна уже через 5 секунд. |
| 2 | **Connections** | Каждый сокет с его процессом + PID, протоколом, состоянием, GeoIP и спарклайнами задержек. |
| 3 | **Interfaces** | Для каждого интерфейса: IPv4/IPv6, MAC, MTU, RX/TX, ошибки, потери. |
| 4 | **Packets** | Захват в реальном времени с настоящим декодированием L7, расшифровкой TLS 1.3, JA4, отслеживанием потоков по соединениям, фильтрами и экспортом PCAP. |
| 5 | **Stats** | Разбивка по протоколам в байтах + гистограмма времени рукопожатия TCP. |
| 6 | **Topology** | ASCII-карта: машина → шлюз → DNS → основные хосты, с traceroute. |
| 7 | **Timeline** | Хронология соединений с цветовой кодировкой по состоянию TCP; сюда попадают оповещения безопасности. |
| 8 | **Processes** | Рейтинг пропускной способности по процессам с RX/TX в реальном времени и количеством соединений. |
| 9 | **Insights** | *(по желанию)* отправляет снимок в локальную или облачную LLM для анализа на понятном языке. |
| 0 | **Egress** | Изучает, с чем общается каждый процесс (hostname/AS/port), превращает этот базовый уровень в политику одним нажатием клавиши, а затем предупреждает о дрейфе. Только наблюдение, ничего не блокирует. |
Вкладка Packets — это сердце форензики: глубокое декодирование протоколов, расшифровка TLS 1.3 в реальном времени, охота за угрозами на основе JA4, фильтры отображения в стиле Wireshark и захват инцидентов. **[См. полное описание возможностей →](https://github.com/matthart1983/netwatch/blob/HEAD/docs/REFERENCE.md)**
### Облегчённый режим
Десять вкладок — это инструмент оператора. Когда вопрос лишь *«что использует мою сеть и в порядке ли моё соединение?»* — одна машина, SSH-сессия к Pi, сплит в tmux — есть `--lite`:```bash
netwatch --lite # one screen, fits 80×24
Один экран, шесть клавиш. Живые графики пропускной способности, доступность и кто говорит — разверните любую строку на месте, фильтруйте по мере ввода.
Всё на одном экране: живые графики пропускной способности, доступность шлюза/DNS/интернета и основные источники трафика по процессам и хостам. Шесть клавиш — q выход, p пауза, / фильтр, ↵ развернуть источник, L назад к полному виду, ? справка.
Нажмите L в любом из видов для переключения. Оба используют одни и те же сборщики данных, поэтому переход от «что-то выглядит подозрительно» к полному виду криминалистики с десятью вкладками стоит одного нажатия клавиши — без перезапуска, без потери истории, захват продолжает работать.
Плотный вид
Другое направление: когда у вас большой терминал и хочется всё сразу, --view dense заполняет его четырьмя блоками и без украшений — без панели заголовка, без строки меню, без строки состояния. Идентичность, состояние сортировки, диапазон страниц и все горячие клавиши находятся внутри границ блоков, поэтому каждая строка несёт данные. Ему нужен минимум 130×44, и он растёт под то, что вы ему дадите: шире — больше истории на графиках и место для полных имён хостов, выше — больше интерфейсов и больше соединений.```bash
netwatch --view dense # four boxes, needs 130×44
Это экран в верхней части этого README. Ключевой элемент — **зеркальный двойной график**: загрузка растёт вверх от центральной оси времени, отдача растёт вниз от той же оси. Симметрия трафика становится формой, которую вы узнаёте, не читая цифры, — всплеск загрузки это обрыв над линией, бэкап-джоб это обрыв под ней. Обе половины построены шрифтом Брайля с двумя сэмплами на ячейку символа, и каждая ячейка окрашена по своей **высоте на графике**, а не по тому, к какой серии она принадлежит, так что серьёзность всплеска видна раньше, чем вы измерите его по оси.
Пропускная способность нарастает от холодного к яркому, потому что высокая загрузка канала — это *занятость*, а не *плохо*: насыщенный канал во время бэкапа работает. Только ограниченные значения, где высокое действительно плохо — насыщение канала, бюджет задержки на хоп — получают обработку зелёный→янтарный→красный, и их индикаторы окрашиваются по позиции вдоль шкалы, так что красная зона видна до того, как вы до неё доберётесь.
Под графиком: поканальные скорости с мини-графиками за 60 секунд, бюджеты задержки на четыре хопа (шлюз, DNS, интернет и самый медленный peer, с которым вы реально общаетесь), и таблица соединений с деталями выбранной строки, поднятыми в верхнюю часть того же окна — ни нового экрана, ни кнопки «назад». Строка деталей несёт состояние TCP из ядра — `cwnd`, `ssthresh`, `mss`, `rwnd` — прочитанное напрямую из ядра: `inet_diag` через netlink на Linux, sysctl `net.inet.tcp.pcblist64` на macOS. Эти два ядра расходятся в единицах измерения (Linux считает сегменты, BSD считает байты), поэтому значения macOS нормализуются относительно MSS, и колонка означает одно и то же на обеих системах. Windows показывает `--`, пока не подключён `GetPerTcpConnectionEStats`.
`V` переключает `full → lite → dense`, или задайте один раз в **Settings → View**. При размерах ниже 130×44 он переключается на ту же сетку 80×24, на которую нацелен режим Lite — который тоже заполняет свою область — и никогда не прокручивается по горизонтали.
## Deeper dives
| Guide | What's in it |
|-------|--------------|
| **[Feature reference](https://github.com/matthart1983/netwatch/blob/HEAD/docs/REFERENCE.md)** | Every keybinding, the display-filter language, protocol decoder list, themes, and config options. |
| **[TLS 1.3 decryption](https://github.com/matthart1983/netwatch/blob/HEAD/docs/REFERENCE.md#tls-13-decryption)** | How `SSLKEYLOGFILE` decryption works, supported cipher suites, and what it can and can't read. |
| **[Threat hunting with JA4](https://github.com/matthart1983/netwatch/blob/HEAD/docs/REFERENCE.md#threat-hunting-with-ja4)** | Fingerprinting clients and pivoting across flows. |
| **[Security & the Landlock sandbox](https://github.com/matthart1983/netwatch/blob/HEAD/docs/REFERENCE.md#security--forensics)** | The threat model, capability dropping, and the filesystem allow-list. |
| **[Egress policy linting](https://github.com/matthart1983/netwatch/blob/HEAD/docs/egress-linter-plan.md)** | The observe → promote → warn model, the rule language, `strict` mode, and the NDJSON export schema. |
| **[Flight Recorder](https://github.com/matthart1983/netwatch/blob/HEAD/docs/REFERENCE.md#flight-recorder)** | Arming, freezing, and the contents of an incident bundle. |
| **[AI Insights](https://github.com/matthart1983/netwatch/blob/HEAD/docs/INSIGHTS.md)** | Optional local/cloud LLM analysis (off by default). |
## How it works```
Raw bytes → Ethernet → IPv4/IPv6/ARP → TCP/UDP/ICMP → L7 decoders
↓
Per-flow stream tracking · Handshake timing
TLS 1.3 decryption · JA4 · Threat detection
| Сборщик | macOS | Linux |
|---|---|---|
| Соединения | lsof + PKTAP | /proc/net/tcp + eBPF kprobe |
| Пакеты | libpcap (BPF) | libpcap |
| Привязка к процессам | PKTAP | опрос lsof/ss с опциональным наложением eBPF kprobe |
Всё деградирует корректно: функции, которым нужны повышенные привилегии, показывают понятное сообщение и переходят на запасной вариант, никогда не падая. Полное описание архитектуры — в WIKI.md.
Связанные
Смежные: SysWatch (система) и DiskWatch (диск) — тот же каркас, другая область. ESSH — SSH-клиент на чистом Rust с той же эстетикой TUI; подключается там, где NetWatch наблюдает.
NetWatch Cloud — облачный мониторинг парка серверов, за которыми вы следите через NetWatch. Крошечный Rust-агент на каждом Linux-хосте, дашборд в реальном времени и уведомления по email и Slack о задержке, потере пакетов или отключении хостов. Бесплатно, пока мы растём. Агент, SDK и дашборд — MIT, а размещённый бэкенд проприетарный.
Благодарности
Упаковщики. NetWatch есть в homebrew-core, nixpkgs, AUR и основном бакете Scoop — и я не собирал ни один из них. Каждый из них был сделан человеком, который нашёл инструмент полезным, сделал работу без просьбы и с тех пор поддерживает его в актуальном состоянии. Запись в Scoop, как правило, обновлялась под новый релиз в течение нескольких часов после тега.
| Dominiquini | netwatch-tui в AUR, с марта 2026 |
| kemelzaidan | netwatch-tui-bin в AUR |
| tomasrivera | netwatch в nixpkgs |
| scillidan | netwatch в основном бакете Scoop, с v0.15.3 |
| Мейнтейнеры Homebrew | за включение формулы в core и за бота, который с тех пор отслеживает каждый релиз |
Сборка пакетов — неблагодарная работа, которую замечают только тогда, когда она ломается. Если вы устанавливаете NetWatch через один из них, благодарить за это нужно их, а не меня.
Участники. @lamchau, @fdncred и @PeteE прислали патчи. Спасибо — pull request от незнакомца — это лучшее, что может случиться с таким проектом.
И всем, кто открыл issue с реальным воспроизведением проблемы, оспаривал дизайнерское решение или говорил мне, что вывод на их терминале неправильный: именно на этой обратной связи проект и строится.
Вклад
Вопросы, идеи и сообщения об ошибках приветствуются в GitHub Discussions и Issues. См. CONTRIBUTING.md — соглашения о коде, и WIKI.md — руководство по архитектуре.
Лицензия
MIT