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