sniffer 项目地址: https://github.com/chenjiandongx/sniffer
在 Linux 系统中,进程的多数指标数据都能在 /proc/${PID} 路径下获取到,但网络 IO 的数据,比如网络流量或者进出网络包吞吐量这类的是没有办法直接读取到的。一番搜索后,在 Github 上找到两个工具,imsnif/bandwhich 和 raboof/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: 进程整体维度展示数据。
![]() | 1 nasmatic 2021-11-18 10:45:30 +08:00 给一代目打 call |
![]() | 2 defunct9 2021-11-18 11:51:58 +08:00 不错,不错 |
![]() | 3 sbilly 2021-11-18 13:14:48 +08:00 赞~ 能生成抓包文件么? |
![]() | 4 chenjiandongx OP @sbilly 抓包文件暂时还不支持 是想在使用的时候同时生成文件 然后退出进程的时候将抓包文件落盘? |
![]() | 5 chenjiandongx OP @nasmatic 钓鱼佬永不空军 |
![]() | 6 wellsc 2021-11-18 13:31:31 +08:00 |
7 Archeb 2021-11-18 20:07:42 +08:00 很直观,正是我需要的,赞! |
![]() | 8 guyskk0x0 2021-11-18 21:59:37 +08:00 很不错,求发布单文件可执行包~ |
![]() | 9 sbilly 2021-11-19 00:23:17 +08:00 @chenjiandongx 把制定的网络数据包写入磁盘 |
![]() | 10 sola97 2021-11-19 19:02:48 +08:00 不错,我为了编译二进制还特地放到 docker 里编译完再拿出来,有 release 就好了 |
![]() | 11 chenjiandongx OP @guyskk0x0 这个之前试过提供过 不过有开发者反馈不能直接使用 参见 issue https://github.com/chenjiandongx/sniffer/issues/1 |
![]() | 12 chenjiandongx OP @sola97 同上 |
![]() | 13 chenjiandongx OP @sbilly 是为了拿到 wireshark 上分析吗? |
![]() | 14 guyskk0x0 2021-11-19 22:34:32 +08:00 @chenjiandongx #11 有点遗憾,看来是依赖系统的 libpcap 库,导致没法静态编译 |
![]() | 15 chenjiandongx OP 如果是相同或者兼容的 libpcap 库应该可以,我试过在 macos 上编译 windows 版本,放到 windows 能跑起来 |
![]() | 16 sbilly 2021-11-20 04:32:57 +08:00 @chenjiandongx 是的 |
![]() | 17 zhaoawd 2021-11-22 23:28:46 +08:00 正好需要一个流量监控工具 |