
netwatch v0.27.0
终端中的实时网络诊断工具。一条命令,零配置,即时可见。
NetWatch
看看你的网络到底在做什么——实时显示,就在你的终端里。
一款网络监视器,能读取加密流量,识别每条连接背后的进程,并捕获正在回连的恶意软件。一个二进制文件。零配置。
一切尽收眼底,零行装饰——没有标题栏、没有菜单栏、没有状态栏。下载从共享时间轴向上增长,上传从时间轴向下增长,因此流量对称性是一种你在读取数字之前就能辨认出的形状。颜色编码的是量级,而不是序列。
……以及它下方的默认十标签页仪表,只需按一次 V 即可切换,并共享相同的预热采集器——仪表盘、每个套接字背后的程序、深度数据包检测、网络地图,以及每个程序在跟谁通信。
大多数网络工具只回答一个问题——“谁在用我的带宽?”——然后就到此为止。NetWatch 会继续深挖。它解码线路上的协议,告诉你哪个程序打开了每条连接,并监视那些意味着麻烦的模式——端口扫描、恶意软件向命令服务器发送信标、数据通过 DNS 悄悄外泄。当某些东西看起来不对劲时,按一次键就能冻结一份便携式证据包,你可以将其附加到 bug 报告中。
把它想象成一个零配置的二进制文件,同时承担带宽计量器、Wireshark 的排查视图和轻量级入侵检测器的工作——而且无需离开终端。
它能随你提出的问题而伸缩——两个方向都行:--view dense 用四个零装饰方框填满一个大终端,而 netwatch --lite 则是一个 80×24 的屏幕,用于回答*“现在谁在用我的网络?”*;当答案是“有些东西需要我调查”时,完整的十标签页视图就在那里——只需按一次键,共享同一个实时捕获。
专为蓝队成员、事件响应人员、SRE 和家庭实验室爱好者打造,他们需要看到当下正在发生的事情——而不是一小时后才去解析捕获文件。
650+ 项测试 · Landlock 沙箱(Linux)· 安全解析恶意流量
还有任何其他终端工具都做不到的部分:NetWatch 会学习机器上每个程序在跟谁通信,按一次键即可将观察到的基线转化为策略,并在程序开始与新的目标通信的那一刻告诉你。
观察 → 提升 → 告警。按一次键,基线就变成策略;下一个新目标会以漂移的形式出现。
为什么选择 NetWatch
- 🔓 读取你控制的加密流量——将浏览器或应用的
SSLKEYLOGFILE指向 NetWatch,即可实时解码其 TLS 1.3 会话的明文,方式与 Wireshark 相同。无需代理、无需证书、中间没有任何东西。 - 🛰️ 了解每个程序在跟谁通信,然后在它改变时收到通知——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 会话连接到 Pi 或放入 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) 获取预编译二进制文件。
**Windows 需要安装 [Npcap](https://npcap.com/#download)** —— 安装程序的默认设置即可,如果没有安装,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 的 bug 请在此处提交。如果某个软件包落后于某个版本,[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,静态——Arch/Fedora/Alpine/任意发行版) | [`netwatch-linux-x86_64-static.tar.gz`](https://github.com/matthart1983/netwatch/releases/latest) |
| Linux(aarch64,静态——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,没有运行时依赖——请在 Arch、Fedora、Alpine 或任何默认构建报告 `libpcap.so.0.8: cannot open shared object file` 的发行版上使用这些版本。
Windows 构建需要 [Npcap](https://npcap.com/#download)——请在首次运行前安装。安装程序的默认设置即可:NetWatch 会在 `System32\Npcap` 中查找,而 Npcap 实际上将 `wpcap.dll` 放在那里,因此*以 WinPcap API 兼容模式安装 Npcap* 并非必需。如果完全没有 Npcap,你会看到 NetWatch 的消息指出缺少什么,而不是 Windows 错误框。(在 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` 退出。仪表盘五秒内即可上手;其余内容在你需要深入时随时可用。
> **没有 `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))。
### 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` | 加密客户端问候(Encrypted ClientHello):名称按设计被隐藏,因此这是“无法判断”,而非“不良” |
| `✗ drift` | 在允许列表之外 |
| `— no rule` | 该程序从未被声明——未检查任何内容 |
| `✗ undeclared` | 无规则,在 `strict = true` 下——策略声称是完整的,因此*缺失*本身就是发现 |
规则接受精确主机名、`*.wildcards`、自治系统、CIDR 块(`10.0.0.0/8`)和端口。`strict = true` 正是将检查器从“在我声明的软件行为异常时告诉我”转变为“在我从未声明的软件开始通信时告诉我”的关键——而这正是实际入侵的形态。
## 你会得到什么
十个标签页,用 `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/端口),一键将该基线提升为策略,然后在漂移时发出警告。仅观察,从不阻止。 |
数据包标签页是取证所在之处——深度协议解码、实时 TLS 1.3 解密、JA4 威胁狩猎、Wireshark 风格的显示过滤器以及事件捕获。**[查看完整功能参考 →](https://github.com/matthart1983/netwatch/blob/main/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/main/docs/REFERENCE.md)** | 每个按键绑定、显示过滤器语言、协议解码器列表、主题和配置选项。 |
| **[TLS 1.3 解密](https://github.com/matthart1983/netwatch/blob/main/docs/REFERENCE.md#tls-13-decryption)** | `SSLKEYLOGFILE` 解密如何工作、支持的密码套件,以及它能和不能读取的内容。 |
| **[使用 JA4 进行威胁狩猎](https://github.com/matthart1983/netwatch/blob/main/docs/REFERENCE.md#threat-hunting-with-ja4)** | 对客户端进行指纹识别并在流之间进行枢轴分析。 |
| **[安全与 Landlock 沙箱](https://github.com/matthart1983/netwatch/blob/main/docs/REFERENCE.md#security--forensics)** | 威胁模型、能力丢弃和文件系统允许列表。 |
| **[出口策略检查](https://github.com/matthart1983/netwatch/blob/main/docs/egress-linter-plan.md)** | 观察 → 提升 → 警告模型、规则语言、`strict` 模式以及 NDJSON 导出模式。 |
| **[飞行记录器](https://github.com/matthart1983/netwatch/blob/main/docs/REFERENCE.md#flight-recorder)** | 布防、冻结以及事件包的内容。 |
| **[AI 洞察](https://github.com/matthart1983/netwatch/blob/main/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
| Collector | 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 agent,提供实时仪表盘,并在延迟、丢包或主机离线时发送邮件和 Slack 告警。在我们成长期间免费。 agent、SDK 和 dashboard 均采用 MIT 许可;托管后端为专有软件。
致谢
打包维护者。 NetWatch 已收录于 homebrew-core、nixpkgs、AUR 和 Scoop 主 bucket——而这些打包工作没有一项是我做的。每一项都是由觉得这个工具好用的人主动完成、不求回报,并一直保持更新至今。Scoop 条目通常在发布标签后几小时内就会跟进更新。
| Dominiquini | 自 2026 年 3 月起在 AUR 上维护 netwatch-tui |
| kemelzaidan | 在 AUR 上维护 netwatch-tui-bin |
| tomasrivera | 在 nixpkgs 中维护 netwatch |
| scillidan | 自 v0.15.3 起在 Scoop 主 bucket 中维护 netwatch |
| Homebrew 维护者 | 将 formula 纳入 core,以及自那以后跟踪每次发布的机器人 |
打包是吃力不讨好的工作,只有在出问题时才会被注意到。如果你通过以上任一渠道安装 NetWatch,要感谢的是他们,而不是我。
贡献者。 @lamchau、@fdncred 和 @PeteE 都提交过补丁。谢谢你们——来自陌生人的 pull request 是这类项目能遇到的最好的事情。
还要感谢每一位提交了可复现问题、对设计决策提出异议、或告诉我输出在你的终端上显示不对的人:这正是这个项目赖以成长的反馈循环。
参与贡献
问题、想法和 bug 报告欢迎提交到 GitHub Discussions 和 Issues。编码规范见 CONTRIBUTING.md,架构指南见 WIKI.md。
许可证
MIT