web-dev-qa-db-ja.com

スイッチでIGMPスヌーピングを有効にしてWiresharkでマルチキャストデータをキャプチャする

Wireshark(実際にはTShark)経由でマルチキャストトラフィックをキャプチャしようとしていますが、スイッチでIGMPスヌーピングが有効になっており、アクティブなIGMPサブスクリプションがあるポートでのみマルチキャストトラフィックを送信します。

現在、別のアプリケーションで記録したいグループを開いたままにしてこれを回避していますが、データの記録を動的に開始/停止するシステムを設定しようとしており、この余分な複雑さは苦痛です。

記録しているマルチキャストグループのIGMPサブスクリプションをWiresharkに強制的に送信させる方法はありますか?

7
Chuu

「ip maddr add」を使用して、追加のグループをサブスクライブできます。これにより、カーネルはIGMPクエリに応答し、それらのトラフィックを受信します。

1
V13

おそらく「記録しているマルチキャストグループ」とは、「Host」キーワードで特定のマルチキャスト宛先アドレスを要求するキャプチャフィルターを指定したことを意味します。これが、Wiresharkがパケットキャプチャを特定のマルチキャストグループに制限できる唯一の方法です。

Wiresharkには、キャプチャフィルターに基づいてIGMPサブスクリプションを送信するメカニズムはありません。たとえば、そのポートで ポートミラーリング/ SPAN /スイッチベンダーが呼び出すもの によって、関連するすべてのパケットをキャプチャするポートに送信するように何らかの方法で調整したと想定しているため、スイッチそのポートにallパケットを送信します。ポートミラーリングを設定できない場合、またはキャプチャするポートに送信するパケットが多すぎる場合は、そのポートを適切なマルチキャストグループにサブスクライブする必要があります(すでに行っているようです)。 。

1
user137177

カスタム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)
1
Nehal Dattani

Ostinato を使用して、ビルド、作成、送信 packets を行うことができます。

0
joke