(附源碼)基于 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://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已實現從需求分析到完整工程代碼生成的"端到端"閉環。這款…