我正在尝试通过 Wireshark(实际上是 TShark)捕获多播流量,但是交换机已启用 IGMP 监听,并且只会在具有活动 IGMP 订阅的端口上发送多播流量。
我目前通过使用单独的应用程序保持我想要记录的组打开来解决这个问题,但是我试图建立一个系统来动态地启动/停止记录数据,这种额外的复杂性很痛苦。
有没有办法强制 Wireshark 发送它正在记录的多播组的 IGMP 订阅?
答案1
您可以使用“ip maddr add”订阅其他组。这应该会导致内核响应 IGMP 查询并接收它们的流量。
答案2
假设“它正在记录的多播组”的意思是你已经指定了一个捕获过滤器,要求在“主机”关键字中输入特定的多播目标地址;这是 Wireshark 将其数据包捕获限制在特定多播组的唯一方法。
Wireshark 没有基于捕获过滤器发送 IGMP 订阅的机制;它假设您已经以某种方式安排将所有相关数据包发送到其捕获的端口,例如通过端口镜像/SPAN/无论你的交换机供应商如何称呼它在该端口上,以便交换机发送全部数据包发送到该端口。如果您无法设置端口镜像,或者如果这会将过多的数据包发送到您正在捕获的端口,则您必须将该端口订阅到适当的多播组(您似乎已经这样做了)。
答案3
创建自定义 lua 监听器并从 wireshark 调用它。
这里是一个有据可查的例子:
-- This program will register a menu that will open a window with a count of occurrences
-- of every address in the capture
local function menuable_tap()
-- Declare the window we will use
local tw = TextWindow.new("Address Counter")
-- This will contain a hash of counters of appearances of a certain address
local ips = {}
-- this is our tap
local tap = Listener.new();
local function remove()
-- this way we remove the listener that otherwise will remain running indefinitely
tap:remove();
end
-- we tell the window to call the remove() function when closed
tw:set_atclose(remove)
-- this function will be called once for each packet
function tap.packet(pinfo,tvb)
local src = ips[tostring(pinfo.src)] or 0
local dst = ips[tostring(pinfo.dst)] or 0
ips[tostring(pinfo.src)] = src + 1
ips[tostring(pinfo.dst)] = dst + 1
end
-- this function will be called once every few seconds to update our window
function tap.draw(t)
tw:clear()
for ip,num in pairs(ips) do
tw:append(ip .. "\t" .. num .. "\n");
end
end
-- this function will be called whenever a reset is needed
-- e.g. when reloading the capture file
function tap.reset()
tw:clear()
ips = {}
end
-- Ensure that all existing packets are processed.
retap_packets()
end
-- using this function we register our function
-- to be called when the user selects the Tools->Test->Packets menu
register_menu("Test/Packets", menuable_tap, MENU_TOOLS_UNSORTED)