Rust/C++/Golang 我全都要!

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 依赖 libpcap 库来捕获和过滤网卡数据包,所以需要先安装 libpcap。下面是不同系统的安装方法。

Debian/Ubuntu

sudo apt-get install libpcap-dev

CentOS/Fedora

sudo yum install libpcap libpcap-devel

MacOS

brew install libpcap

Windows

Windows 的话就要自己下载 npcap 然后一步一步安装咯。

最后使用 go get 或者 go install 或者直接下载已经编译好的 二进制文件

用法介绍

❯ 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

热键

Keys Description
Space pause refreshing
Tab rearrange tables
s switch next view mode
q / Ctrl+C quit

视图维度

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

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

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