Linux 内核网络抓包工具 netcap

admin 2024年8月12日19:27:12评论91 views字数 1124阅读3分44秒阅读模式

 

网站抓包工具,大家应该都不陌生。前几天,字节跳动STE团队开发了一款网络抓包工具——netcap(net capture),并正式对外开源。
它解决的是传统网络抓包工具虽然能够帮助开发者定位问题,但效率较低,且在深度网络问题定位方面能力有限的问题。

开源地址:

https://github.com/bytedance/netcap
netcap可以几乎跟踪整个内核网络协议栈(有skb作为参数的函数),使用tcpdump 语法作为过滤条件,以 skb(socket buffer)为上下文,可以轻松掌握整个报文在内核网络协议栈的完整踪迹,从而帮助开发者大大提高内核网络丢包问题的定位效率。

1主体框架

netcap 通过 kprobe / tracepoint 方式实现函数的 hook,通过函数参数获取 skb 和 sock 关键结构体,拿到网络包的数据,通过 bpf map 和用户态进行数据传递。

Linux 内核网络抓包工具 netcap

2实现原理

netcap 的 工作原理大体如下:在 eBPF 程序中完成数据包的过滤,找出 tcpdump 语法过滤的包,然后把这个包给到 netcap 应用程序,netcap 应用程序再把这个包发去给 tcpdump 显示,或者直接输出 pcap 文件。如下图所示:

Linux 内核网络抓包工具 netcap

1. 如何按 tcpdump 语法过滤

tcpdump 的过滤语法是基于 cBPF的,使用开源库:https://github.com/cloudflare/cbpfc 这里可以把 tcpdump 的过滤语法转化成一个 C 函数,这个 C 函数可以嵌入到 netcap 的 eBPF 的程序中。转成 C 函数的基本原理如下:先利用 libpcap 库把 tcpdump 过滤语法转成 cBPF 指令码,然后基于此指令码转化成 C 语言的函数。如下图所示:

Linux 内核网络抓包工具 netcap

2. 如何把数据包内容用 tcpdump 显示出来

netcap 程序启动后,也会启动一个 tcpdump 的程序,tcpdump 的标准输入接收 pcap 格式的输入流,然后以不同的参数(例如 -e 是显示 mac 地址)从其标准输出打印出解析后的格式。如下图所示:

Linux 内核网络抓包工具 netcap

3. 如何找到数据包的内容

在内核中,是用 skb 来描述数据包的,找到 skb 中所指定的不同 header 的位置,就可以找到整个数据包,skb 的结构大体如下所示:

Linux 内核网络抓包工具 netcap

4. 发送方向数据包不完整,如何过滤数据包

在发送数据包的时候,例如 __ip_finish_output 函数,有时未填充完整的 eth头、ip 头、tcp 头,那么是怎么得到完整的包呢?

netcap 会尽力根据 skb 的 sock 结构来推导,还原数据包,此时抓出来的包有些非关键信息会与实际情况不一致(比如 ip 头的 id 字段)。skb 通过sock来推导数据包内容的逻辑大体如下图所示:

Linux 内核网络抓包工具 netcap

Linux 内核网络抓包工具 netcap

 

原文始发于微信公众号(马哥网络安全):字节跳动开源 Linux 内核网络抓包工具 netcap

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年8月12日19:27:12
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Linux 内核网络抓包工具 netcaphttps://cn-sec.com/archives/3060194.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息