字节跳动开源Linux内核网络抓包工具netcap

字节跳动开源Linux内核网络抓包工具netcap-机器人福利(赋力)
字节跳动开源Linux内核网络抓包工具netcap
此内容为付费资源,请付费后查看
100积分
付费资源

1. 背景介绍

在Linux内核网络开发过程中,网络丢包问题一直是一个挑战。虽然传统的网络抓包工具(如tcpdump)能够帮助开发者定位问题,但它们的效率通常较低,且在深度网络问题定位方面能力有限。随着eBPF技术的快速发展,出现了一种更高级的问题跟踪能力。字节跳动STE团队基于此技术开发了下一代内核网络抓包工具:netcap(net capture)

 

 

netcap与tcpdump工具的不同之处在于,它不仅可以作用于内核网络协议栈准备发包和收包的固定点,还可以几乎跟踪整个内核网络协议栈(有skb作为参数的函数)。字节跳动STE团队使用tcpdump语法作为过滤条件,以skb(socket buffer)为上下文,可以轻松掌握整个报文在内核网络协议栈的完整踪迹,从而帮助开发者大大提高内核网络丢包问题的定位效率。

2. 使用举例

netcap的使用方式举例: 例1:查看ip 10.227.0.45的icmp包是否到达内核预期的函数调用点。这样做的好处是:在定位排查网络问题的时候,可以方便地缩小怀疑范围,提高效率。

netcap skb -f icmp_rcv@1 -i eth0 -e "host 10.227.0.45" -t "-nnv"

其中,-f后面的参数是kprobe或者tracepoint的具体函数(默认是kprobe),并且需要告诉netcap,skb在这个函数(本例是icmp_rcv)的第几个参数(从1开始),本例是第1个。 例2:查看内核对于tcp端口9000的报文的丢包位置。

netcap skb -f tracepoint:skb:kfree_skb -e "tcp port 9000" -S

其中,-f后面的参数是kprobe或者tracepoint的具体函数,tracepoint不需要传递skb是第几个参数。 -S表示连带着打印出此调用的stack,本例中通过stack可以看到是哪里丢包的。

3. 设计与实现

3.1 主体框架

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

image

 

3.2 实现原理

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

image

 

3.2.1 如何按tcpdump语法过滤

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

image

 

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

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

image

 

3.2.3 如何找到数据包的内容

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

image

 

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

在发送数据包的时候,例如__ip_finish_output函数,有时未填充完整的eth头、ip头、tcp头,那么是怎么得到完整的包呢? netcap会尽力根据skb的sock结构来推导,还原数据包,此时抓出来的包有些非关键信息会与实际情况不一致(比如ip头的id字段)。skb通过sock来推导数据包内容的逻辑大体如下图所示。

image

 

4. 其他用法及扩展

4.1 多Trace点汇总分析

netcap能够统计数据包经过多个点的时间,进而汇总输出,这为分析网络性能提供了强大支持。例如,使用以下命令可以观察数据包在多个关键点的通过时间,有助于识别性能瓶颈或潜在问题:

netcap skb -f tracepoint:net:netif_receive_skb,ip_local_deliver@1,ip_local_deliver_finish@3,icmp_rcv@1 -e "host 10.227.0.72 and icmp" -i eth0 --gather --gather-output-color cyan

通过这种方式,开发者可以直观地看到数据包在各个trace点的到达时间,从而分析出数据包性能损耗的具体位置或可能引入的延迟。

4.2 扩展功能

netcap允许用户自定义过滤函数和输出函数,极大地增强了其灵活性和实用性。例如,通过以下命令使用自定义的过滤和输出功能:

netcap skb -f icmp_rcv@1 -e "host 10.227.0.72" -i eth0 --user-filter skb_user_filter.c --user-action skb_user_action.c --user-output-color green

其中,skb_user_filter.cskb_user_action.c 是用户自定义的过滤和输出文件。这种方法允许开发者根据具体需求,编写脚本进行更精细的数据包过滤和内容输出。

5. 未来展望

字节跳动STE团队对netcap的未来发展充满期待。他们计划在以下几个方面继续优化netcap:

  • DPDK支持:尽管当前usdt的上游库存在问题,导致无法支持应用程序的usdt,但团队仍对此功能持开放态度,欢迎有兴趣的开发者进行修改和支持。

  • 多内核版本支持:为了提高netcap的适用性,团队正致力于实现对多个内核版本的统一支持。

  • 自定义输出的优化:当前在数据包数量较多时,自定义输出可能会出现打印错乱的问题。团队计划对此进行优化,确保tcpdump的输出信息和用户自定义的输出信息能够和谐共存。 字节跳动STE团队坚信,netcap将成为网络工程师和测试工程师解决网络问题、优化网络性能的得力工具。他们欢迎广大开发者加入,共同推动这个开源项目的发展。

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容