当前位置: 首页 > news >正文

(附源码)基于 Go 和 gopacket+Fyne 的跨平台网络抓包工具开发实录

基于 Go 和 gopacket + Fyne 的跨平台网络抓包工具开发实录

一、项目背景

在网络安全、协议分析、运维排查等场景中,抓包工具是不可或缺的利器。Wireshark 虽然功能强大,但对于部分初学者或有定制需求的开发者来说,学习曲线较陡,且二次开发门槛较高。为此,我基于 Go 语言和 Fyne GUI 框架,开发了一款轻量级、跨平台的网络抓包工具——IP_pkg_analyze,旨在提供简单易用、界面友好、功能实用的抓包体验。
很久之前做的毕设项目,现在翻出来重新投稿一下

二、技术选型

  • Go 语言:并发能力强,跨平台,生态丰富,适合底层网络编程。
  • Fyne:Go 生态下优秀的 GUI 框架,支持 Windows、Linux、macOS,界面美观,开发效率高。
  • gopacket:Google 开源的 Go 抓包库,功能强大,支持多种协议解析。
  • go-findfont:自动查找系统字体,保证界面中文显示友好。

三、项目结构

项目结构清晰,便于维护和扩展:

ip_package-master/├── main.go           // 程序入口├── app/│   ├── ip/           // 核心抓包与界面逻辑│   └── util/         // 字体等工具└── func/             // 设备选择等辅助功能

四、核心功能与界面

1. 网络设备选择与抓包

程序启动后自动检测本机所有网络接口,用户可一键选择需要抓包的网卡。抓包支持混杂模式和严格模式切换,满足不同场景需求。

关键代码片段:

// 获取所有网络接口
func Get_if_list() []IfaceInfo {devices, err := pcap.FindAllDevs()if err != nil {log.Fatal(err)}// ...省略部分代码...for _, i := range interface_list {byName, err := net.InterfaceByName(i.Name)address, err := byName.Addrs()ifaceInfoList = append(ifaceInfoList, IfaceInfo{NickName: byName.Name, IPv4: address[1].String()})}return ifaceInfoList
}

2. 实时数据包捕获与展示

抓包过程中,所有捕获到的数据包会实时显示在主界面列表中,包含序号、时间、源/目的地址、协议、长度、摘要等信息。支持点击查看详细内容和分层信息。

关键代码片段:

func GetPkg(ctx context.Context, device_str string) {handle, err = pcap.OpenLive(device_str, snapshot_len, Promiscuous, timeout)packetSource := gopacket.NewPacketSource(handle, handle.LinkType())for packet := range packetSource.Packets() {p := anlysePacket(packet)AllPkgs = append(AllPkgs, p)AllPkgInfos = append(AllPkgInfos, packet)// ...省略部分代码...}
}

3. 数据包详细内容与分层解析

点击任意数据包,可查看其原始字节内容(16 进制/ASCII)、协议分层(链路层、网络层、传输层、应用层)等详细信息,便于协议分析和调试。

关键代码片段:

func NewPkgInfoData(packet gopacket.Packet) {PkgMetaData = PkgBytes2StringSlice(packet.Data())PkgCharData = PkgBytes2AsciiSlice(packet.Data())PkgInfoWidget.Refresh()PkgCharWidget.Refresh()
}
func NewLayersData(FrameNo int, packet gopacket.Packet) map[string][]string {// 解析各层协议if packet.LinkLayer() != nil {// ...}if packet.NetworkLayer() != nil {// ...}if packet.TransportLayer() != nil {// ...}if packet.ApplicationLayer() != nil {// ...}return LayersData
}

4. 数据包过滤与排序

支持按源/目的 IP、端口、长度等多维度过滤和排序,帮助用户快速定位目标流量。

菜单功能示例:

var tools_key = []string{"文件(F)", "过滤(E)", "排序(V)", "切换(W)", "模式(M)", "发送(S)", "捕获(C)"}

5. pcap 文件保存与导入

抓包结果可一键保存为 pcap 文件,便于后续分析或与他人共享。也支持导入本地 pcap 文件进行离线分析。

关键代码片段:

func SaveAsPcap(path string, pkgs []gopacket.Packet) (string, error) {f, err := os.Create(path)w := pcapgo.NewWriter(f)for _, packet := range pkgs {w.WritePacket(packet.Metadata().CaptureInfo, packet.Data())}return path, nil
}

6. 自定义数据包发送

内置数据包发送功能,支持自定义源/目的 IP、端口、MAC、Payload 等,适合协议测试和网络实验。

关键代码片段:

func SendPkg(pkg SendPkgInfo) (int, error) {handle, err = pcap.OpenLive(device, snapshot_len, promiscuous, timeout)ethernetLayer := &layers.Ethernet{...}ipLayer := &layers.IPv4{...}tcpLayer := &layers.TCP{...}buffer = gopacket.NewSerializeBuffer()gopacket.SerializeLayers(buffer, options, ethernetLayer, ipLayer, tcpLayer, gopacket.Payload(rawBytes))handle.WritePacketData(buffer.Bytes())return 0, nil
}

7. 实时流量速率监控

主界面实时显示当前网卡上下行速率,便于流量监控和异常检测。

关键代码片段:

func monitor(ctx context.Context) {for {FlowsStr.Set(fmt.Sprintf("\rDown:%.2fkb/s \t Up:%.2fkb/s", float32(downStreamDataSize)/1024, float32(upStreamDataSize)/1024))downStreamDataSize = 0upStreamDataSize = 0time.Sleep(1 * time.Second)}
}

五、界面展示

界面采用 Fyne 框架,风格简洁现代,主要分为:

  • 顶部菜单栏:文件、过滤、排序、模式切换、发送、捕获等功能入口
  • 主体区域:数据包列表、分层信息、详细内容、流量速率等模块分区
  • 支持窗口自适应、分辨率缩放

(此处可插入实际运行截图)

六、使用体验

  • 跨平台:Windows、Linux 下均可流畅运行,界面一致。
  • 易用性:无需复杂配置,开箱即用,适合新手和日常分析。
  • 可扩展:代码结构清晰,便于二次开发和功能拓展。
  • 性能:基于 Go 并发,抓包效率高,界面响应流畅。

七、总结与展望

本项目作为一款轻量级抓包工具,兼顾了易用性与实用性,适合网络学习、协议分析、实验教学等多种场景。后续计划:

  • 增加更多协议解析与可视化支持
  • 丰富过滤与统计功能
  • 支持插件机制,便于社区扩展
  • 优化界面交互体验

项目地址
https://github.com/evepupil/ip_package

欢迎大家试用、反馈和参与改进!


部分核心代码已在文中穿插展示,完整代码请参考项目仓库。
如有疑问或建议,欢迎留言交流!



文章转载自:
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://www.dtcms.com/a/281626.html

相关文章:

  • 轻松管理多个Go版本:g工具安装与使用
  • DTU轮询通信有哪些隐患?功耗、容量与响应效率全解析
  • Cookie全解析:Web开发核心机制
  • jetson安装opencv的cuda的加速
  • 二分答案#贪心
  • Python的requests包中使用session管理cookie
  • 无人机故障响应模块运行与技术难点
  • 知识蒸馏 是什么?具体怎么实现的
  • 防抖与节流
  • JavaScript认识+JQuery的依赖引用
  • 手撕线程池详解(C语言源码+解析)
  • 35.KMP 算法
  • 分发糖果-leetcode
  • Kafka亿级消息资源组流量掉零故障排查
  • 【LLIE专题】通过通道选择归一化提升模型光照泛化能力
  • MySQL 8.0 OCP 1Z0-908 题目解析(25)
  • 【QT】实现应用程序启动画面
  • 笔试——Day9
  • linux kernel的错误编码指针详细介绍
  • 【深度学习新浪潮】什么是任意倍率超分?
  • 知识库信息切片,AI降本增效的利刃
  • Unity灯光面板环境设置
  • [Python] -实用技巧6-Python中with语句和上下文管理器解析
  • 身份核验自动化-姓名身份证号二要素核验接口-API实名验证
  • 计算机系统方向可发会议/期刊参考时间
  • CF1916D Mathematical Problem 题解
  • 数据结构——顺序表的相关操作
  • TypeScript之旅
  • 读取ubuntu的磁盘分区表与超级块
  • 万字长文深度解析:AI搜索范式背后的四大核心模块