domcyrus/rustnet

GitHub: domcyrus/rustnet

一款跨平台终端 TUI 网络监控工具,能将 TCP/UDP/QUIC 连接实时映射到进程并进行深度包检测。

Stars: 2035 | Forks: 64

RustNet

Per-process network monitoring for your terminal: live TCP, UDP, and QUIC connections with deep packet inspection, sandboxed by default.

Built With Ratatui Build Status Crates.io GitHub Stars License GitHub release Docker Image

RustNet demo

实时洞察您机器的每一个连接、其所有者及其使用的协议。无需 tcpdump、X11 转发或 root 管道。

## 功能特性 - **按进程溯源**:通过 Linux 上的 eBPF、macOS 上的 PKTAP、Windows 和 FreeBSD 上的原生 API,将每一个 TCP、UDP 和 QUIC 连接映射到其所属进程。Wireshark 和 tcpdump 无法做到这一点;`netstat` / `ss` 也无法显示实时状态。 - **深度包检测**:无需外部解析器,即可识别 HTTP、HTTPS/TLS (SNI)、DNS、SSH、QUIC、NTP、mDNS、LLMNR、DHCP、SNMP、SSDP 和 NetBIOS。 - **安全沙箱**:Landlock (Linux 5.13+)、Seatbelt (macOS)、令牌权限剥离 + 任务对象子进程阻止 (Windows)。在 libpcap 初始化后立即降权。参见 [SECURITY.md](SECURITY.md)。 - **TCP 网络分析**:实时检测重传、乱序包和快速重传,支持按连接及聚合统计。 - **智能连接生命周期**:协议感知超时,并带有 白 → 黄 → 红 的陈旧度指示器。按 `t` 键可保留历史(已关闭)连接,以便进行取证分析。 - **Vim/fzf 风格过滤**:支持 `port:`、`src:`、`dst:`、`sni:`、`process:`、`state:`、`proto:` 等过滤器,以及通过 `/(?i)pattern/` 实现的正则表达式。 - **GeoIP 充实**:通过本地 MaxMind GeoLite2 进行国家/地区查询。无网络调用。 - **跨平台**:Linux、macOS、Windows、FreeBSD。 ## 为什么选择 RustNet? RustNet 填补了简单连接工具(`netstat`、`ss`)与数据包分析器(`Wireshark`、`tcpdump`)之间的空白: - **进程溯源**:查看哪个应用程序拥有每个连接。Wireshark 无法提供此功能,因为它只能看到数据包,而看不到套接字。 - **以连接为中心的视图**:实时跟踪每个连接的状态、带宽和协议 - **SSH 友好**:TUI 可通过 SSH 运行,因此您可以快速查看远程服务器上发生的情况,而无需转发 X11 或抓取流量 RustNet 是数据包捕获工具的绝佳补充。使用 RustNet 来查看*是什么发起了连接*。要进行深度取证分析,请使用 `--pcap-export` 捕获带有进程信息的数据包,然后通过 `scripts/pcap_enrich.py` 进行充实,并在 Wireshark 中结合完整的 PID/进程上下文进行分析。详情请参见 [PCAP 导出](USAGE.md#pcap-export) 和 [与类似工具的比较](ARCHITECTURE.md#comparison-with-similar-tools)。 基于 ratatui、libpcap、eBPF (libbpf-rs)、DashMap、crossbeam、ring、MaxMind GeoLite2 和 Landlock 构建。完整的依赖项细分请参见 [ARCHITECTURE.md](ARCHITECTURE.md#dependencies)。
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.md](ARCHITECTURE.md)。
接口统计监控 RustNet 在所有支持的平台上提供实时网络接口统计信息: - **概览标签页**:显示活动接口及其当前速率、错误和丢包情况 - **接口标签页**(按 `i`):包含所有接口综合指标的详细表格 - **跨平台**:Linux (sysfs)、macOS/FreeBSD (getifaddrs)、Windows (GetIfTable2 API) - **智能过滤**:Windows 会自动排除虚拟/过滤适配器 有关解释接口统计数据和平台特定行为的详细文档,请参见 [USAGE.md](USAGE.md#interface-statistics)。 **可用指标:** - 总字节数和数据包数(RX/TX) - 错误计数器(接收和发送) - 数据包丢弃(队列溢出) - 冲突(传统指标,在现代网络中很少使用) 统计信息每 2 秒在一个后台线程中收集,对性能的影响极小。
## 快速开始 ### 安装 **Homebrew (macOS / Linux):** ``` brew tap domcyrus/rustnet 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 ``` **Arch Linux:** ``` sudo pacman -S rustnet ``` **通过 crates.io:** ``` cargo install rustnet-monitor ``` **Windows (Chocolatey):** ``` # 在 Administrator PowerShell 中运行 # 需要安装 Npcap (https://npcap.com) 并启用 "WinPcap API-compatible Mode" choco install rustnet ``` **其他平台:** - **FreeBSD**:从 [rustnet-bsd releases](https://github.com/domcyrus/rustnet-bsd/releases) 下载 - **Docker、源码构建、其他 Linux 发行版**:详细说明请参见 [INSTALL.md](INSTALL.md) ### 运行 RustNet 数据包捕获需要提升的权限: ``` # 快速入门(所有平台) sudo rustnet # Linux:授予 capabilities 以无需 sudo 运行(推荐) 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 --resolve-dns # Enable reverse DNS lookups rustnet -r 500 # Set refresh interval (ms) ``` 详细的权限设置请参见 [INSTALL.md](INSTALL.md),完整的选项说明请参见 [USAGE.md](USAGE.md)。 ## 键盘控制 | 按键 | 操作 | |-----|--------| | `q` | 退出(按两次以确认) | | `Ctrl+C` | 立即退出 | | `x` | 清除所有连接(按两次以确认) | | `Tab` | 在标签页之间切换 | | `i` | 切换接口统计视图 | | `↑/k` `↓/j` | 向上/向下导航 | | `g` `G` | 跳转到第一个/最后一个连接 | | `Enter` | 查看连接详情 | | `Esc` | 返回或清除过滤器 | | `c` | 复制远程地址 | | `p` | 切换服务名/端口显示 | | `d` | 切换主机名/IP显示(需配合 `--resolve-dns`) | | `s` `S` | 切换排序列 / 切换排序方向 | | `a` | 切换进程分组 | | `Space` | 展开/折叠进程组 | | `←/→` 或 `h/l` | 折叠/展开组 | | `PageUp/PageDown` 或 `Ctrl+B/F` | 翻页导航 | | `t` | 切换历史(已关闭)连接 | | `r` | 重置视图(分组、排序、过滤) | | `/` | 进入过滤模式 | | `h` | 切换帮助 | 详细的键盘控制和导航技巧请参见 [USAGE.md](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` 可循环切换可排序的列(协议、地址、状态、服务、带宽、进程) - 按 `S`(Shift+s)可切换排序方向 - 查找带宽占用大户:按 `s` 直到出现 "Down/Up ↓"(按合并的上传+下载速度排序) 完整的过滤语法和排序指南请参见 [USAGE.md](USAGE.md)。
高级过滤示例 **关键字过滤:** - `port:44` - 包含 "44" 的端口(443、8080、4433) - `sport:80` - 包含 "80" 的源端口 - `dport:443` - 包含 "443" 的目标端口 - `src:192.168` - 包含 "192.168" 的源 IP - `dst: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 的 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 分钟,空闲:5 分钟 - **QUIC 已连接**:3 分钟(或对端传输参数的空闲超时,如果存在);`Initial`/`Handshaking`:60 秒 - **DNS**:30 秒 - **TCP CLOSED**:5 秒 示例:一个 HTTP 连接在 7.5 分钟时变黄,9 分钟时变红,并在 10 分钟时被移除。 完整的超时详情请参见 [USAGE.md](USAGE.md)。
## 文档 - **[INSTALL.md](INSTALL.md)** - 所有平台的详细安装说明、权限设置和故障排除 - **[USAGE.md](USAGE.md)** - 完整的使用指南,包括命令行选项、过滤、排序和日志记录 - **[SECURITY.md](SECURITY.md)** - 安全功能,包括 Landlock 沙箱和权限管理 - **[ARCHITECTURE.md](ARCHITECTURE.md)** - 技术架构、平台实现和性能细节 - **[PROFILING.md](PROFILING.md)** - 性能分析指南,包含火焰图设置和优化技巧 - **[ROADMAP.md](ROADMAP.md)** - 计划中的功能和未来改进 - **[RELEASE.md](RELEASE.md)** - 面向维护者的发布流程 ## 许可证 本项目基于 Apache License, Version 2.0 授权 - 详情请参见 [LICENSE](LICENSE) 文件。 ## 文档已迁移 为了更好地组织内容,部分章节已移至专门的文件中: - **权限设置**:现位于 [INSTALL.md - Permissions Setup](INSTALL.md#permissions-setup) - **安装说明**:现位于 [INSTALL.md](INSTALL.md) - **详细用法**:现位于 [USAGE.md](USAGE.md) - **架构详情**:现位于 [ARCHITECTURE.md](ARCHITECTURE.md)
标签:Awesome, AWS, DPI, PKTAP, QUIC, Ratatui, Rust, TCP, TUI, UDP, Wireshark替代, 协议识别, 可视化界面, 后渗透, 开源, 沙箱, 深度包检测, 系统管理, 终端UI, 网络安全, 网络安全分析, 网络流量分析, 网络流量审计, 请求拦截, 进程级网络分析, 连接归属, 通知系统, 防御绕过, 隐私保护