Phát hiện gói tin bằng Pyspinel

Xem mã nguồn trên GitHub

Hướng dẫn này trình bày cách định cấu hình Wireshark và chạy Pyspinel để đánh hơi các gói từ mạng Thread.

Để sử dụng trình bổ trợ extcap của Wireshark cho tính năng phát hiện gói, hãy tham khảo bài viết Phát hiện gói bằng extcap.

Thiết lập môi trường trình quan sát

Trước khi bắt đầu, hãy hoàn tất các bước sau:

Tạo trình quan sát

Tạo và cài đặt ROM cho một thiết bị NCP để làm trình quan sát, sử dụng đầu ra tệp nhị phân ot-rcp.

Nordic nRF52840

Để thiết lập ví dụ Nordic nRF52840 để sử dụng làm trình quan sát, hãy sao chép openthread/ot-nrf528xx và thiết lập môi trường xây dựng:

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

Đặt tốc độ truyền dữ liệu là 460800. Tìm dòng #define UART_BAUDRATE NRF_UARTE_BAUDRATE_115200 trong src/nrf52840/transport-config.h rồi thay thế bằng #define UART_BAUDRATE NRF_UARTE_BAUDRATE_460800.

Tạo tệp nhị phân:

./script/build nrf52840 UART_trans

Chuyển đổi đầu ra nhị phân ot-rcp sang thập lục phân:

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

Truyền tệp ot-rcp.hex vào bảng mạch nRF52840 như được mô tả chi tiết trong phần Truyền tệp nRF52840.

Tắt Thiết bị lưu trữ khối lượng lớn (MSD) trên nRF52840 để tránh các sự cố về việc hỏng hoặc mất dữ liệu khi sử dụng cổng gỡ lỗi:

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.

Thuộc tính mạng Thread

Trước khi tiếp tục, hãy lấy các thuộc tính sau cho mạng Thread mà bạn muốn sniff. Bạn sẽ cần các tệp này để định cấu hình Wireshark và chạy trình quét gói Pyspinel.

Tiền tố cục bộ của mạng lưới

Cách lấy Tiền tố cục bộ của mạng lưới từ một thiết bị trong mạng Thread mục tiêu:

  1. Sử dụng CLI OpenThread:

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

  2. Sử dụng wpanctl với NCP:

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

  3. Sử dụng giao diện người dùng đồ hoạ trên web của OTBR, hãy chọn Trạng thái. Tiền tố cục bộ của mạng lưới được liệt kê là IPv6:MeshLocalPrefix tương tự như wpanctl.

Kênh

Cách lấy Kênh từ một thiết bị trong mạng Thread mục tiêu:

  1. Sử dụng CLI OpenThread:

    channel
    15
    

  2. Sử dụng wpanctl với NCP:

    wpanctl getprop NCP:Channel
    NCP:Channel = 15
    

  3. Sử dụng giao diện người dùng đồ hoạ trên web của OTBR, hãy chọn Trạng thái. Kênh được liệt kê là NCP:Channel tương tự như wpanctl.

Khoá mạng

Khoá mạng luồng được Wireshark sử dụng để giải mã các gói sau khi thu thập. Cách lấy Khoá mạng từ một thiết bị trong mạng Thread mục tiêu:

  1. Sử dụng CLI OpenThread:

    networkkey
    33334444333344443333444433334444
    

  2. Sử dụng wpanctl với NCP:

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

Khoá mạng Thread không có trong giao diện người dùng web OTBR.

Tuỳ chọn trình quan sát

Tùy chọn
-u or --uart
Giá trị mặc định
Không có – phải được cung cấp nếu bạn đang sử dụng thiết bị có kết nối nối tiếp chứ không phải kết nối ổ cắm.
Nội dung mô tả
Cờ -u hoặc --uart, theo sau là một đường dẫn thiết bị như /dev/ttyUSB0.
-c or --channel
Giá trị mặc định
11
Nội dung mô tả
Cờ -c hoặc --channel theo sau là kênh được định cấu hình trên Mạng luồng để đánh hơi gói.
--no-reset
Giá trị mặc định
Cờ này ghi đè hành vi mặc định.
Nội dung mô tả
Bạn cần có cờ --no-reset nếu thiết bị NCP của bạn được kết nối với máy chủ bằng kết nối USB gốc.
--crc
Giá trị mặc định
Cờ này ghi đè hành vi mặc định.
Nội dung mô tả
Cờ --crc là cần thiết cho các nền tảng như TI và bảng điều khiển Thread của Nordic Semiconductor. Cờ này tính toán lại CRC để tránh cảnh báo "FCS không hợp lệ" (trình tự kiểm tra khung) trong Wireshark.
-b or --baudrate
Giá trị mặc định
115200
Nội dung mô tả
Cờ -b hoặc --baudrate được dùng để ghi đè tốc độ truyền dữ liệu mặc định. Đặt giá trị này thành cùng một tốc độ truyền ký tự được sử dụng với bản dựng NCP (bạn nên dùng 460800).
--rssi
Giá trị mặc định
Cờ này ghi đè hành vi mặc định.
Nội dung mô tả
Cờ --rssi được dùng để đảm bảo RSSI được đưa vào đầu ra pcap. Bạn phải sử dụng cờ này nếu tuỳ chọn định dạng TI CC24xx FCS được bật trong Wireshark.
--tap
Giá trị mặc định
Cờ này ghi đè hành vi mặc định.
Nội dung mô tả
Cờ --tap chỉ định DLT_IEEE802_15_4_TAP(283) cho định dạng khung, với tiêu đề giả chứa các TLV có siêu dữ liệu (chẳng hạn như FCS, RSSI, LQI, Kênh). Nếu không chỉ định, DLT_IEEE802_15_4_WITHFCS(195) sẽ được sử dụng theo mặc định với RSSI và LQI bổ sung theo khung PHY trực tiếp, như trong định dạng FCS TI CC24xx. Bạn phải sử dụng cờ này nếu tuỳ chọn ITU-T CRC-16 được bật trong Wireshark. Nếu bạn không bật tuỳ chọn đó trong Wireshark, đừng sử dụng cờ này.

Chạy trình quan sát

Hãy nhớ sử dụng đường dẫn thiết bị cụ thể cho NCP và kênh cho mạng Thread mà bạn đang cố gắng đánh hơi.

Nếu làm theo hướng dẫn này, bạn phải đính kèm nRF52840 DK vào máy chủ bằng cổng gỡ lỗi, như mô tả trong phần Đổ ROM nRF52840. Để chạy trình quét Pyspinel, hãy sử dụng cờ -b để chỉ định tốc độ truyền dữ liệu (nếu tốc độ này đã thay đổi so với tốc độ mặc định) và bỏ qua cờ --no-reset.

Nếu Định cấu hình Wireshark để hiển thị RSSI, bạn cũng phải thêm cờ --rssi khi chạy công cụ sniffer. Ví dụ: để đánh hơi trên Kênh 15 bằng cách sử dụng một thiết bị được gắn ở /dev/ttyACM0 với RSSI có trong đầu ra Wireshark:

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

Giờ đây, bạn có thể xem các gói và giao thức liên quan cho cấu hình này trong Wireshark:

Tính năng ghi lại của Wireshark

Tham khảo tài liệu tham khảo về trình quan sát Spinel để biết thêm thông tin về cách chạy trình quan sát Pyspinel.

Kết nối USB gốc

Để sử dụng cổng USB nRF52840 DK, bạn cần tạo tệp nhị phân ot-rcp OpenThread bằng USB_trans:

./script/build nrf52840 USB_trans
Đổ ROM nRF52840 DK, kết nối với máy chủ bằng cổng USB, sau đó sử dụng cờ --no-reset nhưng bỏ qua cờ -b khi chạy trình quan sát:

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

Tài nguyên

Để biết thêm các công cụ Nordic, hãy tham khảo Nordic Semiconductor — Trình quan sát luồng dựa trên nRF52840 bằng Wireshark.