Pyspinel でのパケット スニッフィング

GitHub でソースを見る

このガイドでは、Wireshark を構成して Pyspinel を実行し、Thread ネットワークからパケットをスニフィングする方法について説明します。

Wireshark extcap プラグインを使用してパケット スニッフィングを行うには、extcap を使用したパケット スニッフィングをご覧ください。

スニファ環境を設定する

始める前に、次の手順を行います。

スニファを作成する

ot-rcp バイナリ出力を使用して、スニファとして機能する NCP デバイスをビルドしてフラッシュします。

Nordic nRF52840

スニファとして使用するために Nordic nRF52840 の例を設定するには、openthread/ot-nrf528xx のクローンを作成してビルド環境を設定します。

git clone https://github.com/openthread/ot-nrf528xx --recursive
./script/bootstrap

ボーレートを 460800 に設定します。src/nrf52840/transport-config.h#define UART_BAUDRATE NRF_UARTE_BAUDRATE_115200 という行を見つけて、#define UART_BAUDRATE NRF_UARTE_BAUDRATE_460800 に置き換えます。

バイナリをビルドします。

./script/build nrf52840 UART_trans

ot-rcp バイナリ出力を 16 進数に変換します。

arm-none-eabi-objcopy -O ihex build/bin/ot-rcp ot-rcp.hex

nRF52840 をフラッシュするで説明されているように、ot-rcp.hex ファイルを nRF52840 ボードにフラッシュします。

デバッグポートの使用時にデータの破損やデータのドロップが発生しないように、nRF52840 で大容量ストレージ デバイス(MSD)を無効にします。

expect <<EOF
spawn JLinkExe
expect "J-Link>"
send "msddisable\n"
expect "Probe configured successfully."
exit
EOF
spawn JLinkExe
SEGGER J-Link Commander V6.42b (Compiled Feb  5 2019 17:35:31)
DLL version V6.42b, compiled Feb  5 2019 17:35:20
 
Connecting to J-Link via USB...O.K.
Firmware: J-Link OB-SAM3U128-V2-NordicSemi compiled Jan  7 2019 14:07:15
Hardware version: V1.00
S/N: 683411111
VTref=3.300V
 
Type "connect" to establish a target connection, '?' for help
J-Link>msddisable
Probe configured successfully.

Thread ネットワークのプロパティ

続行する前に、スニファリングする Thread ネットワークの次のプロパティを取得します。Wireshark の構成と Pyspinel スニファの実行に必要です。

メッシュ ローカル プレフィックス

ターゲット Thread ネットワーク内のデバイスからメッシュ ローカル プレフィックスを取得するには:

  1. OpenThread CLI を使用する場合:

    dataset active
    Mesh Local Prefix: fd33:3333:3344:0/64
    

  2. NCP で wpanctl を使用する:

    wpanctl getprop IPv6:MeshLocalPrefix
    IPv6:MeshLocalPrefix = "fd33:3333:3344:0::/64"
    

  3. OTBR ウェブ GUI で [ステータス] を選択します。メッシュ ローカル プレフィックスは、wpanctl と同様に IPv6:MeshLocalPrefix として表示されます。

チャンネル

ターゲット Thread ネットワーク内のデバイスからチャネルを取得するには:

  1. OpenThread CLI を使用する場合:

    channel
    15
    

  2. NCP で wpanctl を使用する:

    wpanctl getprop NCP:Channel
    NCP:Channel = 15
    

  3. OTBR ウェブ GUI で [ステータス] を選択します。チャンネルは、wpanctl と同様に NCP:Channel として表示されます。

ネットワーク キー

Thread ネットワーク キーは、Wireshark がキャプチャ後にパケットを復号するために使用します。ターゲットの Thread ネットワーク内のデバイスからネットワーク キーを取得するには:

  1. OpenThread CLI を使用する場合:

    networkkey
    33334444333344443333444433334444
    

  2. NCP で wpanctl を使用する:

    wpanctl getprop Network:Key
    Network:Key = [33334444333344443333444433334444]
    

OTBR ウェブ GUI では Thread ネットワーク キーを使用できません。

スニファのオプション

オプション
-u or --uart
デフォルト値
なし - ソケット接続ではなくシリアル接続のデバイスを使用している場合に指定する必要があります。
説明
-u または --uart フラグ、その後にデバイスパス(/dev/ttyUSB0 など)
-c or --channel
デフォルト値
11
説明
-c または --channel フラグ、続いて Thread ネットワークで構成されたチャンネル(パケットをスニファするチャンネル)。
--no-reset
デフォルト値
このフラグはデフォルトの動作をオーバーライドします。
説明
--no-reset フラグは、NCP デバイスがネイティブ USB 接続でホストに接続されている場合に必要です。
--crc
デフォルト値
このフラグはデフォルトの動作をオーバーライドします。
説明
--crc フラグは、TI や Nordic Semiconductor の Thread ボードなどのプラットフォームに必要です。このフラグは、Wireshark で「Bad FCS」(フレームチェック シーケンス)の警告が表示されないように、CRC を再計算します。
-b or --baudrate
デフォルト値
115200
説明
デフォルトのボーレートをオーバーライドするには、-b フラグまたは --baudrate フラグを使用します。この値は、NCP ビルドで使用されているボーレートと同じに設定します(460800 をおすすめします)。
--rssi
デフォルト値
このフラグはデフォルトの動作をオーバーライドします。
説明
--rssi フラグは、RSSI が pcap 出力に確実に含まれるようにするために使用されます。Wireshark で TI CC24xx FCS 形式オプションが有効になっている場合は、このフラグを使用する必要があります。
--tap
デフォルト値
このフラグはデフォルトの動作をオーバーライドします。
説明
--tap フラグは、フレーム形式に DLT_IEEE802_15_4_TAP(283) を指定し、メタデータ(FCS、RSSI、LQI、チャンネルなど)を含む TLV を含む疑似ヘッダーを指定します。指定しない場合、DLT_IEEE802_15_4_WITHFCS(195) がデフォルトで使用され、TI CC24xx FCS 形式のように、PHY フレームの直後に RSSI と LQI が追加されます。Wireshark で ITU-T CRC-16 オプションが有効になっている場合は、このフラグを使用する必要があります。Wireshark でそのオプションが有効になっていない場合は、このフラグを使用しないでください。

スニファを実行する

NCP の特定のデバイスパスと、スニファリングしようとしている Thread ネットワークのチャネルを使用していることを確認してください。

このガイドに沿って作業する場合は、nRF52840 のフラッシュで説明されているように、nRF52840 DK をデバッグポートでホストマシンに接続する必要があります。Pyspinel スニファを実行するには、-b フラグを使用してボーレートを指定します(デフォルトから変更した場合)。--no-reset フラグは省略します。

RSSI を表示するように Wireshark を構成する場合は、スニファツールを実行するときに --rssi フラグも含める必要があります。たとえば、/dev/ttyACM0 にマウントされたデバイスを使用してチャネル 15 をスニフし、Wireshark の出力に RSSI を含めるには、次のコマンドを使用します。

cd path-to-pyspinel
python sniffer.py -c 15 -u /dev/ttyACM0 --crc --rssi -b 460800 | wireshark -k -i -

Wireshark で、この構成のパケットと関連プロトコルを確認できるようになりました。

Wireshark キャプチャ

Pyspinel スニファの実行の詳細については、Spinel スニファのリファレンスをご覧ください。

ネイティブ USB 接続

nRF52840 DK USB ポートを使用するには、OpenThread ot-rcp バイナリを USB_trans でビルドする必要があります。

./script/build nrf52840 USB_trans
nRF52840 DK をフラッシュし、USB ポートでホストマシンに接続してから、--no-reset フラグを使用して、スニファの実行時に -b フラグを省略します。

python sniffer.py -c 15 -u /dev/ttyACM0 --crc --no-reset --rssi | wireshark -k -i -

リソース

その他の Nordic ツールについては、Nordic Semiconductor - Wireshark を使用した nRF52840 ベースの Thread Sniffer をご覧ください。