WiresharkでUSBパケットをキャプチャするときの注意事項

WiresharkでUSBパケットをキャプチャしようとしてちょっとハマったのでメモ

概要

WiresharkでUSBパケットをキャプチャするための準備(Linux版)
Windows版はちょっと異なると思うけど試してないので、ググってね😅。

Wiresharkのインストール&実行

ふつーにapt installするだけ。
Windows版と異なり、USBパケットキャプチャのために別途USBキャプチャプログラムをインストールする必要はない。
ついでにsudoしなくても実行できるように自分にwiresharkグループを追加しておく。

sudo apt install wireshark
sudo gpasswd -a `whoami` wireshark 

ここで一旦ログアウト&再ログイン or 再起動。

このままだとUSBパケットキャプチャのためのプログラム(usbmon)が動いてないので、動かす必要がある。
起動の度にターミナルから以下のコマンドを実行。

sudo modprobe usbmon

Wiresharkの実行は、ターミナルからwiresharkを実行するか、メニューの「インターネット」→「Wireshark」を選択します。
(自分にwireshark`グループを追加してあるので、メニューからでも実行できます)

起動の度にusbmonを起動するのは面倒な場合は、以下の手順で自動化できます。

  1. /etc/udev/rules.d/99-usbmon.rulesを以下の内容で作成
    SUBSYSTEM=="usbmon", GROUP="wireshark", MODE="640"
    
  2. /etc/modules に以下を追加
    usbmon
    
  3. リブート

Wiresharkの使い方

あちこちのホームページに詳しく解説されているので、ぐぐってちょ(←なんて他力本願…😅)。
RaspberryPi4の場合、USBのインタフェースはusbmon1とusbmon2があるが、どっちをキャプチャするかは、接続した機器がUSB2.0かUSB3.0による。
たぶん、usbmon1がUSB2.0(外側/内側)、usbmon2がUSB3.0(内側のみ)だと思う。
lsusbで表示される対象機器のバス番号(Bus XXXの部分の数字)がusbmonYのYにあたるとだと推測。

Wiresharkでパケット解析

USBのパケットの表示フィルタの書き方がネット上でもなかなか見つからなかったので、簡単なものだけメモ。

特定のUSB機器のパケットだけ表示

実際にはエンドポイントまで指定しているので、複数のエンドポイントを同時に表示したければ、OR(||)で条件つなげてください。 (1.5.*みたいな書き方が出来るのかは不明 )

この例の1.5.1
左の1lsusbで表示される対象機器のバス番号(Bus XXXの部分の数字)、
中央の5lsusbで表示される対象機器のデバイス番号(Device YYYの部分の数字)(挿抜の度に変わる)、
右の1lsusb -D /dev/bus/usb/XXX/YYY(XXX、YYYは上記のバス番号、デバイス番号。0は省略不可) で表示される情報の
bEndpointAddressで確認できるけど、これは機器内部で固定されてるはず。
と、難しく調べんでも、一度全部キャプチャしたものを表示して欲しいパケットを探してみてそこのアドレスを見れば分かる。

USBホストの吐合は"host"になる。

特定の機器の送信パケットだけ表示

表示フィルタに以下を入力してリターン(以下の1.5.1の部分は対象の機器のものに変更)

usb.src == "1.5.1"

特定の機器の受信パケットだけ表示

表示フィルタに以下を入力してリターン(以下の1.5.1の部分は対象の機器のものに変更)

usb.dst == "1.5.1"

特定の機器の送受信パケットだけ表示

表示フィルタに以下を入力してリターン(以下の1.5.1の部分は対象の機器のものに変更)

usb.src == "1.5.1" || usb.dst == "1.5.1"