Google は、黒人コミュニティのための人種的公平の促進に取り組んでいます。詳細をご覧ください。

Pyspinel によるパケット スニッフィング

GitHub でソースを見る

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

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

スニファー環境の設定

始める前に、次の手順を完了します。

スニファーの作成

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

北欧 nRF52840

スニッファーとして使用する北欧の 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 ネットワークの次のプロパティを取得します。これらは、Wireshark の構成と Pyspinel スニファーの実行に必要になります。

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

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

  1. OpenThread CLI の使用:

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

  2. wpanctl を NCP で使用:

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

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

チャネル

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

  1. OpenThread CLI の使用:

    channel
    15
    

  2. wpanctl を NCP で使用:

    wpanctl getprop NCP:Channel
    NCP:Channel = 15
    

  3. OTBR ウェブ GUI で [Status] を選択します。このチャネルは、NCP:Channel として wpanctl と同様にリストされます。

ネットワーク キー

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

  1. OpenThread CLI の使用:

    networkkey
    33334444333344443333444433334444
    

  2. wpanctl を NCP で使用:

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

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

スニファー オプション

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

スニファーの実行

NCP のデバイスパスと、スニッフィングしようとしているスレッド ネットワークのチャネルを使用してください。

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

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

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

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 Semiconductor - Wireshark による nRF52840 に基づくスレッド スニファーをご覧ください。