לכידת מנות באמצעות פיספינל

הצגת המקור ב-GitHub

במדריך הזה נסביר איך להגדיר את Wireshark ולהריץ את Pyspinel כדי לרחרח חבילות מרשת Thread.

כדי להשתמש בפלאגין extcap של Wireshark לצורך ניטור חבילות, אפשר לעיין במאמר ניטור חבילות באמצעות extcap.

הגדרת סביבת הניטור

לפני שמתחילים, צריך לבצע את השלבים הבאים:

פיתוח הסניפר

פיתוח ומעבר (flash) של מכשיר NCP שישמש כמנתח באמצעות הפלט הבינארי ot-rcp.

Nordic nRF52840

כדי להגדיר את הדוגמה של Nordic nRF52840 לשימוש כמנתח תעבורת נתונים, מעתיקים את openthread/ot-nrf528xx ומגדירים את סביבת ה-build:

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

מגדירים את קצב הנתונים (baud rate) כ-460800. מחפשים את השורה #define UART_BAUDRATE NRF_UARTE_BAUDRATE_115200 ב-src/nrf52840/transport-config.h ומחליפים אותה ב-#define UART_BAUDRATE NRF_UARTE_BAUDRATE_460800.

יצירת קובץ ה-binary:

./script/build nrf52840 UART_trans

ממירים את הפלט הבינארי ot-rcp להקסדצימלי:

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

מעבירים את הקובץ ot-rcp.hex ללוח nRF52840 לפי ההוראות שמפורטות בקטע אחזור (Flash) של nRF52840.

כדי למנוע בעיות של פגיעה בנתונים או ירידה בנתונים במהלך השימוש ביציאת ניפוי הבאגים, משביתים את Mass Storage Device‏ (MSD) ב-nRF52840:

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.

Mesh Local Prefix

כדי לקבל את הקידומת המקומית של רשת Mesh ממכשיר ברשת Thread היעד:

  1. באמצעות ה-CLI של OpenThread:

    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 באינטרנט. התחילית המקומית של Mesh מופיעה בתור IPv6:MeshLocalPrefix, בדומה ל-wpanctl.

ערוץ

כדי לקבל את הערוץ ממכשיר ברשת היעד בפרוטוקול Thread:

  1. באמצעות ה-CLI של OpenThread:

    channel
    15
    

  2. שימוש ב-wpanctl עם NCP:

    wpanctl getprop NCP:Channel
    NCP:Channel = 15
    

  3. בוחרים באפשרות סטטוס בממשק המשתמש הגרפי של OTBR באינטרנט. הערוץ מופיע בתור NCP:Channel, בדומה לערוץ wpanctl.

מפתח רשת

Wireshark משתמש במפתח הרשת של Thread כדי לפענח חבילות אחרי תיעוד. כדי לקבל את מפתח הרשת ממכשיר ברשת Thread היעד:

  1. באמצעות ה-CLI של OpenThread:

    networkkey
    33334444333344443333444433334444
    

  2. שימוש ב-wpanctl עם NCP:

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

מפתח הרשת של Thread לא זמין בממשק המשתמש הגרפי באינטרנט של OTBR.

אפשרויות לניפוי נתונים

אפשרויות
-u or --uart
ערך ברירת מחדל
None – צריך לציין את הערך הזה אם אתם משתמשים במכשיר עם חיבור טורי ולא עם חיבור שקע.
תיאור
הדגל -u או --uart ואחריו נתיב מכשיר, כמו /dev/ttyUSB0.
-c or --channel
ערך ברירת מחדל
11
תיאור
הדגל -c או --channel ואחריו הערוץ שהוגדר ברשת ה-Thread, שבו יתבצע ניטור החבילות.
--no-reset
ערך ברירת מחדל
הדגל הזה מבטל את התנהגות ברירת המחדל.
תיאור
הדגל --no-reset נדרש אם מכשיר ה-NCP מחובר למארח באמצעות חיבור USB מקורי.
--crc
ערך ברירת מחדל
הדגל הזה מבטל את התנהגות ברירת המחדל.
תיאור
הדגל --crc נדרש בפלטפורמות כמו TI ו-Nordic Semiconductor Thread boards. הדגל מחשב מחדש את ה-CRC כדי למנוע אזהרה על 'FCS שגוי' (רצף בדיקת מסגרת) ב-Wireshark.
-b or --baudrate
ערך ברירת מחדל
115200
תיאור
הדגל -b או --baudrate משמש כדי לשנות את מהירות הנתונים שמוגדרת כברירת מחדל. מגדירים את הערך הזה לאותה מהירות העברת נתונים (baud) שמשמשת את גרסת ה-build של NCP (מומלץ להשתמש בערך 460800).
--rssi
ערך ברירת מחדל
הדגל הזה מבטל את התנהגות ברירת המחדל.
תיאור
הדגל --rssi משמש כדי לוודא שה-RSSI כלול בפלט ה-pcap. צריך להשתמש בדגל הזה אם האפשרות TI CC24xx FCS format מופעלת ב-Wireshark.
--tap
ערך ברירת מחדל
הדגל הזה מבטל את התנהגות ברירת המחדל.
תיאור
הדגל --tap מציין את הערך DLT_IEEE802_15_4_TAP(283) לפורמט המסגרת, עם כותרת פסאודו שמכילה ערכים מסוג TLV עם מטא-נתונים (כמו FCS, ‏ RSSI, ‏ LQI, ‏ Channel). אם לא מציינים את הערך, המערכת תשתמש ב-DLT_IEEE802_15_4_WITHFCS(195) כברירת מחדל, עם ערכי ה-RSSI וה-LQI הנוספים שמופיעים ישירות אחרי המסגרת של PHY, כמו בפורמט ה-FCS של TI CC24xx. צריך להשתמש בדגל הזה אם האפשרות ITU-T CRC-16 מופעלת ב-Wireshark. אם האפשרות הזו לא מופעלת ב-Wireshark, אל תשתמשו בדגל הזה.

הפעלת הסניפר

חשוב להשתמש בנתיב המכשיר הספציפי של ה-NCP ובערוץ של רשת Thread שאתם מנסים לרחרח.

אם פועלים לפי המדריך הזה, צריך לחבר את nRF52840 DK למכונה המארחת דרך יציאת ניפוי הבאגים, כפי שמתואר בקטע אחזור נתונים (Flash) של nRF52840. כדי להריץ את הסניפר של Pyspinel, משתמשים בדגל -b כדי לציין את קצב ה-baud (אם הוא השתנה מברירת המחדל) ומשמטים את הדגל --no-reset.

אם מגדירים את Wireshark להצגת RSSI, צריך לכלול גם את הדגל --rssi כשמריצים את כלי הניטור. לדוגמה, כדי לרחרח בערוץ 15 באמצעות מכשיר שמותקן ב-/dev/ttyACM0 עם RSSI שכלול בפלט של Wireshark:

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

עכשיו אמורה להיות לכם אפשרות לראות את החבילות והפרוטוקולים הקשורים להגדרה הזו ב-Wireshark:

Wireshark Capture

מידע נוסף על הפעלת הסניפר של Pyspinel זמין במאמר העזר בנושא סניפר Spinel.

חיבור USB מקורי

כדי להשתמש ביציאת ה-USB של nRF52840 DK, צריך ליצור את קובץ ה-binary ot-rcp של OpenThread באמצעות USB_trans:

./script/build nrf52840 USB_trans
מחליפים את קובץ הקושחה של nRF52840 DK, מחברים אותו למחשב המארח דרך יציאת ה-USB, ואז משתמשים בדגל --no-reset אבל משמיטים את הדגל -b כשמריצים את ה-sniffer:

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

משאבים

לקבלת מידע נוסף על כלים של Nordic, אפשר לעיין במאמר Nordic Semiconductor — Thread Sniffer based on nRF52840 with Wireshark.