跨平台命令行抓包工具 gaze 介绍

gaze 是什么

gaze 是一个命令行下的轻量级网络包监听工具, 有颜色显示, 跨平台(linux \& windows), 支持 TCP 协议, 支持自定义插件扩展.

能做网络抓包的工具很多, 例如 tcpdump 和 wireshark, 为什么还要重写一个? gaze 工具的初衷是为了提高业务联调的效率. 之前在项目中使用过 wireshark 和它的 Lua 插件, 但是在 Linux 下使用不方便. 而 tcpdump 客户端在 Windows 下也不太方便使用, 所以会有这个需求.

gaze 的底层使用了 winpcap 和 libpcap, 是一个跨平台的实现(在 Windows 下使用 mingw 编译). 整个代码除了三方库之外大概也就几百行, 修改和扩展都非常方便. 重要的是, gaze 借鉴了 wireshark, 支持插件扩展(动态链接库). 如果业务使用的协议支持反射(例如 protobuf), 可以很容易做到在修改代码更新插件.

gaze 的实现

gaze 的实现很简单, 通过 libpcap 或者 winpcap 抓取到网卡设备的数据包, 模拟协议栈重新组包和解包即可:

IP 报文不做 DF, 是因为 TCP 的 MSS 基本上会保证 IP 层不分片, 所以这里就直接忽略了, 不然逻辑会比较复杂.

业务层判断连接建立, 断开, 收发包, 都是根据 TCP 的 flags 来判断的, 发包一定是等到收到对端的 ack, 所以会有小小的延迟.

gaze 插件开发

gaze 通过载入动态链接库插件, 来满足不同业务的需求. gaze 插件需要实现下面4个导出接口:

void OnSend(link_key_t* key, const char* buffer, int len);
void OnRecv(link_key_t* key, const char* buffer, int len);
void OnBuild(link_key_t* key);
void OnFinish(link_key_t* key);

为了保证跨平台可用, 需要将插件分别在linux下编译成so, 在windows下编译成dll.

gaze 的启动参数

没有使用 libpcap 或者 winpcap 的谓词语法, 纯粹只是使用习惯.

假设业务开发的插件名字是 polar.dll, Server 的监听地址是 tcp://10.1.164.54:7000, 可以用下面的命令来监听:

./gaze --tcp --port 7000 --ip 10.1.164.54 --plugin polar.dll

如果本地是多网卡的话, 并且需要监听的不是默认网卡, 则可以用下面的命令来查看所有网卡设备, 然后指定监听网卡即可.

./gaze --eth

需要注意的是: 在 Linux 下需要以 root 用户启动 gaze.