immanuwell/pktz
GitHub: immanuwell/pktz
基于 eBPF 的实时每进程网络流量监控工具,无需采样即可展示连接详情、速率曲线与地理位置信息。
Stars: 153 | Forks: 12
packet-z



# pktz
你的机器此刻正在与外界对话——数量庞大的对话。`pktz` 实时告诉你谁在通信、流量多少、发往何方。
基于 eBPF 构建,直接钩入内核,无需轮询 `/proc`,无需采样。每一个字节、每一个进程,尽在掌握,毫不遗漏。
## 安装
**下载预编译二进制**(无需 Go 环境):
```
# 替换为你的 arch: amd64, arm64, armv7
curl -Lo pktz https://github.com/immanuwell/pktz/releases/latest/download/pktz-linux-amd64
chmod +x pktz && sudo mv pktz /usr/local/bin/
```
**或使用 Go 安装**(一步完成下载 + 编译):
```
go install github.com/immanuwell/pktz@latest
```
eBPF 目标文件已预编译并打包在模块中,无需 `clang` 或 `bpftool`。
**或从源码构建**(适合想自行修改的用户):
```
# 要求:clang, libbpf-dev, bpftool, Go 1.22+, Linux kernel 5.8+
make install # builds + copies to /usr/local/bin
```
## 用法
```
sudo pktz
```
需要 root 权限以加载 eBPF 程序并读取所有进程的 `/proc/
/fd/`——和 `sudo iotop`、`sudo tcpdump` 一样。
如果你实在讨厌每次输入 sudo,可以一次性授予以下权限:
```
sudo setcap cap_bpf,cap_perfmon,cap_dac_read_search+ep $(which pktz)
pktz # no sudo needed
```
不过需要提醒:在此模式下,pktz 能看到的进程数会少于 sudo 模式——它无法检查 root 或其他用户拥有的进程的 fd 目录,因此这些进程的连接不会显示在详情视图中。若需完整可见性,请使用 sudo。
## 你能看到什么
**进程列表** —— 所有正在进行网络 I/O 的进程,实时显示收发速率和累计总量。默认按名称排序,你也可以按任意列排序。
**连接下钻** —— 选中任意进程按 `Enter`,即可查看每个打开的连接、状态、速率、远程地址。按 `Esc` 返回。
**实时折线图** —— 过去 5 分钟的收发速率历史曲线,自动跟随光标所在进程。使用 Unicode 块字符渲染,在深色终端中效果很棒。
**GeoIP 国旗 + ASN** —— 🇺🇸 CLOUDFLARE、🇩🇪 HETZNER、🇷🇺 ???。可选,见下方。
**DNS 解析** —— 远程地址显示真实主机名而非原始 IP。你可以关闭此功能以查看原始地址。
## 快捷键
| 按键 | 操作 |
|------|------|
| `↑` `↓` 或 `j` `k` | 导航 |
| `Enter` | 打开连接详情 |
| `Esc` / `Backspace` | 返回进程列表 |
| `s` | 切换排序列 |
| `/` | 按进程名过滤 |
| `r` | 切换主机名解析 |
| `v` | 切换精简 IPv6 |
| `g` | 切换 GeoIP 国旗 |
| `m` | 切换鼠标 |
| `q` | 退出 |
点击列标题可排序,再次点击翻转方向。是的,鼠标开箱即用。
## GeoIP(可选但建议开启)
```
sudo pktz --download-geoip-db
```
从 DB-IP.com 下载,无需账号、授权码。采用 CC BY 4.0 许可。下载完成后,按 `g` 即可在连接详情视图中显示国家国旗和 ASN 名称。
当你盯着某个 IP 地址,疑惑为什么你的笔记本正在与遥远的地方建立连接时,这个功能会非常有用。
## 聚焦特定进程
跳过进程列表,直接跳转到你关心的地方:
```
# 按 PID — 直接打开连接详情视图
sudo pktz --pid 1234
# 按名称 — 筛选列表以匹配进程
sudo pktz --app firefox
sudo pktz --app /usr/bin/google-chrome # path works too, basename is extracted
```
`--app` 会对进程名进行大小写不敏感的子串匹配,因此 `--app chrom` 会同时匹配 `chrome` 和 `chromium`。底部会显示 `app:firefox` 作为过滤器生效的提醒。你仍然可以使用 `/` 在此基础上进一步缩小范围。
这两个标志也适用于 `--log` 和 `--metrics` 模式。
## 日志模式 —— 管道输出到任意位置
```
sudo pktz --log | jq .
```
完全跳过 TUI,每 500ms 将 NDJSON 输出到标准输出。每条记录要么是 `"process"` 记录,要么是 `"conn"` 记录,均包含 `ts` 时间戳。
```
# 当前带宽占用最高的进程
sudo pktz --log | jq -r 'select(.type=="process") | "\(.comm) rx=\(.rx_bps|./1024|floor)KB/s"'
# 监视特定进程
sudo pktz --log | grep '"comm":"firefox"'
# 当某个值超过阈值时发出警报
sudo pktz --log | jq --unbuffered 'select(.type=="process" and .rx_bps > 10000000)' | notify
```
能很好地与任何读取标准输入的程序配合使用。设置好即可忘记它的存在。
## Prometheus 指标端点
```
sudo pktz --metrics :9090
```
在 `/metrics` 上启动 HTTP 服务器,与 TUI 同时运行。Prometheus 可立即抓取。暴露进程级别的仪表和计数器:
| 指标 | 类型 | 描述 |
|------|------|------|
| `pktz_process_rx_bytes_per_second` | gauge | 当前接收速率 |
| `pktz_process_tx_bytes_per_second` | gauge | 当前发送速率 |
| `pktz_process_rx_bytes_total` | counter | 累计接收字节数 |
| `pktz_process_tx_bytes_total` | counter | 累计发送字节数 |
| `pktz_process_connections` | gauge | 活动连接数 |
所有指标都带有 `pid` 和 `comm`(进程名)标签。
可与任意标志组合使用。无头/守护进程场景:
```
# 无 TUI,仅 metrics — 将日志管道到 /dev/null
sudo pktz --metrics :9090 --log > /dev/null
# 仅暴露一个应用的 metrics
sudo pktz --metrics :9090 --app firefox
```
Prometheus 抓取配置:
```
scrape_configs:
- job_name: pktz
static_configs:
- targets: ['localhost:9090']
```
## 演示模式 —— 适合屏幕共享
向观众演示时,不想让真实的 IP 地址显示在屏幕上?
```
sudo pktz --demo
```
每个 IP 和主机名都会被替换成看起来可信但实际上完全是假的。会话内稳定——相同的真实 IP 总是映射到相同的假 IP——因此显示内容仍有逻辑。
如果你想让它在演讲或截图中更出彩:
```
sudo pktz --fake-processes=chrome,spotify,zoom
```
注入模拟进程并带有动态流量曲线。隐含 `--demo`。看起来完全真实,实际上全是虚构实话实说,还挺好玩的。
就这些了。运行它,花 30 秒到处点一点,剩下的你自然会明白。标签:Docker镜像, Go, Linux内核, Ruby工具, 二进制发布, 内核探针, 实时流量, 开源工具, 性能分析, 情报分析, 日志审计, 网络安全, 网络诊断, 自定义请求头, 进程流量, 连接监控, 隐私保护