

基于 go 的 wireshark 插件实现方案
source link: https://forrestsu.github.io/posts/network/wireshark-go-plugin/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

基于 go 的 wireshark 插件实现方案
2020年12月8日在业务服务重构过程中,发现后台一些RPC服务,使用的自定义的应用层协议(七层)。 为了方便验证重构逻辑,想在在海量的请求中,快速找到某一类业务请求包。
一般来说简单的协议使用 lua 实现即可,但是遇到 pb/thrift 等 tlv 类型的协议就比较麻烦了; 比较友好的是,目前有 lua-protobuf 这样的库,可以在lua中解析PB协议, 只需要提供proto即可;
但是对于内部的 tlv 协议,由于本人不太会使用lua去封装c库;
突然萌生了一个想法,能不能用 golang 来开发 wireshark 插件? 是否可以让 lua5.2 直接调用cgo?
3 定制目标(okr)
定位: 本地的报文分析工具
- 1 当业务遇到一种业务的字节协议时,可快速在 wireshark 中解析,展示;
- 2 支持使用 go 实现包解析;
- 3 对解析性能要求(1000条/s即可),准确解析;
4 思考方案
采用lua可快速实现一个简单的 wireshark 插件,快捷高效,官方文档也比较完善。 调试验证脚本也比较方便,重新加载即可生效,无需编译。 但是在工作中,有各种各样的 tlv 类型协议接口(历史原因),lua在tlv类型的协议解析上就显得有点吃力。
4.1 那么怎么解决这类问题呢?
既然 lua 作为胶水语言,我们把 lua 当作入口,然后调用 go 的动态库。 同时业务也有各种协议的编解码包,对接新的协议可谓是顺风顺水呀! 能不能直接复用呢? 经过一番折腾,没有成功 :(
4.2 退一步海阔天空
当然我们不能气馁,不行就退一步,折中一下,能不能把c
也当做一个入口(桥梁);
链路:lua -> c -> go
, 因为这两个环节是相当成熟的,初步评估可行,于是写代码验证。
5 代码实现
5.1 插件效果
5.2 Benchmark
整体性能还不错,比预想的高10倍^_^。
记录条数: 96180 条
文件总大小: 44 M
单个报文大小:300 ~ 500 bytes
解析耗时: 9.479s
平均速率: 1 W/s
time tshark -r udp.cap > /dev/null
# 9.479s real 9.05s user 0.94s sys
探索了一种跨语言编程方式,结合多种语言的特性,最终将一个想法落地实现。 在解决问题方面:尝试用已有技能,解决不同问题,能力提升。
解决的一些问题
在编写插件过程中,也遇到和解决了不少问题,系列文章如下:
Recommend
-
41
基础概念 SSR:即服务端渲染(Server Side Render) 传统的服务端渲染可以使用Java,php 等开发语言来实现,随着 Node.js 和相关前端领域技术的不断进步,前端同学也可以基于此完成独立的服务端渲染。 过程:浏览器发送请求 -
-
7
基于RePlugin实现Android项目插件化(二) 上一篇介绍了宿主工程...
-
32
基于RePlugin实现Android项目插件化(一) 前一篇文章介绍了Android项目基于ARouter的组件化过程,其实大部分中小型项目只需要组件化就足够...
-
14
挖坑的张师傅RocketMQ1天前 学习 RocketMQ,需要搞懂两个东西:通信和存储。这里花了一点时间写了一个 RocketMQ 的 wireshark lua 插件...
-
6
Envoy 可以作为 Sevice Mesh 微服务框架中的代理实现方案,Rainbond 内置的微服务框架同样基于 Envoy 实现。本文所描述的熔断实践基于 Rainbond 特有的插件机制实现。 Envoy 熔断机制介绍
-
7
wireshark lua 插件之 tvb():string() 2020年12月5日 | 字数 482 |
-
2
wireshark插件,如何关联请求应答(如ping协议)? 2020年12月5日 | 字数 2558 |
-
5
wireshark lua 插件tcp报文分段(desegment)? 2020年12月5日 | 字数 591 |
-
9
背景:对于大型web应用而言,功能极其丰富复杂,为了具备扩展性,部分项目选择插件化架构方式,开放一部分系统Hook给具备开发能力的用户,不但提升用户的体验感,还同时丰富平台功能,一举两得。如何构建具备插件化能力的平台?本文尝试通过分析je...
-
6
前端埋点对于那些营销活动的项目是必须的,它可以反应出用户的喜好与习惯,从而让项目的运营者们能够调整策略优化流程提高用户体验从而获取更多的$。这篇文章将实现一个Vue3版本的埋点上报插件,主要功能有 通过Vue自定义指令形式实现点击事件上报
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK