(附源码)基于 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
欢迎大家试用、反馈和参与改进!
部分核心代码已在文中穿插展示,完整代码请参考项目仓库。
如有疑问或建议,欢迎留言交流!