<strong>面向终端的进程级网络监控工具:实时呈现 TCP、UDP、QUIC 连接,自带深度包检测,默认沙箱隔离运行。</strong>
<a href="https://ratatui.rs/"><img src="https://ratatui.rs/built-with-ratatui/badge.svg" alt="Built With Ratatui"></a>
<a href="https://github.com/domcyrus/rustnet/actions"><img src="https://github.com/domcyrus/rustnet/workflows/Rust/badge.svg" alt="Build Status"></a>
<a href="https://crates.io/crates/rustnet-monitor"><img src="https://img.shields.io/crates/v/rustnet-monitor.svg" alt="Crates.io"></a>
<a href="https://github.com/domcyrus/rustnet/stargazers"><img src="https://img.shields.io/github/stars/domcyrus/rustnet?style=flat&logo=github" alt="GitHub Stars"></a>
<a href="https://github.com/domcyrus/rustnet/raw/v1.4.0/LICENSE"><img src="https://img.shields.io/badge/license-Apache--2.0-blue.svg" alt="License"></a>
<a href="https://github.com/domcyrus/rustnet/releases"><img src="https://img.shields.io/github/v/release/domcyrus/rustnet.svg" alt="GitHub release"></a>
<a href="https://github.com/domcyrus/rustnet/pkgs/container/rustnet"><img src="https://img.shields.io/badge/docker-ghcr.io-blue?logo=docker" alt="Docker Image"></a>
English | 简体中文

实时洞察机器对外发起的每一条连接:谁在使用它、走的是什么协议。无需 tcpdump,无需 X11 转发,也不必把 root 权限传递下去。
netstat / ss 也无法展示实时状态。t 可保留历史(已关闭)连接以便事后追溯。port:、src:、dst:、sni:、process:、state:、proto:,以及 /(?i)pattern/ 形式的正则。RustNet 填补了简单连接工具(netstat、ss)与数据包分析器(Wireshark、tcpdump)之间的空白:
RustNet 与抓包工具是互补关系。用 RustNet 看清谁在发起连接;若要深入取证,可用 --pcap-export 抓取附带进程信息的数据包,再借 scripts/pcap_enrich.py 富化后,在 Wireshark 中结合完整的 PID 与进程上下文分析。参见 USAGE.zh-CN.md 的 PCAP 导出章节 与 ARCHITECTURE.zh-CN.md 的同类工具对比章节。
基于 ratatui、libpcap、eBPF(libbpf-rs)、DashMap、crossbeam、ring、MaxMind GeoLite2 与 Landlock 构建。完整依赖清单见 ARCHITECTURE.zh-CN.md。
基于 eBPF 的增强型进程识别(Linux 默认)
RustNet 在 Linux 上默认使用内核 eBPF 程序进行进程识别,从而获得更高的性能与更低的开销。但这种方式也有一些重要的限制需要了解:
进程名长度限制:
- eBPF 使用内核的 comm 字段,该字段最多只有 16 个字符
- 显示的是任务 / 线程的命令名,而非完整的可执行路径
- 多线程应用往往展示线程名而非主进程名
真实场景示例: - Firefox:可能显示为 "Socket Thread"、"Web Content"、"Isolated Web Co" 或 "MainThread" - Chrome:可能显示为 "ThreadPoolForeg"、"Chrome_IOThread"、"BrokerProcess" 或 "SandboxHelper" - Electron 应用:经常显示为 "electron"、"node" 或内部线程名 - 系统进程:展示截断后的名字,如 "systemd-resolve" → "systemd-resolve"
回退行为: - 当 eBPF 加载失败或权限不足时,RustNet 会自动回退到基于 procfs 的标准进程识别方式 - 标准模式可以拿到完整进程名,但 CPU 开销更高 - eBPF 默认启用,无需任何特殊编译参数
如需关闭 eBPF、仅使用 procfs 模式,请这样构建:
cargo build --release --no-default-features
技术细节见 ARCHITECTURE.zh-CN.md。
网络接口统计监控
RustNet 在所有支持的平台上提供实时的网络接口统计:
3):以详细表格呈现各接口的完整指标如何解读接口统计以及各平台的差异,详见 USAGE.zh-CN.md。
可用指标: - 总字节数与包数(RX / TX) - 错误计数(收 / 发) - 丢包数(队列溢出) - 冲突数(传统指标,现代网络中很少出现)
数据由后台线程每 2 秒采集一次,对性能影响极小。
概览
连接列表与实时统计、迷你折线图
![]() |
详情
逐连接展示 SNI、加密套件、GeoIP、DPI
![]() |
图表
流量曲线、应用分布、Top 进程
![]() |
接口
各接口 RX / TX 历史曲线、错误与丢包
![]() |
Homebrew(macOS / Linux):
brew install rustnet
Ubuntu(25.10+):
sudo add-apt-repository 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
# 然后在 shell 中执行: sudo rustnet
通过 crates.io:
cargo install rustnet-monitor
Windows(Chocolatey):
# 需在管理员权限的 PowerShell 中执行
# 需要先安装 Npcap(https://npcap.com),并启用 "WinPcap API-compatible Mode"
choco install rustnet
其他平台: - FreeBSD:从 rustnet-bsd releases 下载 - Docker、源码构建、其他 Linux 发行版:详见 INSTALL.zh-CN.md
抓包需要更高的权限:
# 快速启动(所有平台)
sudo rustnet
# Linux:为可执行文件赋予 Linux capabilities,即可免 sudo 运行(推荐)
sudo setcap 'cap_net_raw,cap_bpf,cap_perfmon+eip' $(which rustnet)
rustnet
常用参数:
rustnet -i eth0 # 指定网络接口
rustnet --show-localhost # 显示 localhost 上的连接
rustnet --no-resolve-dns # 关闭反向 DNS 解析(默认开启)
rustnet -r 500 # 设置刷新间隔(毫秒)
rustnet --theme classic # 原始全彩调色板(默认:muted)
权限配置详情见 INSTALL.zh-CN.md,完整参数说明见 USAGE.zh-CN.md。
如果已经设置了 Linux capabilities,但 TUI 仍然提示
eBPF unavailable,请参阅 INSTALL.zh-CN.md 的排障章节。
| 按键 | 作用 |
|---|---|
q |
退出(连按两次确认) |
Ctrl+C |
立即退出 |
x |
清空所有连接(连按两次确认) |
Tab 或 ] |
下一个标签页 |
Shift+Tab 或 [ |
上一个标签页 |
1–5 |
直接跳转到 Overview / Details / Interfaces / Graph / Help |
↑/k ↓/j |
上下移动 |
g G |
跳到第一条 / 最后一条连接 |
Enter |
查看连接详情 |
Esc |
返回或清除过滤器 |
c |
复制远端地址 |
p |
在服务名与端口之间切换 |
d |
在主机名与 IP 之间切换 |
s S |
切换排序列 / 切换排序方向 |
a |
切换按进程分组 |
Space |
展开 / 折叠进程分组 |
←/→ 或 h/l |
折叠 / 展开当前分组 |
PageUp/PageDown 或 Ctrl+B/F |
翻页 |
t |
切换是否显示历史(已关闭)连接 |
i |
切换 System 信息侧边栏 |
r |
重置视图(分组、排序、过滤) |
/ |
进入过滤模式 |
h |
切换帮助 |
完整键位说明与导航技巧见 USAGE.zh-CN.md。
快速过滤示例:
/google # 全局搜索 "google"
/port:443 # 按端口过滤
/process:firefox # 按进程过滤
/state:established # 按连接状态过滤
/dport:443 sni:github.com # 组合多个过滤条件
排序:
- 按 s 在可排序的列之间循环切换(进程、地址、服务、应用、状态、带宽)
- 按 S(Shift+s)切换升序 / 降序
- 想抓出带宽大户:连续按 s 直到显示 "Bandwidth Total ↓"(按上下行合计速度排序)
完整的过滤语法与排序说明见 USAGE.zh-CN.md。
高级过滤示例
关键字过滤:
- port:44 —— 端口号包含 "44" 的连接(443、8080、4433)
- sport:80 —— 源端口包含 "80"
- dport:443 —— 目的端口包含 "443"
- src:192.168 —— 源 IP 包含 "192.168"
- dst:github.com —— 目的地址包含 "github.com"
- process:ssh —— 进程名包含 "ssh"
- sni:api —— SNI 主机名包含 "api"
- app:openssh —— 使用 OpenSSH 的 SSH 连接
- state:established —— 按协议状态过滤
- proto:tcp —— 按协议类型过滤
状态过滤:
- state:syn_recv —— 半开连接(可用于发现 SYN flood)
- state:established —— 仅显示已建立的连接
- state:quic_connected —— 活跃的 QUIC 连接
- state:dns_query —— DNS 查询连接
组合示例:
- sport:80 process:nginx —— Nginx 从 80 端口发出的连接
- dport:443 sni:google.com —— 到 Google 的 HTTPS
- process: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 活跃:10 分钟;TCP 空闲:5 分钟
- QUIC 已连接:3 分钟(若对端通过 transport 参数声明了 idle timeout,则以对端为准);Initial / Handshaking 阶段:60 秒
- DNS:30 秒
- TCP CLOSED:5 秒
举例:一条 HTTP 连接会在第 7.5 分钟变黄,第 9 分钟变红,第 10 分钟被移除。
完整超时说明见 USAGE.zh-CN.md。
欢迎贡献!请阅读 CONTRIBUTING.zh-CN.md 了解贡献流程。
历来的贡献者名单见 CONTRIBUTORS.md。
本项目采用 Apache License 2.0 许可证,详见 LICENSE 文件。
tshark/wireshark/tcpdump、sniffnet、netstat、ss、iftop,以及 bandwhich部分章节已迁移到独立文件,以便更好地组织内容:
$ claude mcp add rustnet \
-- python -m otcore.mcp_server <graph>