sniffer: 一个现代化的全平台进程流量分析工具

2021-11-18 10:17:05 +08:00
 chenjiandongx

sniffer 项目地址https://github.com/chenjiandongx/sniffer

在 Linux 系统中,进程的多数指标数据都能在 /proc/${PID} 路径下获取到,但网络 IO 的数据,比如网络流量或者进出网络包吞吐量这类的是没有办法直接读取到的。一番搜索后,在 Github 上找到两个工具,imsnif/bandwhichraboof/nethogs,前者使用 Rust 编写,后者使用 C++ 编写。bandwhich 界面精巧并且支持以多种视角查看流量数据,像 Socket 连接、进程以及远程端点,但不支持传入 BPF 过滤条件,比如只想查看某个端口的流量数据或者过滤某个 IP 的数据。而 nethlogs 支持 BPF 过滤条件但只能以进程维度查看数据。

那问题就来了,能不能两者兼得呢?既能使用 BPF 过滤特性又能以多种视角查看数据。

当然可以,自己动手写一个不就行了。

chenjiandongx/sniffer 是一个 Golang 编写的,支持 TCP/UDP 协议,用于查看分析进程或者连接的流量情况的命令行工具。既然要查看进程流量,那如何高效的将网络包的信息将进程信息关联起来就显得十分重要了。在 sniffer 中,Linux 系统下使用的是类似 ss 命令的 netlink socket ,只获取 ESTABLISHED 状态的连接,而不是直接读取 /proc/net/* 下面的数据,这种做法更高效,因为主机上可能存在大量的 TimeWait 的链接,这些链接是不会有流量的,所以无需纳入统计范围内。而 MacOS 上则用的是 losf 命令,也是仅获取 ESTABLISHED 状态的连接。Windows 上就比较简单粗暴了,直接使用 shirou/gopsutil 提供的 API 。

用法介绍

❯ sniffer -h
# A modern alternative network traffic sniffer.

Usage:
  sniffer [flags]

Examples:
  # processes mode for pid 1024,2048 in MB unit
  $ sniffer -p 1024 -p 2048 -m 2 -u MB

  # only capture the TCP protocol packets with lo,eth prefixed devices
  $ sniffer -b tcp -d lo -d eth

Flags:
  -b, --bpf string                   specify string pcap filter with the BPF syntax (default "tcp or udp")
  -d, --devices-prefix stringArray   prefixed devices to monitor (default [en,lo,eth,em,bond])
  -h, --help                         help for sniffer
  -i, --interval int                 interval for refresh rate in seconds (default 1)
  -l, --list                         list all devices name
  -m, --mode int                     view mode of sniffer (0: bytes 1: packets 2: processes)
  -n, --no-dns-resolve               disable the DNS resolution
  -p, --pids int32Slice              pids to watch, empty stands for all pids (default [])
  -u, --unit string                  unit of traffic stats in processes mode, optional: B, KB, MB, GB (default "KB")
  -v, --version                      version for sniffer

截图预览

Bytes Mode: 以流量视角查看数据

Packets Mode: 以网络包视角渲染数据。

Processes Mode: 进程整体维度展示数据。

3614 次点击
所在节点    分享创造
17 条回复
nasmatic
2021-11-18 10:45:30 +08:00
给一代目打 call
defunct9
2021-11-18 11:51:58 +08:00
不错,不错
sbilly
2021-11-18 13:14:48 +08:00
赞~
能生成抓包文件么?
chenjiandongx
2021-11-18 13:25:28 +08:00
@sbilly 抓包文件暂时还不支持 是想在使用的时候同时生成文件 然后退出进程的时候将抓包文件落盘?
chenjiandongx
2021-11-18 13:26:06 +08:00
@nasmatic 钓鱼佬永不空军
wellsc
2021-11-18 13:31:31 +08:00
👍🏻
Archeb
2021-11-18 20:07:42 +08:00
很直观,正是我需要的,赞!
guyskk0x0
2021-11-18 21:59:37 +08:00
很不错,求发布单文件可执行包~
sbilly
2021-11-19 00:23:17 +08:00
@chenjiandongx 把制定的网络数据包写入磁盘
sola97
2021-11-19 19:02:48 +08:00
不错,我为了编译二进制还特地放到 docker 里编译完再拿出来,有 release 就好了
chenjiandongx
2021-11-19 22:24:36 +08:00
@guyskk0x0 这个之前试过提供过 不过有开发者反馈不能直接使用 参见 issue https://github.com/chenjiandongx/sniffer/issues/1
chenjiandongx
2021-11-19 22:25:00 +08:00
@sola97 同上
chenjiandongx
2021-11-19 22:25:40 +08:00
@sbilly 是为了拿到 wireshark 上分析吗?
guyskk0x0
2021-11-19 22:34:32 +08:00
@chenjiandongx #11 有点遗憾,看来是依赖系统的 libpcap 库,导致没法静态编译
chenjiandongx
2021-11-19 22:37:50 +08:00
如果是相同或者兼容的 libpcap 库应该可以,我试过在 macos 上编译 windows 版本,放到 windows 能跑起来
sbilly
2021-11-20 04:32:57 +08:00
zhaoawd
2021-11-22 23:28:46 +08:00
正好需要一个流量监控工具

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/816212

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX