基于 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://www.pswp.cn/web/89320.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/89320.shtml
英文地址,请注明出处:http://en.pswp.cn/web/89320.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Langchain和Faiss搭建本地知识库对比

对比 对比维度及优缺点分析对比维度LangChain(封装 FAISS)直接使用 FAISS易用性✅ 高,提供高级封装,简化开发流程❌ 中等,需要熟悉 FAISS API学习成本✅ 低,适合快速开发❌ 高,需要掌握 FAISS 的…

Java常用命令汇总

JDK 工具命令jps(Java Virtual Machine Process Status Tool)命令示例:jps -l 应用场景:列出当前系统中所有Java进程的PID和主类名,常用于快速定位Java应用的进程ID。javac(Java Compiler)命令示…

Llama 2:开放基础模型与微调聊天模型

温馨提示: 本篇文章已同步至"AI专题精讲" Llama 2:开放基础模型与微调聊天模型 摘要 在本研究中,我们开发并发布了 Llama 2,一组预训练和微调的大型语言模型(LLMs),其规模从 70 亿参…

ThinkPHP 8 在 Apache 下启用伪静态

ThinkPHP 8 在 Apache 下启用伪静态,需要配置 .htaccess 文件并确保 Apache 支持 URL 重写。以下是详细设置步骤:1. 启用 Apache 重写模块首先确保 Apache 的 mod_rewrite 模块已启用。编辑 Apache 配置文件(通常是 /etc/apache2/apache2.con…

Android开发中Retrofit使用方法与底层原理详解

Retrofit 是 Android 开发中一个 类型安全、基于注解、高度解耦 的 RESTful HTTP 客户端库,由 Square 公司开发。它极大地简化了 Android 应用与 Web 服务进行网络交互的过程。 核心价值: 声明式 API 定义: 使用 Java/Kotlin 接口和注解描述 …

基于FPGA的IIC控制EEPROM读写(2)

基于FPGA的IIC控制EEPROM读写 文章目录基于FPGA的IIC控制EEPROM读写一、EEPROM简介二、代码实现——个人理解1、状态机2、仿真效果3、上板验证4、代码top.viic_master.vuart三、代码实现——复用性较高的IIC模块1、框架设计2、状态机设计3、仿真效果4、上板验证5、代码top.viic…

C# 界面程序在23H2型号系统中无法退出

20250716记录 环境:c# winform问题描述:主界面退出直接使用了Environment.Exit(0); 程序假死,无法关闭解决措施://使用 this.Close();以下代码目标:执行完程序自身后,删除指定文件(可用于程序文…

Kafka——集群核心参数配置

引言在分布式系统中,Kafka 凭借其高吞吐量、低延迟和强大的扩展性,成为数据管道和流处理的首选解决方案。然而,要充分发挥 Kafka 的性能和稳定性,正确配置集群参数至关重要。为什么参数配置如此重要?Kafka 的参数配置直…

单臂路由实现VLAN互通实验

实验拓扑图实验需求:按照图示为 PC3 和 PC4 配置 IP 地址和网关PC3 属于 Vlan10,PC4 属于 Vlan20,配置单臂路由实现 Vlan10 和 Vlan20 三层互通PC3 和 PC4 可以互通实验步骤:1.PC 配置 IP 地址2.PC3 属于 Vlan10,PC4 属…

基于渐进式迁移学习网络(PTLN)​的小样本故障诊断模型

目录 一、研究背景与挑战​ ​二、创新方法:渐进式迁移学习网络(PTLN)​​ ​1. 核心架构​编辑 ​2. 训练优化​ 三、核心代码 四、实验结果与优势​ ​1. 数据集​ ​2. 性能对比​ ​3. 关键验证​ 五、工程价值与未来方向​ 六、补充信息​ 一、研究背景与挑…

网络原理 —— HTTP

通过网络初识,我们认识了网络的协议栈,TCP/IP 分为五层:应用层,传输层,网络层,数据链路层,物理层。也介绍了其中的关键协议。而这些协议的理解,是我们写网络代码的基础。 应用层&…

docker--安装--原理

安装 链接 启动之后,docker状态查看: sudo systemctl status docker 添加普通用户到docker用户组: sudo usermod -aG docker $USER# 重启或者使用以下命令刷新组权限:newgrp docker 原理

Java并发第一篇(从零开始:一文读懂Java并发编程核心基础)

从零开始:一文读懂Java并发编程核心基础一. 为什么需要并发编程?二. 并发编程的“另一面”:挑战与代价2.1 频繁的上下文切换2.2 线程安全问题(如:死锁)三. 夯实基础:必须掌握的核心概念与操作3.…

【删库跑路】一次删除pip的所有第三方库

进入命令行,先list看下库存pip list导出所有的第三方库至一文件列表pip freeze >requirements.txt按照列表卸载所有库pip uninstall -r requirements.txt -y再list看下,可见库存已清空

python 【技术面试题和HR面试题】➕列表操作、条件判断、循环、函数定义编程题

1.技术面试题 (1)解释Linux中的进程、线程和守护进程的概念,以及如何管理它们? 答: 进程 概念:程序运行的实例,有独立资源(如内存),是系统调度的基本单位。 管…

Debian 12中利用dpkg命令安装MariaDB 11.8.2

MariaDB 11.8解决了2038问题,即在32位系统中将timestamp从2038-01-19 03:14:07 UTC扩展到2106-02-07 06:28:15 UTC,向后延长了68年。由于写此文时Debian 12的源中还没有MariaDB 11.8,采用源码编译又太费时,可用二进制码或dpkg安装 .下面简要记…

Go语言高并发聊天室(三):性能优化与压力测试

Go语言高并发聊天室(三):性能优化与压力测试 🎯 本篇目标 在前两篇文章中,我们完成了聊天室的基础功能。本篇将深入性能优化,实现真正的高并发: 🔍 性能瓶颈分析⚡ 关键优化技术&…

【leetcode】852. 山脉数组的封顶索引

文章目录题目题解1. 遍历2. 二分查找题目 852. 山脉数组的封顶索引 给定一个长度为 n 的整数 山脉 数组 arr ,其中的值递增到一个 峰值元素 然后递减。 返回峰值元素的下标。 你必须设计并实现时间复杂度为 O(log(n)) 的解决方案。 示例 1: 输入&a…

Java期末考试准备

文章目录Java期末考试准备一、Java的输入.next()输入.nextLine()输入区别补充二、Java的输出三、类中常写方法toString()equals()其他四、容器/数组五、继承六、静态属性、方法.七、抽象类八、接口九、初始化模块十、泛型考完结束语Java学习历程注:这篇文章本来是写给同学的&am…

飞算JavaAI进阶:重塑Java开发范式的AI革命

引言:当代码生成进入"自动驾驶"时代 在2025年的Java开发领域,一场由AI驱动的革命正在重塑传统开发范式。当GitHub Copilot还在通过代码补全提升效率时,飞算JavaAI已实现从需求分析到完整工程代码生成的"端到端"闭环。这款…