使用 sniffer 排查进程以及连接流量情况
Rust/C++/Golang 我全都要!
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 依赖 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 |
热键
Keys | Description |
---|---|
Space | pause refreshing |
Tab | rearrange tables |
s | switch next view mode |
q / Ctrl+C | quit |
视图维度
Bytes Mode: 以流量视角查看数据.
Packets Mode: 以网络包视角渲染数据。
Processes Mode: 进程整体维度展示数据。