戰(zhàn):libpcap物理抓包技術(shù)方案)
這次我們來看一個(gè)不算常見但非常硬核的話題把 Wireshark 移植到鴻蒙設(shè)備上并且讓它具備真正意義上的“物理抓包”能力。這里的“真正”不是指普通應(yīng)用抓包時(shí)自己做一次流量轉(zhuǎn)發(fā)然后讀明文而是指讓網(wǎng)卡控制器把到達(dá)接口的數(shù)據(jù)幀原樣交給上層由 libpcap 把這些幀讀出來再交給 Wireshark 做協(xié)議分析。先潑一盆冷水目前并不存在一個(gè)可以直接從官網(wǎng)下載、雙擊安裝的鴻蒙版 Wireshark 安裝包。官方渠道只面向 Windows、macOS、Linux 等桌面平臺(tái)。所以這篇文章的主題其實(shí)是“移植路線”而不是“成品使用”。如果你手里有一塊 OpenHarmony 標(biāo)準(zhǔn)系統(tǒng)開發(fā)板或者一臺(tái)能刷 OpenHarmony 的 x86_64 設(shè)備想在這里跑起 tshark 抓包甚至把 Qt 版 Wireshark 界面拉起來那么這篇文章就是一份從判斷系統(tǒng)能力到交叉編譯、再到真機(jī)驗(yàn)證的完整清單。移植 Wireshark 到鴻蒙這件事核心難點(diǎn)有三個(gè)底層能否創(chuàng)建原始套接字、用戶態(tài)能否拿到抓包權(quán)限、Qt 圖形棧能否在鴻蒙設(shè)備上正常驅(qū)動(dòng)。這三個(gè)關(guān)卡只要有一個(gè)不通項(xiàng)目就只能停留在“源碼編譯通過”的階段。下面我會(huì)把每一關(guān)單獨(dú)拆開講并給出可以在開發(fā)板上直接執(zhí)行的驗(yàn)證步驟。1. 核心能力速覽能力項(xiàng)說明項(xiàng)目主題Wireshark / tshark 在鴻蒙設(shè)備上的移植與真抓包驗(yàn)證抓包層級(jí)網(wǎng)卡物理鏈路幀截獲基于 Linux packet socket libpcap關(guān)鍵依賴libpcap、dumpcap、libwireshark、Qt建議硬件帶以太網(wǎng)口或可外接網(wǎng)卡的 OpenHarmony 開發(fā)板系統(tǒng)要求OpenHarmony 標(biāo)準(zhǔn)系統(tǒng)形態(tài)Linux 內(nèi)核需要開放 packet socket權(quán)限要求root或給抓包進(jìn)程單獨(dú)授予 CAP_NET_RAW 和 CAP_NET_ADMIN命令行能力tshark 實(shí)時(shí)抓包、BPF 捕獲過濾、pcapng 輸出GUI 能力Wireshark 主界面依賴 Qt 在目標(biāo)設(shè)備上的可用性批量能力適合通過 shell 腳本配合 tshark 輪轉(zhuǎn)抓包、離線批量解析不適合場(chǎng)景HarmonyOS NEXT 商用閉源版本默認(rèn)限制較多需要廠商級(jí)調(diào)試固件配合從這張表可以判斷這套方案更適合做系統(tǒng)級(jí)研發(fā)、驅(qū)動(dòng)調(diào)試和網(wǎng)絡(luò)設(shè)備開發(fā)的工程師。普通應(yīng)用開發(fā)者若只是想知道自家 App 發(fā)了什么 HTTPS 請(qǐng)求優(yōu)先用應(yīng)用內(nèi)調(diào)試能力或真機(jī)日志就夠了不需要走完整移植鏈路。2. 鴻蒙上的“真抓包”和普通抓包有什么區(qū)別很多手機(jī)端抓包工具實(shí)際采用的方式是流量轉(zhuǎn)發(fā)一端建立一個(gè)虛擬網(wǎng)卡把本機(jī)特定應(yīng)用的流量導(dǎo)入到虛擬網(wǎng)卡再由抓包工具讀取、解密、展示。想要看到 HTTPS 明文還要往系統(tǒng)里安裝自定義 CA 證書讓抓包工具以中間人身份觀察 TLS 會(huì)話。這種模式對(duì) App 接口調(diào)試很方便但它有幾個(gè)硬邊界只能看到流量導(dǎo)向虛擬網(wǎng)卡的那部分內(nèi)容看不到鏈路層廣播、ARP、VLAN 等二層報(bào)文如果 App 開啟了 SSL Pinning不再信任系統(tǒng) CA那么自定義 CA 證書會(huì)被拒絕無法方便地觀察其他設(shè)備發(fā)往本機(jī)的裸流量因?yàn)閼?yīng)用層沒有權(quán)限讀取物理接口的原始數(shù)據(jù)幀抓包工具本身要參與流量轉(zhuǎn)發(fā)在網(wǎng)絡(luò)異常時(shí)會(huì)把問題復(fù)雜化。你很難判斷故障是目標(biāo)服務(wù)導(dǎo)致的還是中間抓包鏈路導(dǎo)致的。而 Wireshark 在 Linux 平臺(tái)上的抓包鏈路是下面這樣網(wǎng)卡硬件收到數(shù)據(jù)幀網(wǎng)卡驅(qū)動(dòng)把數(shù)據(jù)幀交給內(nèi)核網(wǎng)絡(luò)協(xié)議棧libpcap 通過 AF_PACKET 套接字從協(xié)議棧復(fù)制一份原始數(shù)據(jù)幀到用戶態(tài)dumpcap 作為權(quán)限受控的抓包子進(jìn)程把數(shù)據(jù)寫入文件或通過管道傳給 WiresharkWireshark 主程序解析協(xié)議棧顯示數(shù)據(jù)包列表和協(xié)議樹。在這個(gè)鏈路里抓包工具不修改、不轉(zhuǎn)發(fā)、不參與業(yè)務(wù)數(shù)據(jù)流。它只是旁路讀取了一份報(bào)文副本所以不會(huì)改變?cè)ㄐ判袨?。這種模式能觀察到真正的物理接口狀態(tài)包括混雜模式下收到的其它目標(biāo) MAC 的報(bào)文、WiFi 監(jiān)聽模式下抓到的無線管理幀、以及各種非 IP 協(xié)議報(bào)文。這也就是標(biāo)題里強(qiáng)調(diào)的“物理意義”抓包。換句話說普通抓包工具解決的是“應(yīng)用層協(xié)議調(diào)試”問題Wireshark 解決的是“網(wǎng)絡(luò)里到底跑了什么”的問題。鴻蒙開發(fā)板、鴻蒙 PC 形態(tài)設(shè)備如果要做網(wǎng)絡(luò)協(xié)議棧調(diào)優(yōu)、驅(qū)動(dòng)驗(yàn)證或內(nèi)網(wǎng)故障排查后者不可替代。3. 移植前的系統(tǒng)結(jié)構(gòu)判斷鴻蒙到底能不能創(chuàng)建 packet socket先明確一個(gè)概念OpenHarmony 標(biāo)準(zhǔn)系統(tǒng)使用的是 Linux 內(nèi)核。只要是 Linux 內(nèi)核網(wǎng)絡(luò)協(xié)議棧的代碼路徑就在那里AF_PACKET 套接字機(jī)制在 Linux 內(nèi)核中也長(zhǎng)期存在。但代碼路徑存在不代表內(nèi)核編譯配置里一定開放了 packet socket也不代表系統(tǒng)安全策略允許普通用戶態(tài)進(jìn)程隨意創(chuàng)建原始套接字。所以移植 Wireshark 第一步不是急著拉源碼開編而是先確認(rèn)目標(biāo)設(shè)備的底層能力。3.1 內(nèi)核層要確認(rèn)的能力要支持 libpcap 的 Linux 抓包后端內(nèi)核必須有以下能力AF_PACKET 套接字沒有被禁用網(wǎng)卡驅(qū)動(dòng)支持混雜模式或者在 WiFi 場(chǎng)景下網(wǎng)卡驅(qū)動(dòng)支持監(jiān)聽模式SELinux 權(quán)限策略不能攔截抓包進(jìn)程對(duì)網(wǎng)絡(luò)設(shè)備節(jié)點(diǎn)的訪問。前兩項(xiàng)通常由開發(fā)板廠商的內(nèi)核配置決定后一項(xiàng)需要結(jié)合鴻蒙系統(tǒng)的安全策略來判斷。由于不同開發(fā)板的內(nèi)核版本和配置差異很大最可靠的方式不是翻內(nèi)核文檔而是直接運(yùn)行一個(gè)小程序測(cè)試。3.2 用戶態(tài)權(quán)限要滿足的條件在 Linux 內(nèi)核上使用 AF_PACKET 抓包進(jìn)程需要 root或者具有 CAP_NET_RAW 能力如果要設(shè)置混雜模式還會(huì)涉及 CAP_NET_ADMIN。OpenHarmony 開發(fā)板一般會(huì)提供 root shell 的調(diào)試入口或者可以使用 root 用戶登錄這是做移植實(shí)驗(yàn)最順的條件。如果拿到的設(shè)備只有普通用戶權(quán)限也沒有辦法提升能力那這條路基本走不通。后面所有 GUI 層面的移植工作也就不需要繼續(xù)了。3.3 測(cè)試 packet socket 的最小代碼這里給出一個(gè)非常小的 C 程序用來判斷目標(biāo)鴻蒙設(shè)備能否創(chuàng)建數(shù)據(jù)包套接字#include stdio.h #include sys/socket.h #include linux/if_packet.h #include linux/if_ether.h #include unistd.h int main(void) { int fd socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); if (fd 0) { perror(packet socket test failed); return 1; } printf(packet socket create ok\n); close(fd); return 0; }將這段代碼用目標(biāo) SDK 的交叉編譯器編譯后通過鴻蒙設(shè)備調(diào)試工具推送到開發(fā)板運(yùn)行。能輸出packet socket create ok說明底層網(wǎng)絡(luò)能力具備如果提示Operation not permitted說明缺 root 或能力受限如果提示Address family not supported by protocol則說明內(nèi)核配置里根本沒有開啟 AF_PACKET需要先換固件。4. Wireshark 依賴拆解與移植工作量評(píng)估Wireshark 不是單一可執(zhí)行文件它的工程結(jié)構(gòu)包含多個(gè)模塊。移植時(shí)不需要全部重寫但需要分清哪些模塊要與鴻蒙系統(tǒng)深入交互哪些模塊只是純計(jì)算邏輯。模塊作用移植重點(diǎn)libpcap從內(nèi)核抓包的后端庫需要交叉編譯并確認(rèn) AF_PACKET 抓包路徑可用dumpcap權(quán)限剝離后的抓包子進(jìn)程需要單獨(dú)處理提權(quán)方案GUI 通過它抓包libwiretap讀取和寫入 pcap/pcapng 文件純 C 實(shí)現(xiàn)一般不需要改動(dòng)libwireshark協(xié)議解析核心純 C 實(shí)現(xiàn)跨平臺(tái)性強(qiáng)工作量集中在構(gòu)建腳本QtGUI 框架需要準(zhǔn)備鴻蒙可用的 Qt SDK是整個(gè) GUI 移植的大頭Wireshark 主程序界面交互、過濾規(guī)則、協(xié)議樹顯示對(duì) Qt Widgets 依賴很深嵌入式環(huán)境需要裁剪從移植難度看最容易被低估的是 dumpcap 的權(quán)限設(shè)計(jì)。在桌面 Linux 上Wireshark 安裝包通常會(huì)把 dumpcap 設(shè)置為擁有抓包能力這樣用戶運(yùn)行 Wireshark 時(shí)不需要直接以 root 啟動(dòng)整個(gè) GUI只有底層 dumpcap 子進(jìn)程具備抓包權(quán)限。界面卡死或者過濾條件寫錯(cuò)不會(huì)帶著抓包引擎一起崩潰。移植到鴻蒙時(shí)這套權(quán)限模型需要繼續(xù)保留。你不能因?yàn)橄勇闊┚腿?root 啟動(dòng) Wireshark否則一個(gè)顯示過濾誤操作就可能影響抓包子進(jìn)程的穩(wěn)定性。Qt 部分則是另一個(gè)高成本點(diǎn)。Wireshark 的主界面使用大量 Qt Widgets 組件對(duì)窗口系統(tǒng)、OpenGL 和字體渲染都有依賴。在嵌入式和移動(dòng)形態(tài)的鴻蒙設(shè)備上這些基礎(chǔ)組件可能不完整。更穩(wěn)妥的落地順序是先全力保證 tshark 和 dumpcap 能穩(wěn)定抓包此時(shí)已經(jīng)具備 80% 的實(shí)用價(jià)值再根據(jù)設(shè)備形態(tài)決定是否繼續(xù)挑戰(zhàn) GUI。5. 鴻蒙編譯環(huán)境準(zhǔn)備與通用交叉編譯思路把 Wireshark 移植到鴻蒙通常不是直接在開發(fā)板上編譯而是在 PC 上使用鴻蒙 SDK 自帶的交叉工具鏈完成構(gòu)建再把產(chǎn)物推送到設(shè)備。這樣迭代快也方便后續(xù)接入腳本做自動(dòng)化構(gòu)建。5.1 準(zhǔn)備交叉編譯工具鏈一套典型的編譯環(huán)境包含以下內(nèi)容一臺(tái) Linux x86_64 主機(jī)OpenHarmony SDK里面帶有 Clang/LLVM 交叉工具鏈目標(biāo)設(shè)備對(duì)應(yīng)的 sysroot保證能找到基礎(chǔ) C 庫和內(nèi)核頭文件CMake、Ninja、Python 等構(gòu)建工具。工具鏈路徑需要按本機(jī) SDK 實(shí)際目錄調(diào)整下面是示例export OHOS_SDK/opt/ohos-sdk export TO