
如何用 Moby 的 Wireshark 插件解析 NetworkDB 的 memberlist 組播與加密消息【免費(fèi)下載鏈接】mobyThe Moby Project - a collaborative project for the container ecosystem to assemble container-based systems項(xiàng)目地址: https://gitcode.com/GitHub_Trending/mo/moby當(dāng)你在排查 Mobymoby集群網(wǎng)絡(luò)問(wèn)題時(shí)NetworkDB 是 overlay 網(wǎng)絡(luò)在節(jié)點(diǎn)之間同步狀態(tài)endpoint 記錄、peer 信息的 gossip 層。它的消息通過(guò) memberlist 協(xié)議在 TCP/UDP 端口上傳輸加密時(shí)抓包只能看到密文。Moby 倉(cāng)庫(kù)自帶兩個(gè) Wireshark Lua 插件memberlist.lua 與 moby-networkdb.lua可以把抓到的 memberlist 報(bào)文解析成協(xié)議字段并把 user data 消息進(jìn)一步解析為 NetworkDB gossip 的 protobuf 結(jié)構(gòu)配合密鑰文件還能解開(kāi)加密消息。完成本文后你在 Wireshark 中打開(kāi)抓包就能按協(xié)議樹(shù)查看 ping、alive、push/pull 等 memberlist 消息類(lèi)型以及 NetworkDB 的 TableEvent、NetworkEvent 等具體載荷。以下依據(jù) contrib/wireshark/README.md 及插件源碼整理適用于 Wireshark 4.5 或更新版本。準(zhǔn)備條件Wireshark 版本與插件文件README 明確要求Wireshark 4.5 或更新版本4.4 的 msgpack 協(xié)議解析器不完整無(wú)法正確解碼 memberlist 消息。文檔指出 2025-06-30 時(shí) 4.5 尚未正式發(fā)布可能需要使用官方 nightly build請(qǐng)按 Wireshark 官方下載渠道獲取。插件文件位于當(dāng)前倉(cāng)庫(kù)的 contrib/wireshark/ 目錄無(wú)需從別處下載memberlist.lua注冊(cè)名為memberlist的協(xié)議解析 memberlist 的 TCP/UDP 報(bào)文moby-networkdb.lua注冊(cè)名為networkdbgossip的協(xié)議解析 NetworkDB gossip 消息。由于 NetworkDB 的節(jié)點(diǎn)間通信以 memberlist user message 形式承載必須先讓 memberlist 解析器調(diào)用networkdbgossip子解析器。按 Wireshark 的 Lua 插件手冊(cè)把這兩個(gè)文件配置為啟動(dòng)加載放入對(duì)應(yīng) Lua 插件目錄或在luacpath/插件配置中指定路徑使 Wireshark 或 Tshark 能加載memberlist.lua和moby-networkdb.lua。配置 ProtoBuf 協(xié)議加載 NetworkDB 的 IDLNetworkDB 消息序列化為 protobuf而 protobuf 不是自描述格式必須向 Wireshark 的 ProtoBuf 協(xié)議提供消息的 IDL 定義才能解析。README 給出的操作是克隆 moby/moby 倉(cāng)庫(kù)提供 NetworkDB 的 IDL 定義克隆 protocolbuffers/protobuf 倉(cāng)庫(kù)提供 protobuf 標(biāo)準(zhǔn)庫(kù) IDL在 Wireshark 中配置 ProtoBuf 協(xié)議Preferences - Protocols - ProtoBuf勾選 Load .proto files on startupprotobuf.reload_protos勾選 Dissect Protobuf fields as Wireshark fieldsprotobuf.pbf_as_hf向 Protobuf Search Paths 表uat:protobuf.search_paths添加條目path/to/protocolbuffers/protobuf/src path/to/moby/moby/vendor path/to/moby/moby path/to/moby/moby/libnetwork/networkdb (Load all files) path/to/moby/moby/libnetwork/drivers/overlay (Load all files)其中path/to/...替換為你實(shí)際克隆出的兩個(gè)倉(cāng)庫(kù)根目錄。README 特別強(qiáng)調(diào)只把.proto文件拷出來(lái)是不夠的必須保留目錄結(jié)構(gòu)否則定義無(wú)法正確加載。注意本文所用倉(cāng)庫(kù)中這兩個(gè)目錄對(duì)應(yīng)的.proto文件當(dāng)前實(shí)際位于 daemon/libnetwork/networkdb/networkdb.proto 和 daemon/libnetwork/drivers/overlay/overlay.proto即libnetwork已移到daemon/之下。如果你以當(dāng)前源碼布局克隆倉(cāng)庫(kù)應(yīng)把上面后兩條搜索路徑指向?qū)嶋H存在.proto的目錄保證 protobuf 解析器能找到networkdb與overlay包的定義。配置 memberlist 協(xié)議解析 NetworkDB 用戶消息在 Preferences - Protocols - MEMBERLIST 中把User Data Dissectormemberlist.userdata_dissector設(shè)置為networkdbgossip使 memberlist 的 User 消息體交給 NetworkDB gossip 解析器處理可選設(shè)置Memberlist TCPUDP port(s)memberlist.ports。插件默認(rèn)端口為 7946見(jiàn) memberlist.lua 中的default_settingsREADME 給出的示例值是7946,10000-10999用于分析 NetworkDB 單元測(cè)試的抓包。按你實(shí)際網(wǎng)絡(luò)環(huán)境的 memberlist 端口調(diào)整。解析加密消息配置密鑰文件memberlist 加密消息的解密依賴(lài)一份包含對(duì)稱(chēng)密鑰的文件。文檔說(shuō)明的完整鏈路是讓 dockerd 把 NetworkDB 加密密鑰寫(xiě)入日志文件設(shè)置環(huán)境變量NETWORKDBKEYLOGFILE為期望的文件路徑。實(shí)現(xiàn)見(jiàn) daemon/libnetwork/networkdb/debug.gologEncKeys以追加方式把每把密鑰編碼為十六進(jìn)制字符串寫(xiě)入該文件每行一把密鑰文件權(quán)限0o600密鑰在SetKey和集群初始化config.Keys時(shí)分別寫(xiě)入見(jiàn) cluster.go。該環(huán)境變量未設(shè)置時(shí)直接返回不寫(xiě)文件因此要在啟動(dòng) dockerd 之前設(shè)置好在 Wireshark 中指向該文件Preferences - Protocols - MEMBERLIST把Encryption Key Logfile Pathmemberlist.keylog設(shè)為第 1 步生成的文件。文件內(nèi)容就是十六進(jìn)制密鑰、以換行分隔——恰好與 dockerd 寫(xiě)出的格式一致。插件側(cè)的解密邏輯同樣在 memberlist.lua對(duì) UDP 報(bào)文嘗試try_decrypt按行讀取密鑰逐一以 AES-GCM 解密并校驗(yàn) AEAD tag命中后在協(xié)議樹(shù)中標(biāo)記 Encrypted Memberlist 并展開(kāi)解密內(nèi)容。驗(yàn)證解析結(jié)果與處理首次啟動(dòng)報(bào)錯(cuò)打開(kāi)抓包后按以下現(xiàn)象判斷配置是否生效以下協(xié)議名與消息類(lèi)型來(lái)自?xún)蓚€(gè) Lua 插件的源碼定義memberlist 報(bào)文在協(xié)議列顯示為 Memberlist Protocol, Type: ...message_type字段取值為Ping、Alive、Suspect、Dead、PushPull、Encrypt、User等memberlist.lua 中的message_type_enumUser 消息的載荷被networkdbgossip協(xié)議展開(kāi)為networkdb.GossipMessagetype字段再?zèng)Q定具體消息1NetworkEvent、2TableEvent、3NetworkPushPull、4BulkSyncMessage、5CompoundMessage、6NodeEventmoby-networkdb.lua 中的msgtype_mapTableEvent 還會(huì)按表名二次解析overlay_peer_table對(duì)應(yīng)overlay.PeerRecordendpoint_table對(duì)應(yīng)libnetwork.EndpointRecord配置了密鑰文件后加密消息加密版本 1應(yīng)展開(kāi)為 Encrypted Memberlist 子樹(shù)并顯示解密內(nèi)容。一個(gè)文檔明確記錄的已知問(wèn)題Wireshark 首次啟動(dòng)時(shí) NetworkDB 插件可能加載失敗并報(bào)錯(cuò)moby-networkdb.lua:4: bad argument #1 to new (Field_new: a field with this name must exist)這是 Wireshark 側(cè)的已知缺陷。解決辦法是在 Wireshark 完成初始化后重載 Lua 插件菜單 Analyze - Reload Lua Plugins或快捷鍵 Ctrl-Shift-LWindows/Linux、??LmacOS。重載后協(xié)議應(yīng)正常注冊(cè)。限制README 的 Limitations 一節(jié)明確列出了兩點(diǎn)排查前先對(duì)照僅支持 memberlist 加密版本 1AES-GCM 128無(wú) padding不支持版本 0AES-GCM 128 使用 PKCS#7 padding帶 label 的消息目前無(wú)法解密memberlist.lua 中對(duì)加密版本不為 1 的報(bào)文直接跳過(guò)解密。如果你的抓包中出現(xiàn)未解密或解析失敗的消息先確認(rèn)是否落在以上兩種情況內(nèi)再回到密鑰文件內(nèi)容是否包含該消息對(duì)應(yīng)的密鑰與端口范圍memberlist.ports是否覆蓋實(shí)際通信端口檢查?!久赓M(fèi)下載鏈接】mobyThe Moby Project - a collaborative project for the container ecosystem to assemble container-based systems項(xiàng)目地址: https://gitcode.com/GitHub_Trending/mo/moby創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考