RustNet 实战指南:终端网络监控高级技巧

RustNet 封面

在上一篇文章中,我们介绍了 RustNet 的强大之处。作为一款可以在终端下提供进程级、带有深度包检测(DPI)的网络监控工具,仅仅知道如何启动它是不够的。

本文将带你深入了解 RustNet 的终端用户界面(TUI)操作、快捷键,以及它极其强大的过滤与排序功能。

基础启动参数

通常情况下,我们赋予权限后直接运行 rustnet 即可。但为了适应不同的排查场景,它提供了一些有用的启动参数:

  • 指定网卡:如果你的机器有多块网卡,可以使用 -i 参数指定。
    1
    rustnet -i eth0
  • 监控本地环回地址:默认情况下 RustNet 不显示本地回环(Localhost)的连接,可以使用参数开启。
    1
    rustnet --show-localhost
  • 禁用反向 DNS 解析:默认会自动解析 IP 对应的域名,如果你发现这拖慢了性能,可以禁用它。
    1
    rustnet --no-resolve-dns
  • 调整刷新率:设置 TUI 界面的刷新频率(单位:毫秒)。
    1
    rustnet -r 500
  • 导出 PCAP 抓包文件:在监控的同时将网络包保存下来,供后续 Wireshark 等工具深入分析(该功能支持保留进程归属信息)。
    1
    rustnet --pcap-export out.pcap

快捷键盘控制

RustNet 的交互深受 Vim 影响,非常契合开发者的操作习惯。以下是核心快捷键:

全局操作

  • q 或 **Ctrl+C**:退出程序。
  • **t**:切换历史模式。默认情况下关闭的连接会被清除,开启此模式后,可以保留历史连接记录以供取证和审查。
  • **r**:重置当前视图和统计数据。
  • **i**:打开/关闭网络接口统计信息面板。在这里可以看到各个网卡的收发速率(RX/TX)、错误包和丢包情况。

视图导航

  • / k 和 ** / j**:上下移动选择行。
  • PageUp / PageDown 或 **Ctrl+B / Ctrl+F**:上下翻页。
  • **g**:跳转到列表顶部。
  • **G**:跳转到列表底部。
  • **Enter**:查看当前选中连接的详细信息面板。
  • **Esc**:关闭详情面板或清除当前的输入/过滤状态。

数据排序

  • **s**:切换排序的列(例如在协议、地址、状态、服务、带宽、进程名之间循环切换)。
    • 小技巧:连续按 s 直到列标题显示 “Down/Up ↓”,即可快速找出当前占用带宽最大的“流量大户”。
  • **S (Shift + s)**:切换正序/倒序排列。

强大的过滤语法 (Vim/fzf 风格)

面对服务器上成百上千的连接,快速过滤出你需要关注的连接是排查问题的关键。在 RustNet 界面按下 / 键即可进入过滤模式。

基础关键字过滤

你可以直接输入关键字(如 /google)进行全局模糊匹配,或者使用更精确的前缀过滤:

  • port: - 过滤端口(包含特定数字,如 port:44 会匹配 443, 8080 等)。
  • sport: - 仅过滤源端口(Source port)。
  • dport: - 仅过滤目标端口(Destination port)。
  • src: - 过滤源 IP 地址(如 src:192.168)。
  • dst: - 过滤目标 IP 地址(或域名)。
  • process: - 过滤进程名(如 process:sshprocess:nginx)。
  • sni: - 过滤 HTTPS/TLS 握手过程中的 SNI(服务器名称指示),非常适合抓取访问了特定域名的 HTTPS 请求(如 sni:github.com)。
  • app: - 过滤识别出的应用协议(如 app:openssh)。
  • proto: - 过滤底层协议(如 proto:tcpproto:udpproto:quic)。

状态 (State) 过滤

由于 RustNet 是实时追踪连接的,你可以根据连接生命周期进行过滤:

  • state:established - 仅查看已建立的活跃连接。
  • state:syn_recv - 查看半开连接状态(有助于发现 SYN Flood 攻击)。
  • state:quic_connected - 仅查看活跃的 QUIC 连接。
  • state:dns_query - 查看正在进行的 DNS 查询。

组合过滤与正则表达式

你可以组合多个条件,条件之间使用空格分隔(相当于逻辑 AND)。

  • 查找由 Nginx 进程发起的 80 端口连接
    1
    sport:80 process:nginx
  • 查找发往 Google 的 HTTPS 请求
    1
    dport:443 sni:google.com
  • 高级正则匹配:支持使用 /(?i)pattern/ 格式进行正则表达式匹配((?i) 表示忽略大小写)。

连接的“生命周期”颜色指示

为了让你直观地感受到哪些连接已经处于空闲状态,RustNet 使用了巧妙的颜色编码:

  • 白色:活跃连接(距超时时间还有 >25% 的余量)。
  • 黄色:陈旧连接(警告,剩余时间 10% - 25%)。
  • 红色:即将超时的严重连接(剩余时间 < 10%)。

RustNet 会根据协议类型智能设置超时阈值。例如:HTTP(S) 通常是 10 分钟(支持 keep-alive),SSH 则长达 30 分钟,而 DNS 查询如果 30 秒无响应就会被标记。

总结

RustNet 将底层的 eBPF 采集、libpcap 分析与直观优雅的 TUI 界面完美结合。掌握了这些过滤和控制技巧,以后在终端下排查诸如“应用卡顿、带宽被异常占用、未知对外发包”等网络疑难杂症时,你将会如虎添翼。