
netwatch v0.28.2
在终端中进行实时网络诊断。一条命令,零配置,即时可见。
NetWatch
实时查看你的网络到底在做什么——就在终端里。
一款网络监控器,能读取加密流量,识别每条连接背后的进程,并捕获恶意软件的“回连”。单一二进制文件,零配置。
一切尽收眼底,零行界面装饰——没有标题栏、没有菜单栏、没有状态栏。下载从共享时间轴向上增长,上传从共享时间轴向下增长,因此流量的对称性是一种你无需读数字就能识别的形状。颜色编码表示大小,而非序列。
…以及其下默认的十标签页仪表盘,按一次 V 键即可切换,并共享同样的已热身采集器——仪表盘、每个套接字背后的程序、深度包检测、网络地图,以及每个程序在跟谁通信。
大多数网络工具只回答一个问题——“谁在占用我的带宽?”——然后就到此为止。NetWatch 会继续深挖。它解码线路上的协议,告诉你哪个程序打开了每条连接,并监视那些意味着麻烦的模式——端口扫描、恶意软件向命令服务器发送信标、数据通过 DNS 悄悄外传。当有异常时,按一次按键即可冻结一个便携的证据包,你可以把它附到 Bug 报告中。
你可以把它想象成一个零配置的二进制文件,同时承担带宽计、Wireshark 的分诊视图和轻量级入侵检测器的工作——全程无需离开终端。
它会根据你要问的问题双向伸缩:--view dense 用四个零装饰的盒子填满大终端,而 netwatch --lite 是 一屏 80×24,回答*“现在谁在用我的网络?”*;完整的十标签页视图则在你需要“深入调查”时出现——按一个键即可切换,共享同一个实时捕获。
为以下人群打造:蓝队成员、事件响应人员、SRE 和家庭实验室爱好者,他们需要当下就看到发生了什么——而不是一小时后才去解析捕获文件。
650+ 项测试 · Landlock 沙箱(Linux) · 安全解析恶意流量
还有一部分是其他终端工具完全做不到的:NetWatch 会学习机器上每个程序都在与谁通信,按一次按键即可将观察到的基线转为策略,并在某个程序开始与新的目的地通信时立刻告诉你。
观察 → 提升 → 警告。基线通过一次按键变为策略;下一个新目的地会以漂移的形式出现。
为什么选择 NetWatch
- 🔓 读取你控制的加密流量 — 将浏览器或应用的
SSLKEYLOGFILE指向 NetWatch,即可像 Wireshark 那样实时看到其 TLS 1.3 会话的明文解码。没有代理、没有证书、中间不插入任何东西。 - 🛰️ 了解每个程序与谁通信,并在变化时收到提醒 — NetWatch 观察每个进程访问的目的地(来自 ClientHello 的主机名、自治系统、端口),按一次按键即可将观察到的基线提升为出口策略。此后,当某个程序开始与新的目的地通信时,它会发出警告。这正是防火墙规则集无法表达的句子:
curl过去只访问api.github.com,而今天它访问了别的东西。 仅观察——它从不拦截。 - 🧬 为连接背后的软件生成指纹 — JA4 将每次 TLS/QUIC 握手转换为稳定的指纹,因此即使流量是加密的,你也能识别出特定的客户端——或特定的恶意软件——就像你通过 user-agent 识别浏览器一样。以指纹为线索,找出同一软件产生的所有其他流量。
- 🚨 捕获恶意软件的“回连” — 内置检测 C2 信标(规律、低抖动的检查)、端口扫描和 DNS 隧道,零配置即可在后台运行。严重告警会自动冻结记录器,因此当你查看时证据已被保存。
- ⚙️ 识别每条连接背后的进程 — 利用
ss/lsof将每个套接字映射到打开它的程序,并可选用内核级 eBPF kprobe(Linux,ebpf特性),它还能捕获轮询可能遗漏的短生命周期流量。在所有环境中都能工作;kprobe 是增强项,而非必需项。 - 📡 解码协议,而不只是端口 — 对 TLS、QUIC、HTTP 和 DNS 进行真正的 L7 解析(外加 SSH 横幅/版本嗅探),以及另外十几种协议,支持每流跟踪和握手计时——因此你看到的是
api.github.com和 JA4 指纹,而不只是“443 端口”。 - 🎥 冻结证据 — 启用滚动记录器,将任何事件冻结为便携包:数据包以及解释这些数据包的连接、DNS、健康状态和告警。专为 Bug 报告和事后分析而设计。
- 🛡️ 设计即安全 — 设置完成后,NetWatch 会丢弃其特权,并将自身锁定到 Landlock 文件系统允许列表(Linux)。一个解析恶意流量的工具不能读取你的 SSH 密钥、浏览器配置文件或
/etc/shadow。 - 🪟 可缩放到一屏 —
--lite在单个 80×24 屏幕上用六个按键回答*“谁在用我的网络?我的连接正常吗?”*,因此它适合 SSH 到树莓派或 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>
| 平台 | 下载 |
|----------|----------|
| 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) |
`-static` Linux 构建捆绑了 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(Linux 上使用 sudo apt install libpcap-dev,macOS 已内置)。
快速开始```bash
netwatch # interface stats, connections, config — no privileges needed sudo netwatch # full mode — adds live packet capture + health probes
就这样。用 `1`–`9` 切换标签页,按 `?` 查看帮助,按 `q` 退出。仪表板五秒钟就能派上用场;下面这些内容则供你深入探索时使用。
> **没有 `sudo` 的 Linux:** 只需一次性授予抓包能力,然后以你的普通用户身份运行 —
> `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))。
### 在 60 秒内看它解密 TLS
理解 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 秒内捕获出口流量漂移
上面演示中的循环,只需三条命令:```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` | 加密客户端问候(ECH):名称按设计被隐藏,因此这是“无法判断”,而不是“坏” |
| `✗ drift` | 不在允许列表中 |
| `— no rule` | 此程序从未被声明 — 未检查任何内容 |
| `✗ undeclared` | 没有规则,且 `strict = true` — 策略声称是完整的,因此*缺失*本身就是发现 |
规则接受精确主机名、`*.wildcards`、自治系统、CIDR 块(`10.0.0.0/8`)和端口。`strict = true` 将 linter 从“告诉我我声明的软件行为异常”转变为“告诉我从未声明过的某物开始通信” — 这正是实际入侵的形态。
## 你会得到什么
十个标签页,可通过 `1`–`9` 和 `0` 切换:
| # | 标签页 | 显示内容 |
|---|-----|---------------|
| 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/端口),一键将该基线提升为策略,然后在发生漂移时发出警告。仅观察,从不阻止。 |
Packets(数据包)选项卡是取证的核心所在 — 深度协议解码、实时 TLS 1.3 解密、JA4 威胁狩猎、Wireshark 风格的显示过滤器和事件捕获。**[查看完整功能参考 →](https://github.com/matthart1983/netwatch/blob/HEAD/docs/REFERENCE.md)**
### 精简视图
十个标签页是运维人员使用的工具。当问题只是*“什么在占用我的网络,我的连接正常吗?”* — 一台机器、一次到 Pi 的 SSH 会话、一个 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、互联网,以及你实际正在通信的最慢对端),以及连接表,选定行的详情被提升到同一框体的顶部——无需新屏幕,无需返回按钮。详情行携带内核 TCP 状态——`cwnd`、`ssthresh`、`mss`、`rwnd`——直接读取自内核:在 Linux 上通过 netlink 的 `inet_diag`,在 macOS 上通过 `net.inet.tcp.pcblist64` sysctl。这两种内核在单位上存在分歧(Linux 计段,BSD 计字节),因此 macOS 值按 MSS 归一化,使该列在两平台上含义一致。在 Windows 上,在 `GetPerTcpConnectionEStats` 接入之前,显示为 `--`。
`V` 在 `full → lite → dense` 之间循环,也可在 **设置 → 视图** 中一次性设定。在 130×44 以下,它会回退到 Lite 所针对的同一个 80×24 网格——该网格也会填满其区域——并且它从不横向滚动。
## 深入阅读
| 指南 | 内容 |
|-------|--------------|
| **[功能参考](https://github.com/matthart1983/netwatch/blob/HEAD/docs/REFERENCE.md)** | 所有按键绑定、显示过滤器语言、协议解码器列表、主题和配置选项。 |
| **[TLS 1.3 解密](https://github.com/matthart1983/netwatch/blob/HEAD/docs/REFERENCE.md#tls-13-decryption)** | `SSLKEYLOGFILE` 解密如何工作、支持的密码套件,以及它能读取和不能读取的内容。 |
| **[使用 JA4 进行威胁狩猎](https://github.com/matthart1983/netwatch/blob/HEAD/docs/REFERENCE.md#threat-hunting-with-ja4)** | 对客户端进行指纹识别,并跨流 pivot。 |
| **[安全与 Landlock 沙箱](https://github.com/matthart1983/netwatch/blob/HEAD/docs/REFERENCE.md#security--forensics)** | 威胁模型、能力放弃以及文件系统允许列表。 |
| **[出口策略检查](https://github.com/matthart1983/netwatch/blob/HEAD/docs/egress-linter-plan.md)** | 观察 → 提升 → 警告模型、规则语言、`strict` 模式以及 NDJSON 导出 schema。 |
| **[飞行记录器](https://github.com/matthart1983/netwatch/blob/HEAD/docs/REFERENCE.md#flight-recorder)** | 布防、冻结以及事件捆绑包的内容。 |
| **[AI 洞察](https://github.com/matthart1983/netwatch/blob/HEAD/docs/INSIGHTS.md)** | 可选的本地/云端 LLM 分析(默认关闭)。 |
## 工作原理```
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 ——一个纯 Rust 编写的 SSH 客户端,具有相同的 TUI 美学;用于连接 NetWatch 所监测的主机。
NetWatch Cloud —— 为运行 NetWatch 的服务器提供托管式机群监控。每台 Linux 主机上有一个轻量 Rust 代理,配有实时仪表盘,并在延迟、丢包或主机离线时发送电子邮件和 Slack 告警。在我们成长期间免费。agent、SDK 和 dashboard 均为 MIT 许可;托管后端为专有软件。
致谢
打包者。 NetWatch 已收录于 homebrew-core、nixpkgs、AUR 和 Scoop 主 bucket —— 而这些打包我一个都没做。每一个都是由觉得这个工具有用的人完成的,他们主动承担了这项工作,并一直维护至今。Scoop 条目通常会在发布标签后的几小时内跟上版本。
| Dominiquini | 在 AUR 上的 netwatch-tui,自 2026 年 3 月起 |
| kemelzaidan | 在 AUR 上的 netwatch-tui-bin |
| tomasrivera | nixpkgs 中的 netwatch |
| scillidan | Scoop 主 bucket 中的 netwatch,自 v0.15.3 起 |
| Homebrew 维护者 | 感谢将 formula 纳入核心,以及自此追踪每个版本的机器人 |
打包是吃力不讨好的工作,只有出问题时才会被注意到。如果你通过其中一种方式安装 NetWatch,你要感谢的是他们,而不是我。
贡献者。 @lamchau、@fdncred 和 @PeteE 提交了补丁。谢谢你们 —— 来自陌生人的拉取请求是一个项目能遇到的最好的事情。
还有每一位提交了带可复现步骤的 issue、对设计决策提出异议、或告诉我输出在其终端上不正确的人:这个项目正是建立在这样的反馈循环之上。
贡献
欢迎在 GitHub Discussions 和 Issues 中提出问题、想法和错误报告。编码规范请参阅 CONTRIBUTING.md,架构指南请参阅 WIKI.md。
许可证
MIT