跳转至

netcap调试

rust实践

  • https://github.com/jeremychone/rust-genai 一个rust比较好的库,对错误处理、包管理等有很好的示例。

实现

tcpdump是ip层抓包工具,通过netcap使用xdp的方式可以抓取更加底层的包。

tcpdump 抓包点位置固定:入向是 xdp 之后,tc 之前;出向是 tc 之后。如果网络包通过其他方式进行路径优化后,不经过这几个位置,那么 tcpdump 就抓不到了,另外 tcpdump 还无法支持进程名,pid,namespace id 等其他过滤条件。

tcpdump将pcap filter过滤描述语法,转换成classic bpf对包进行过滤,如果返回0就丢弃该包,返回1就保留该包。 + 复用pcap的filter语法,libpcap可以将filter转换成为classic bpf。 + 再通过将classic bpf转换成为c,c转换成为ebpf,编译成二进制。 + 或者直接根据classic bpf指令和ebpf指令的规则,将classic bpf转换成ebpf。

通过将ebpf程序注入内核,通过map或者buffer将内核包数据传递到用户态,然后将数据进行解析。对数据解析的部分通过起一个tcpdump -r的进程,解析pcap包。

相关库和原理

golang

  • libpcap 将filter转换成classic bpf
  • cloudflare/cbpfc 将classic bpf转换成c(c可以通过llvm编译成ebpf), 或者将classic bpf转换成ebpf
  • cilium/ebpf 提供了ebpf相关指令类
  • iovisor/gobpf

rust

https://github.com/mmisono/rust-cbpf/tree/master https://github1s.com/polachok/bpfjit/blob/master/src/lib.rs https://github.com/qmonnet/rbpf

golang-rust ffi

可以看到在ebpf领域,golang有良好的生态,包括了丰富的库。如果rust要使用除了重写以外,还可以通过golang-rust ffi进行复用。在项目中也是,可以复用其它语言开发的组件,然后逐步替换。

https://www.ihcblog.com/rust2go/

参考

评论