
netwatch v0.27.0
ターミナル上でのリアルタイムネットワーク診断。ワンコマンド、設定不要、即時可視性。
NetWatch
ネットワークが実際に何をしているかを、ターミナルでライブ表示。
暗号化トラフィックを読み取り、すべての接続の背後にあるプロセスを特定し、マルウェアの外部通信を検出するネットワークモニター。単一バイナリ。設定不要。
すべてを一度に、クローム行ゼロで — ヘッダーバーなし、メニューバーなし、ステータスバーなし。ダウンロードは共有の時間軸から上へ、アップロードはそこから下へ伸びるため、トラフィックの対称性は数字を読む前に形として認識できます。色は系列ではなく、大きさを表します。
…そしてその下にあるデフォルトの10タブ計器。1回のVキーでアクセスでき、同じウォームコレクターを共有します — ダッシュボード、各ソケットの背後にあるプログラム、ディープパケットインスペクション、ネットワークマップ、各プログラムが通信する相手。
ほとんどのネットワークツールは1つの質問 — 「帯域幅を使っているのは何か?」 — に答えて止まります。NetWatchはさらに進みます。ワイヤ上のプロトコルをデコードし、各接続を開いたのがどのプログラムかを教え、問題を示すパターン — ポートスキャン、コマンドサーバーへのマルウェアのビーコン、DNS経由でのデータの密輸 — を監視します。何かおかしいときは、1回のキー操作でバグレポートに添付できるポータブルな証拠バンドルをフリーズします。
これを、帯域幅メーター、Wiresharkのトリアージビュー、軽量な侵入検知器の役割を1つの設定不要バイナリで果たすものと考えてください — ターミナルから離れることなく。
これは、あなたが問いかけている質問に合わせてスケールします — 両方向で: --view dense は大きなターミナルを4つのクロームゼロボックスで埋め尽くし、netwatch --lite は 「今、私のネットワークを何が使っているか?」 のための1つの80×24画面です。答えが「調査が必要な何か」である場合は、フル10タブビューがそこにあります — 1回のキー操作で、同じライブキャプチャを共有します。
対象ユーザー: ブルーチーム、インシデントレスポンダー、SRE、ホームラボ愛好家で、今まさに何が起きているかを見る必要がある人 — 1時間後にキャプチャファイルを解析するのではなく。
650以上のテスト · Landlockサンドボックス化 (Linux) · 敵対的トラフィックを安全に解析
そして、他のターミナルツールがまったく行わない部分: NetWatchはマシン上の各プログラムが通信する相手を学習し、その観測されたベースラインを1回のキー操作でポリシーに変換し、プログラムが新しい場所と通信し始めた瞬間を通知します。
観測 → 昇格 → 警告。ベースラインは1回のキー操作でポリシーになります。次の新しい宛先はドリフトとして届きます。
NetWatchの特徴
- 🔓 制御下にある暗号化トラフィックを読む — ブラウザやアプリの
SSLKEYLOGFILEをNetWatchに向けると、TLS 1.3セッションの平文がWiresharkと同じ方法でライブデコードされるのを見られます。プロキシなし、証明書なし、中間に何もなし。 - 🛰️ 各プログラムが通信する相手を学習し、変化したら通知を受ける — NetWatchは各プロセスが到達する宛先(ClientHelloからのホスト名、自律システム、ポート)を監視し、1回のキー操作でその観測されたベースラインをエグレスポリシーに昇格させます。以降は、プログラムが新しい場所と通信し始めると警告します。これはファイアウォールのルールセットでは表現できない文です:
curlは以前はapi.github.comにのみ到達していたが、今日は別の場所に到達した。 観測のみ — ブロックはしません。 - 🧬 接続の背後にあるソフトウェアをフィンガープリントする — JA4は各TLS/QUICハンドシェイクを安定したフィンガープリントに変換するため、特定のクライアント — または特定のマルウェア — をトラフィックが暗号化されていても、ブラウザをユーザーエージェントで認識するように認識できます。フィンガープリントをピボットして、同じソフトウェアからの他のすべてのフローを見つけます。
- 🚨 マルウェアの外部通信を検出する — C2ビーコン(規則的で低ジッターのチェックイン)、ポートスキャン、DNSトンネリングの組み込み検出が、ゼロ設定でバックグラウンドで実行されます。重大なアラートはレコーダーを自動フリーズするため、確認したときには証拠がすでに保存されています。
- ⚙️ すべての接続の背後にあるプロセスを特定する — 各ソケットを、
ss/lsofからそれを開いたプログラムにマッピングします。オプションでカーネルレベルのeBPF kprobe(Linux、ebpfフィーチャー)もあり、ポーリングが見逃す可能性のある短命フローも捕捉します。どこでも動作します。kprobeは拡張であり、必須ではありません。 - 📡 ポートだけでなくプロトコルをデコードする — TLS、QUIC、HTTP、DNS(およびSSHバナー/バージョンスニッフ)の実際のL7解析と、さらに十数種類、フローごとのストリーム追跡とハンドシェイクタイミングを備えているため、「ポート443」だけでなく
api.github.comとJA4フィンガープリントが見えます。 - 🎥 証拠をフリーズする — ローリングレコーダーを装備し、インシデントをポータブルバンドルにフリーズします: パケットに加えて、それを説明する接続、DNS、ヘルス、アラート。バグレポートとポストモーテム用に設計されています。
- 🛡️ 設計上安全 — セットアップ後、NetWatchは特権を放棄し、Landlockファイルシステム許可リスト(Linux)に自身をロックします。敵対的トラフィックを解析するツールは、SSHキー、ブラウザプロファイル、
/etc/shadowを読むことはできません。 - 🪟 1画面にスケールダウン —
--liteは*「私のネットワークを何が使っていて、接続は大丈夫か?」*に、6つのキーで単一の80×24画面で答えます。PiへのSSHセッションやtmux分割に収まります。1回のキー操作で、コレクターがすでにウォームな状態のフルフォレンジックビューにエスカレーションします。
設定ファイルなし。セットアップなし。必須フラグなし。
インストール```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)からビルド済みバイナリを入手してください。
**Windowsでは[Npcap](https://npcap.com/#download)のインストールが必要です** — インストーラーのデフォルト設定で問題ありません。Npcapがない場合、NetWatchは起動時にその旨を表示して終了します。**ソースからのビルド**(`cargo install`、`paru -S netwatch-tui`)にはlibpcapの開発用ヘッダーが必要です:Debian/UbuntuとAlpineでは`libpcap-dev`、Fedora/RHELでは`libpcap-devel`、Archでは`libpcap`です。これらがない場合、リンク時に`cannot find -lpcap`というエラーが表示されます。macOSにはlibpcapが同梱されています。以下の`-static` Linuxバイナリはlibpcapをバンドルしており、追加のインストールは不要です。
Nix、Arch、Scoopのパッケージはコミュニティのパッケージャーによってメンテナンスされています — ありがとうございます。パッケージングの問題はそれらのパッケージャーに報告してください。netwatchのバグはこちらに報告してください。パッケージがリリースに追いついていない場合は、[Repologyページ](https://repology.org/project/netwatch-tui/versions)で確認できます。
<details>
<summary><strong>全プラットフォーム & ソースからのビルド</strong></summary>
| プラットフォーム | ダウンロード |
|----------|----------|
| 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) |
| Windows (x86_64) | [`netwatch-windows-x86_64.exe.zip`](https://github.com/matthart1983/netwatch/releases/latest) |
`-static` Linuxビルドはlibpcapをバンドルしており、実行時の依存関係はありません — デフォルトのビルドで`libpcap.so.0.8: cannot open shared object file`と報告されるArch、Fedora、Alpine、または任意のディストリビューションでこれらを使用してください。
Windowsビルドには[Npcap](https://npcap.com/#download)が必要です — 初回実行前にインストールしてください。インストーラーのデフォルト設定で問題ありません:NetWatchは`System32\Npcap`を探します。Npcapは実際にそこに`wpcap.dll`を配置するため、*Install Npcap in WinPcap API-compatible Mode*は不要です。Npcapがまったくない場合は、Windowsのエラーボックスではなく、不足しているものを示すNetWatchのメッセージが表示されます。(v0.29.1以前ではそのチェックボックスが必要でした — [#47](https://github.com/matthart1983/netwatch/issues/47)を参照してください。)
**ソースから:**```bash
git clone https://github.com/matthart1983/netwatch.git && cd netwatch
cargo build --release
前提条件: Rust 1.70 以降と libpcap の開発用ヘッダーが必要です。cargo install netwatch-tui にも同じことが適用されます。
| プラットフォーム | インストール |
|---|---|
| Debian / Ubuntu | sudo apt install libpcap-dev |
| Fedora / RHEL | sudo dnf install libpcap-devel |
| Arch | sudo pacman -S libpcap |
| Alpine | sudo apk add libpcap-dev |
| macOS | システムに含まれています |
| Windows | Npcap — ビルドは Npcap SDK を自動的に取得します。または、NPCAP_SDK を展開したコピーに設定します |
これらがない場合、ビルドはリンク時に /usr/bin/ld: cannot find -lpcap で失敗します。NetWatch をビルドせずに実行したいだけなら、上記の -static Linux バイナリにはこれらは一切必要ありません。
クイックスタート```bash
netwatch # interface stats, connections, config — no privileges needed sudo netwatch # full mode — adds live packet capture + health probes
それだけです。`1`〜`9`でタブを切り替え、`?`でヘルプ、`q`で終了します。ダッシュボードは5秒で役立ちます。それ以降の内容は、さらに深く掘り下げたいときに参照してください。
> **`sudo`なしのLinux:** キャプチャ機能を一度だけ付与して、通常ユーザーとして実行してください —
> `sudo setcap 'cap_net_raw,cap_bpf,cap_perfmon+eip' "$(which netwatch)"`。アップグレードのたびに再実行してください([詳細](https://github.com/matthart1983/netwatch/blob/main/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セッションから平文を読み取る — ターミナル内でそのまま復号。プロキシも中間者攻撃も不要。
60秒で外向きトラフィックの逸脱を検知する様子
上記デモのループを、3つのコマンドで示します。```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`下——ポリシーは完全であると主張しているため、*不在*自体が発見事項 |
ルールは完全一致のホスト名、`*.ワイルドカード`、自律システム、CIDRブロック(`10.0.0.0/8`)、およびポートを受け付ける。`strict = true`こそが、このリンターを「宣言したソフトウェアが不正動作したら教えて」から「一度も宣言していないものが通信を始めたら教えて」へと変えるものだ——それが実際の侵害の形である。
## 得られるもの
`1`–`9`と`0`で切り替える10個のタブ:
| # | タブ | 表示内容 |
|---|-----|---------------|
| 1 | **ダッシュボード** | インターフェース、帯域幅グラフ、上位接続、ゲートウェイ/DNSの健全性、レイテンシのヒートマップ。5秒で役立つ。 |
| 2 | **接続** | プロセス+PID、プロトコル、状態、GeoIP、レイテンシのスパークラインを備えたすべてのソケット。 |
| 3 | **インターフェース** | インターフェースごとのIPv4/IPv6、MAC、MTU、RX/TX、エラー、ドロップ。 |
| 4 | **パケット** | 実際のL7デコード、TLS 1.3復号、JA4、フローごとのストリーム追跡、フィルター、PCAPエクスポートを備えたライブキャプチャ。 |
| 5 | **統計** | バイト数によるプロトコル内訳+TCPハンドシェイク時間のヒストグラム。 |
| 6 | **トポロジー** | マシン→ゲートウェイ→DNS→上位ホストのASCIIマップ、traceroute付き。 |
| 7 | **タイムライン** | TCP状態で色分けされた接続タイムライン。セキュリティアラートはここに届く。 |
| 8 | **プロセス** | ライブRX/TXと接続数によるプロセスごとの帯域幅ランキング。 |
| 9 | **インサイト** | *(オプトイン)* スナップショットをローカル/クラウドのLLMに送り、平易な言葉での分析を得る。 |
| 0 | **エグレス** | 各プロセスが通信する対象(ホスト名/AS/ポート)を学習し、そのベースラインをワンキーでポリシーに昇格させ、その後ドリフトを警告する。監視のみで、ブロックはしない。 |
パケットタブはフォレンジックの本拠地だ——深いプロトコルデコード、ライブTLS 1.3復号、JA4脅威ハンティング、Wireshark風の表示フィルター、インシデントキャプチャ。**[完全な機能リファレンスを見る →](https://github.com/matthart1983/netwatch/blob/main/docs/REFERENCE.md)**
### ライトビュー
10個のタブはオペレーター向けの計器だ。問題が単に*「誰が私のネットワークを使っているのか、そして接続は大丈夫か?」*だけの場合——1台のマシン、PiへのSSHセッション、tmux分割——には`--lite`がある:```bash
netwatch --lite # one screen, fits 80×24
1画面、6キー。ライブスループット、到達性、そして誰が通信しているか — 任意の行をその場で展開し、入力しながらフィルタリング。
すべてを1つの画面に: ライブスループットチャート、ゲートウェイ/DNS/インターネット到達性、そしてプロセス別・ホスト別のトップトーカー。6つのキー — q 終了、p 一時停止、/ フィルタ、↵ トーカーを展開、L フルビューに戻る、? ヘルプ。
どちらのビューからでも L を押すと切り替えられます。両者は同じコレクターを共有するため、「何かおかしい」という状態から、10タブのフォレンジックビューへの移行は1キー押下で完了します — 再起動不要、履歴の喪失なし、キャプチャは実行中のまま。
高密度ビュー
もう1つの方向性: 大きなターミナルを持っていて、すべてを一度に表示したい場合、--view dense は4つのボックスで画面を埋め尽くし、装飾を一切排除します — ヘッダーバーなし、メニューバーなし、ステータスバーなし。ID、ソート状態、ページ範囲、すべてのキーバインドはボックスの境界線の内側に収まるため、すべての行がデータを保持します。最低でも130×44が必要で、与えられたサイズに応じて拡張します: 幅が広いほどプロットの履歴が増え、完全なホスト名を表示する余地が生まれ、高さが高いほど多くのインターフェースと接続を表示できます。```bash
netwatch --view dense # four boxes, needs 130×44
That's the screen at the top of this README. The signature element is the **mirrored dual graph**: download grows up from a centre time axis, upload grows down from the same axis. Traffic symmetry becomes a shape you recognise without reading a number — a download burst is a cliff above the line, a backup job is a cliff below it. Both halves are braille at two samples per character cell, and every cell is coloured by its **height in the graph** rather than by which series it belongs to, so you see a spike's severity before you measure it against the axis.
Throughput ramps cool→bright because high bandwidth is *busy*, not *bad* — a saturated link during a backup is working. Only bounded values where high genuinely is bad — link saturation, latency budget per hop — get the green→amber→red treatment, and their meters colour by position along the bar, so the red zone is visible before you reach it.
Below the graph: per-interface rates with 60-second sparklines, four-hop latency budgets (gateway, DNS, internet, and the slowest peer you're actually talking to), and the connection table with the selected row's detail hoisted into the top of the same box — no new screen, no back button. The detail row carries kernel TCP state — `cwnd`, `ssthresh`, `mss`, `rwnd` — read straight from the kernel: `inet_diag` over netlink on Linux, the `net.inet.tcp.pcblist64` sysctl on macOS. The two kernels disagree about units (Linux counts segments, BSD counts bytes), so macOS values are normalised against the MSS and the column means the same thing on both. Windows reads `--` until `GetPerTcpConnectionEStats` is wired up.
`V` cycles `full → lite → dense`, or set it once under **Settings → View**. Below 130×44 it falls back to the same 80×24 grid Lite targets — which fills its area too — and it never scrolls sideways.
## Deeper dives
| Guide | What's in it |
|-------|--------------|
| **[Feature reference](https://github.com/matthart1983/netwatch/blob/main/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/main/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/main/docs/REFERENCE.md#threat-hunting-with-ja4)** | Fingerprinting clients and pivoting across flows. |
| **[Security & the Landlock sandbox](https://github.com/matthart1983/netwatch/blob/main/docs/REFERENCE.md#security--forensics)** | The threat model, capability dropping, and the filesystem allow-list. |
| **[Egress policy linting](https://github.com/matthart1983/netwatch/blob/main/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/main/docs/REFERENCE.md#flight-recorder)** | Arming, freezing, and the contents of an incident bundle. |
| **[AI Insights](https://github.com/matthart1983/netwatch/blob/main/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
| Collector | macOS | Linux |
|---|---|---|
| 接続 | lsof + PKTAP | /proc/net/tcp + eBPF kprobe |
| パケット | libpcap (BPF) | libpcap |
| プロセス帰属 | PKTAP | lsof/ss ポーリング、オプションで eBPF kprobe オーバーレイ |
すべては優雅に劣化します。昇格した権限を必要とする機能は明確なメッセージを表示してフォールバックし、決してクラッシュしません。完全なアーキテクチャノートは WIKI.md にあります。
関連
兄弟プロジェクト: SysWatch(システム)と DiskWatch(ディスク)— 同じ外観、異なる対象。ESSH — 同じ TUI 美学を持つ純 Rust 製 SSH クライアント。NetWatch が観測する場所に接続します。
NetWatch Cloud — NetWatch を実行しているサーバー向けのホスト型フリート監視。各 Linux ホスト上の小さな Rust エージェント、リアルタイムダッシュボード、レイテンシ、パケットロス、またはホストのオフライン時にメール + Slack アラートを送信します。成長中は無料です。 エージェント、SDK、ダッシュボード は MIT ライセンスです。ホスト型バックエンドはプロプライエタリです。
謝辞
パッケージャーの皆様。 NetWatch は homebrew-core、nixpkgs、AUR、および Scoop メインバケットに収録されています — そして、そのどれも私がパッケージ化したものではありません。そのすべては、このツールが役立つと見つけ、頼まれもしないのに作業を行い、それ以来ずっと最新の状態に保ってきた誰かによって行われました。Scoop エントリは通常、タグ付けから数時間以内にリリースを追跡してきました。
| Dominiquini | AUR 上の netwatch-tui、2026年3月以降 |
| kemelzaidan | AUR 上の netwatch-tui-bin |
| tomasrivera | nixpkgs 内の netwatch |
| scillidan | Scoop メインバケット内の netwatch、v0.15.3 以降 |
| Homebrew メンテナ | フォーミュラを core に取り込み、それ以降すべてのリリースを追跡してきたボットに対して |
パッケージングは、壊れたときだけ注目される報われない作業です。これらのいずれかを通じて NetWatch をインストールする場合、感謝すべきは私ではなく彼らです。
コントリビューターの皆様。 @lamchau、@fdncred、@PeteE がパッチを送ってくれました。ありがとうございます — 見知らぬ人からのプルリクエストは、このようなプロジェクトに起こる最高の出来事です。
そして、実際の再現手順付きで issue を開き、設計上の決定に異議を唱え、または自分のターミナルで出力が間違っていると教えてくれたすべての人へ:それがこのプロジェクトが築かれてきたフィードバックループです。
コントリビューション
質問、アイデア、バグ報告は GitHub Discussions と Issues で歓迎します。コーディング規約については CONTRIBUTING.md を、アーキテクチャガイドについては WIKI.md を参照してください。
ライセンス
MIT