
rustnet v1.5.0
ターミナル向けの、ディープパケットインスペクションを備えたプロセス単位のネットワーク監視。クロスプラットフォーム、サンドボックス化。
RustNet
ターミナル向けのプロセス単位ネットワーク監視: ライブ TCP・UDP・QUIC 接続をディープパケットインスペクションで可視化し、デフォルトでサンドボックス化。
お使いのマシンが行うすべての接続、その接続を所有するプロセス、話しているプロトコルをリアルタイムに可視化します。tcpdump や X11 フォワーディング、root でのパイプ処理は不要です。
機能
- プロセス単位の関連付け: すべての TCP・UDP・QUIC 接続を、所有プロセスにマッピングします。Linux では eBPF、macOS では PKTAP、Windows では自動 IP Helper フォールバック付きの ETW、FreeBSD ではネイティブ API を使用します。詳細には PID、実行ファイル、ユーザー/グループ名、一致信頼度、そして全プラットフォームで上限付きの親プロセスチェーンが含まれます。Wireshark や tcpdump ではこれはできず、
netstat/ssではライブ状態を表示できません。 - ディープパケットインスペクション: 外部のディセクタなしで、HTTP、SNI 付き HTTPS/TLS、DNS、SSH、FTP、QUIC、MQTT、BitTorrent、STUN、NTP、mDNS、LLMNR、DHCP、SNMP、SSDP、NetBIOS を識別します。
- 注釈付き PCAPNG エクスポート:
--pcapng-exportは、プロセス・PID・方向・DPI/SNI・GeoIP をパケットごとのコメントとして埋め込んだ Wireshark 対応キャプチャを書き出します。Wireshark で開くと、後処理なしですべてのパケットに所有プロセス名が表示されます。オフライン相関用の JSONL サイドカー付きの従来の--pcap-exportも利用できます。 - セキュリティサンドボックス: Landlock (Linux 5.13+)、Seatbelt (macOS)、トークン特権の破棄 + ジョブオブジェクトによる子プロセスブロック (Windows)。libpcap の初期化後すぐに権限を破棄します。SECURITY.md を参照してください。
- ネットワーク分析: TCP・QUIC ハンドシェイク・DNS レスポンス・ICMP エコーのリアルタイム往復時間に加え、TCP 再送信、順序外れ、高速再送信の検出。
- スマートな接続ライフサイクル: プロトコル対応のタイムアウトと、白 → 黄 → 赤の鮮度インジケータ。
tで過去の (クローズ済み) 接続をフォレンジック用に表示し続けることができます。 - Vim/fzf スタイルのフィルタリング:
port:、src:、dst:、sni:、process:、state:、proto:に加え、/(?i)pattern/による正規表現。 - GeoIP エンリッチメント: ローカルの MaxMind GeoLite2 による国別ルックアップ。ネットワーク呼び出しはありません。
- LAN デバイス識別: リンク上のピアとゲートウェイについて、MAC アドレスとベンダー (内蔵 IEEE OUI データベース由来) を ARP トラフィックからパッシブに学習し、詳細ペインに表示します。
- Kubernetes 属性付与 (オプションの
kubernetes機能): 接続をポッド・ネームスペース・コンテナにマッピングし、詳細ペイン、JSON/PCAPNG エクスポート、pod:・ns:・container:フィルタで表示します。公式 Docker イメージでは有効です。クラスタ上では kubectl-rustnet プラグインを使用して、一時的なデバッグポッドとして実行できます。USAGE.md を参照してください。 - クロスプラットフォーム: Linux、macOS、Windows、FreeBSD。
RustNet を選ぶ理由
RustNet は、シンプルな接続ツール (netstat、ss) とパケットアナライザー (Wireshark、tcpdump) の間のギャップを埋めます:
- プロセス関連付け: 各接続を所有するアプリケーションを確認できます。Wireshark はパケットしか見ずソケットを見ないため、これは提供できません。
- 接続中心のビュー: 接続ごとに状態・帯域幅・プロトコルをリアルタイムで追跡
- SSH フレンドリー: TUI は SSH 経由で動作するため、X11 フォワーディングやトラフィックキャプチャなしでリモートサーバーの状況をすばやく確認できます。
RustNet はパケットキャプチャツールを補完します。何が接続を行っているのか を確認するには RustNet を使用してください。Wireshark で直接検査する場合、--pcapng-export は PID/プロセスコンテキスト付きのベストエフォートなパケットコメントをライブで書き出します。後処理時の相関には、--pcap-export と JSONL サイドカー、およびオプションの scripts/pcap_enrich.py を使用してください。詳細は PCAP エクスポート と 類似ツールとの比較 を参照してください。
ratatui、libpcap、eBPF (libbpf-rs)、DashMap、crossbeam、ring、MaxMind GeoLite2、Landlock 上に構築されています。依存関係の完全な内訳は ARCHITECTURE.md を参照してください。
eBPF による拡張プロセス識別 (Linux デフォルト)
RustNet は Linux 上ではデフォルトでカーネル eBPF プログラムを使用し、パフォーマンスを向上させ、低オーバーヘッドでプロセス識別を行います。
プロセス名:
- eBPF は、動作中のスレッド名ではなく、プロセスグループリーダーの TGID と
comm名 (16 文字に制限されたカーネルフィールド) を記録するため、マルチスレッドアプリケーションでは「Socket Thread」のようなスレッド名ではなく、メインプロセス名が表示されます。 - その後 RustNet は
/proc/<tgid>/commを介して現在の名前を再解決し、実行ファイルのファイル名から comm で切り詰められた名前を復元し (例: "chromium-browse" は "chromium-browser" になります)、詳細ビューに表示される実行ファイルのフルパスを解決します。 - このエンリッチメントが実行される前に終了した短命なプロセスは、eBPF が記録した 16 文字の名前を維持します。
フォールバック動作:
- eBPF のロードに失敗した場合、または十分な権限がない場合、RustNet は自動的に標準の procfs ベースのプロセス識別にフォールバックします。
- 標準モードは procfs スキャンを介して同じ方法で名前を解決しますが、CPU オーバーヘッドが高くなります。
- eBPF はデフォルトで有効です。特別なビルドフラグは不要です。
eBPF を無効にして procfs のみのモードを使用するには、次のようにビルドします:
cargo build --release --no-default-features
技術情報については ARCHITECTURE.md を参照してください。
プロセスアクティビティとインターフェース監視
RustNet は、プロセスレベルのトラフィック集計とリアルタイムのネットワークインターフェース統計を組み合わせます:
- 概要タブ: アクティブなインターフェースと現在のレート、エラー、ドロップを表示します。
- アクティビティタブ (
3キー): プロセスを Egress (TX) または Ingress (RX) でランク付けし、保持/ロールリングトラフィック、レート、シェア、接続、宛先を表示します。 - セキュリティワークフロー: Egress で並べ替えて予期しないアップローダーを特定し、接続クローズ後でもその上位リモートピアと保持トラフィックを調査できます。
- インターフェース詳細 (アクティビティで
iキー): 全インターフェースの包括的なオリジナルメトリクスを表示します。 - クロスプラットフォーム: Linux (sysfs)、macOS/FreeBSD (getifaddrs)、Windows (GetIfTable2 API)
- スマートフィルタリング: Windows では仮想/フィルタアダプターを自動的に除外します。
インターフェース統計の解釈とプラットフォーム固有の動作の詳細なドキュメントについては、USAGE.md を参照してください。
利用可能なメトリクス:
- 合計バイト数とパケット数 (RX/TX)
- エラーカウンター (受信および送信)
- パケットドロップ (キューのオーバーフロー)
- コリジョン (レガシー。現代のネットワークではほとんど使用されません)
統計はバックグラウンドスレッドで 2 秒ごとに収集され、パフォーマンスへの影響は最小限です。
スクリーンショット
| 概要 ライブ統計とスパークラインを備えた接続テーブル ![]() | 詳細 接続ごとの SNI、暗号、GeoIP、DPI ![]() |
| グラフ トラフィックチャート、アプリ分布、トッププロセス ![]() | アクティビティ プロセスの Egress/Ingress、60 秒カバレッジ、属性、リモートピア ![]() |
クイックスタート
インストール
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
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
その他のプラットフォーム:
- FreeBSD: rustnet-bsd releases からダウンロード
- Docker、ソースからのビルド、その他の Linux ディストリビューション: 詳細な手順は INSTALL.md を参照
RustNet の実行
パケットキャプチャには管理者権限が必要です:
# 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
一般的なオプション:
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
テーマと色ごとのオーバーライドは ~/.config/rustnet/config.toml でも設定できます。--theme が優先されます。スキーマについては USAGE.md を参照してください。
詳細な権限設定は INSTALL.md、完全なオプションは USAGE.md を参照してください。
ケイパビリティを設定しても TUI に
eBPF unavailableと表示される場合は、 トラブルシューティングセクションの ケイパビリティ設定後も eBPF が利用できない場合 を参照してください。
キーボード操作
| Key | Action |
|---|---|
q | 終了 (2 回押して確認) |
Ctrl+C | 即終了 |
x | 全接続をクリア (2 回押して確認) |
Tab or ] | 次のタブ |
Shift+Tab or [ | 前のタブ |
1–5 | 概要 / 詳細 / アクティビティ / グラフ / ヘルプへ移動 |
↑/k ↓/j | 上下に移動 |
g G | 最初/最後の接続へ移動 |
Enter | 接続の詳細を表示 |
Esc | 戻る、またはフィルターをクリア |
c | リモートアドレスをコピー |
p | サービス名/ポートを切り替え |
d | 概要でホスト名/IP、アクティビティで Egress/Ingress を切り替え |
s S | ソート列を切り替え / 方向を切り替え |
a | プロセスグループ化を切り替え |
Space | プロセスグループを展開/折りたたみ |
←/→ or h/l | グループを折りたたみ/展開 |
PageUp/PageDown or Ctrl+B/F | ページ移動 |
t | 履歴 (クローズ済み) 接続を切り替え |
i | 概要でシステム情報、アクティビティでインターフェース詳細を切り替え |
r | ビューをリセット (グループ化、ソート、フィルター) |
/ | フィルターモードに入る |
h | ヘルプを切り替え |
詳細なキーボード操作とナビゲーションのヒントは USAGE.md を参照してください。
フィルタリングとソート
クイックフィルター例:
/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
ソート:
sを押すとソート可能な列 (Process、Addresses、Service、Application、State、Bandwidth) を順に切り替えS(Shift+s) を押すとソート方向を切り替え- 帯域幅の大量消費を見つける: 「Bandwidth Total ↓」が表示されるまで
sを押します (上下合算速度でソート)
完全なフィルター構文とソートガイドは USAGE.md を参照してください。
高度なフィルター例
キーワードフィルター:
port:44- 「44」を含むポート (443、8080、4433)sport:80- 「80」を含む送信元ポートdport:443- 「443」を含む宛先ポートsrc:192.168- 「192.168」を含む送信元 IPdst:github.com- 「github.com」を含む宛先process:ssh- 「ssh」を含むプロセス名sni:api- 「api」を含む SNI ホスト名app:openssh- OpenSSH を使用する SSH 接続state:established- プロトコル状態でフィルターproto:tcp- プロトコルタイプでフィルター
状態フィルター:
state:syn_recv- ハーフオープン接続 (SYN フラッド検出)state:established- 確立済み接続のみstate:quic_connected- アクティブな QUIC 接続state:dns_query- DNS クエリ接続
組み合わせ例:
sport:80 process:nginx- ポート 80 からの Nginx 接続dport:443 sni:google.com- Google への HTTPSprocess:firefox state:quic_connected- Firefox の QUIC 接続dport:22 app:openssh state:established- 確立済みの OpenSSH 接続
接続ライフサイクルと視覚インジケーター
RustNet は接続を削除する前に、スマートタイムアウトと視覚的な警告を使用します:
視覚的な鮮度インジケーター:
- 白: アクティブ (タイムアウトの 75% 未満)
- 黄: 古い (タイムアウトの 75〜90%)
- 赤: クリティカル (タイムアウトの 90% 超)
プロトコル対応タイムアウト:
- HTTP/HTTPS: 10 分 (keep-alive 対応)
- SSH: 30 分 (長時間セッション)
- 一般的な TCP 確立: 5 分
- QUIC 接続済み: 3 分 (ピアの transport-param アイドルタイムアウトがある場合はその値);
Initial/Handshaking: 60 秒 - DNS: 30 秒
- TCP CLOSED: 15 秒のアーカイブ猶予
例: HTTP 接続は 7.5 分で黄色、9 分で赤になり、10 分で削除されます。
完全なタイムアウト詳細は USAGE.md を参照してください。
ドキュメント
- INSTALL.md - 全プラットフォームの詳細なインストール手順、権限設定、トラブルシューティング
- USAGE.md - コマンドラインオプション、フィルタリング、ソート、ロギングを含む完全な使用ガイド
- SECURITY.md - Landlock サンドボックスや権限管理などのセキュリティ機能
- ARCHITECTURE.md - 技術アーキテクチャ、プラットフォーム実装、パフォーマンスの詳細
- CONTRIBUTING.md - コントリビューションのワークフロー、品質要件、プロジェクトガイドライン
- PROFILING.md - flamegraph セットアップと最適化のヒントを含むパフォーマンスプロファイリングガイド
- ROADMAP.md - 計画中の機能と今後の改善
- RELEASE.md - メンテナー向けのリリースプロセス
コントリビューション
コントリビューションを歓迎します! コントリビューションの方法に関するガイドラインは CONTRIBUTING.md を参照してください。
このプロジェクトに貢献した人々のリストは CONTRIBUTORS.md を参照してください。
ライセンス
このプロジェクトは Apache License, Version 2.0 の下でライセンスされています。詳細は LICENSE ファイルを参照してください。
謝辞
- ターミナル UI は ratatui で構築
- パケットキャプチャは libpcap を利用
tshark/wireshark/tcpdump、sniffnet、netstat、ss、iftop、bandwhich などのツールに触発されています- 一部のコードは vibe coded (OMG) です / LLM の神々のご加護がありますように
ドキュメントの移設
一部のセクションは、整理のため専用ファイルに移動されました:
- 権限設定: INSTALL.md - Permissions Setup に移動
- インストール手順: INSTALL.md に移動
- 詳細な使用方法: USAGE.md に移動
- アーキテクチャの詳細: ARCHITECTURE.md に移動



