1. מבוא

מה זה Thread?
Thread הוא פרוטוקול רשת אלחוטי מבוסס-IP שפועל בצריכת חשמל נמוכה ומאפשר תקשורת מאובטחת בין מכשירים ובין מכשירים לענן. רשתות Thread יכולות להתאים את עצמן לשינויים בטופולוגיה כדי להימנע מנקודות כשל יחידות.
מה זה OpenThread?
OpenThread שפורסם על ידי Google הוא הטמעה בקוד פתוח של Thread®.
מה זה OpenThread Border Router?
OpenThread Border Router (OTBR) שפורסם על ידי Google הוא הטמעה בקוד פתוח של Thread Border Router.
NAT64
NAT64 הוא מנגנון שמאפשר למארחים ברשתות IPv6 בלבד לגשת למשאבים ברשתות IPv4. שער NAT64 הוא מתרגם בין פרוטוקולי IPv4 ופרוטוקולי IPv6.
מתרגם NAT64, כחלק מ-OpenThread Border Router, תומך בתרגום של פרוטוקולים TCP, UDP ו-ICMP (ICMPv6).
מה תפַתחו
ב-codelab הזה תגדירו נתב גבולות OpenThread (OTBR) ומכשיר Thread, ואז תפעילו ותאמתו את התקשורת בין מכשירי Thread ומארחי IPv4 באינטרנט באמצעות נתב גבולות OpenThread.
מה תלמדו
- איך לבנות נתב גבול OpenThread עם תכונות NAT64.
- איך מתקשרים עם מארחי IPv4 ממכשירי קצה של Thread.
הדרישות
- תחנת עבודה עם Linux, לבנייה ולהפעלה של Thread RCP, ממשק שורת הפקודה של OpenThread ובדיקת קישוריות IPv4.
- Raspberry Pi לנתב הגבולות עם פרוטוקול Thread. צריך להיות אפשר להגיע לתחנת העבודה שלכם ב-Linux דרך IPv4 מהמכשיר הזה.
- 2 מתאמי USB של Nordic Semiconductor nRF52840 (אחד ל-RCP ואחד למכשיר הקצה של Thread).
הטופולוגיה של הרשת ב-Codelab הזה:

2. הגדרה של נתב גבולות OpenThread
הדרך המהירה ביותר להגדיר OTBR היא לפעול לפי מדריך ההגדרה של OTBR.
אחרי שמשלימים את ההגדרה של OTBR, משתמשים ב-ot-ctl כדי לוודא ששירות NAT64 מופעל בנתב הגבול:
> nat64 state PrefixManager: Active Translator: Active Done
נתב גבול של Thread מפרסם את הקידומת של NAT64 בנתוני רשת Thread:
> netdata show Prefixes: fd16:a3d:e170:1::/64 paros low f800 Routes: ::/0 s med f800 fd16:a3d:e170:2:0:0::/96 sn low f800 Services: 44970 5d fd4db3e59738319339c4ee02ca9e2b1dd120 s f800 0 Contexts: fd16:a3d:e170:1::/64 1 sc Commissioning: 60365 - - - Done
קידומת NAT64 מופיעה כרשומה של מסלול עם הדגל n. בדוגמה שלמעלה, fd16:a3d:e170:2:0:0::/96 הוא הקידומת של NAT64.
קידומת NAT64 תשמש מכשירי Thread לתקשורת עם מארח IPv4.
3. הגדרת מכשיר קצה בפרוטוקול Thread
פועלים לפי השלב Set up the FTDs (הגדרת מכשירי FTD) במדריך Build a Thread network with nRF52840 boards and OpenThread codelab (בניית רשת Thread באמצעות לוחות nRF52840 ומעבדת קוד של OpenThread) כדי לבנות ולהפעיל מכשיר קצה של nRF52840 CLI, עם שינוי בשלב הבא:
בקטע Build and flash (יצירה והעברה לזיכרון), צריך להוסיף את -DOT_DNS_CLIENT=ON, -DOT_SRP_CLIENT=ON ו--DOT_ECDSA=ON לשורת הפקודה כשמפעילים את script/build:
$ cd ~/src/ot-nrf528xx $ rm -rf build $ script/build nrf52840 USB_trans -DOT_DNS_CLIENT=ON -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON
ממשיכים עם Build a Thread network with nRF52840 boards and OpenThread codelab כמו שכתוב. אחרי שמבצעים פלאשינג של תמונת ה-CLI במכשיר הקצה, פועלים לפי השלבים שבקטע הצטרפות לצומת השני ברשת Thread כדי להוסיף את מכשיר Thread לרשת Thread.
מחכים כמה שניות אחרי שמגדירים את מכשיר הקצה של Thread ומוודאים שההצטרפות לרשת Thread הצליחה. כמו שצוין למעלה, אפשר לראות את הקידומת NAT64 שפורסמה בנתוני רשת Thread.
> netdata show Prefixes: fd16:a3d:e170:1::/64 paros low f800 Routes: ::/0 s med f800 fd16:a3d:e170:2:0:0::/96 sn low f800 Services: 44970 5d fd4db3e59738319339c4ee02ca9e2b1dd120 s f800 0 Contexts: fd16:a3d:e170:1::/64 1 sc Commissioning: 60365 - - - Done
מוודאים שנתוני הרשת זהים לנתונים שמופיעים בדוח השקיפות.
4. תקשורת עם מארחי IPv4 ממכשיר קצה של Thread
עכשיו אפשר לתקשר עם מארחים ברשת IPv4 ממכשיר הקצה שהגדרנו.
שליחת בקשות הד ICMP למארחי IPv4
מ-CLI של מכשיר קצה של Thread:
> ping 8.8.8.8 Pinging synthesized IPv6 address: fd16:a3d:e170:2:0:0:808:808 16 bytes from fd16:a3d:e170:2:0:0:808:808: icmp_seq=1 hlim=109 time=28ms 1 packets transmitted, 1 packets received. Packet loss = 0.0%. Round-trip min/avg/max = 28/28.0/28 ms. Done
נתב הגבולות יוצר פריט מיפוי NAT64 למכשיר הזה באמצעות הפקודה nat64 mappings:
> nat64 mappings | | Address | Ports or ICMP Ids | | 4 to 6 | 6 to 4 | +------------------+-------------------------------------------------------------+-------------------+--------+-------------------------+-------------------------+ | ID | IPv6 | IPv4 | v6 | v4 | Expiry | Pkts | Bytes | Pkts | Bytes | +------------------+------------------------------------------+------------------+---------+---------+--------+----------+--------------+----------+--------------+ | 90b156e3cf609a23 | fd16:a3d:e170:1:492d:bcdb:9f72:6297 | 192.168.255.254 | N/A | N/A | 7162s | 1 | 16 | 1 | 16 | | | TCP | 0 | 0 | 0 | 0 | | | UDP | 0 | 0 | 0 | 0 | | | ICMP | 1 | 16 | 1 | 16 | Done
הערך fd16:a3d:e170:1:492d:bcdb:9f72:6297 צריך להיות כתובת ה-IPv6 של מכשיר Thread.
אפשר להריץ את הפקודה הזו בנתב הגבול בכל שלב כדי לראות איך התנועה נספרת.
שליחת שאילתות DNS לשרתי DNS מסוג IPv4
משתמשים ב-dns resolve4 כדי לפתור שם מארח ברשת IPv4. כתובת שרת ה-DNS יכולה להיות גם כתובת IPv4:
> dns resolve4 example.com 8.8.8.8 Synthesized IPv6 DNS server address: fd16:a3d:e170:2:0:0:808:808 DNS response for example.com. - fd16:a3d:e170:2:0:0:17c0:e454 TTL:295 fd16:a3d:e170:2:0:0:17d7:88 TTL:295 fd16:a3d:e170:2:0:0:17d7:8a TTL:295 fd16:a3d:e170:2:0:0:6007:80af TTL:295 fd16:a3d:e170:2:0:0:6007:80c6 TTL:295 fd16:a3d:e170:2:0:0:17c0:e450 TTL:295 Done
תקשורת באמצעות TCP
אפשר ליצור חיבורי TCP בין מכשיר הקצה לבין מארחים ברשת IPv4.
נניח שכתובת ה-IP של מארח Linux IPv4 היא 192.168.0.2.
במארח Linux IPv4, משתמשים ב-nc כדי להאזין לחיבורי TCP:
$ nc -l 0.0.0.0 12345
ממכשיר הקצה של Thread, יוצרים חיבור TCP ושולחים הודעות למארח Linux IPv4:
> tcp init Done > tcp connect 192.168.0.2 12345 Connecting to synthesized IPv6 address: fd16:a3d:e170:2:0:0:c0a8:2 Done > tcp send hello
פלט מארח Linux IPv4:
hello
אפשר גם לשלוח הודעות ממארח Linux IPv4 למכשיר קצה של Thread. מקלידים world ומקישים על Enter במארח Linux IPv4 שבו פועל nc, ומכשיר הקצה של Thread מפיק את הפלט הבא:
TCP: Received 6 bytes: world
תקשורת באמצעות UDP
אפשר לתקשר באמצעות UDP בין מכשירי Thread לבין מארחים ברשת IPv4.
נניח שכתובת ה-IP של מארח Linux IPv4 היא 192.168.0.2.
משתמשים ב-nc כדי להאזין לחיבורי UDP:
$ nc -u -l 0.0.0.0 12345
ממכשיר הקצה של Thread, יוצרים חיבור UDP ושולחים הודעות למארח Linux IPv4:
> udp open Done > udp connect 192.168.0.2 12345 Connecting to synthesized IPv6 address: fd16:a3d:e170:2:0:0:c0a8:2 Done > udp send hello Done
פלט מארח Linux IPv4:
hello
אפשר גם לשלוח הודעות ממארח Linux IPv4 למכשיר קצה של Thread. מקלידים world ומקישים על Enter במארח Linux IPv4 שבו פועל nc, ומכשיר הקצה של Thread מפיק את הפלט הבא:
6 bytes from fd16:a3d:e170:2:0:0:c0a8:2 12345 world
5. הפעלה או השבתה של NAT64 בנתב גבולות
אפשר להפעיל או להשבית את NAT64 מתי שרוצים. כדי להשבית את NAT64, משתמשים ב-nat64 disable. אפשר להשתמש ב-nat64 state כדי לבדוק את המצב של NAT64.
> nat64 disable Done > nat64 state PrefixManager: Disabled Translator: Disabled Done
אחרי ההשבתה, המכשיר לא מפרסם יותר קידומת NAT64:
> netdata show Prefixes: fd16:a3d:e170:1::/64 paros low f800 Routes: ::/0 s med f800 Services: 44970 5d fd4db3e59738319339c4ee02ca9e2b1dd120 s f800 0 Contexts: fd16:a3d:e170:1::/64 1 sc Commissioning: 60365 - - - Done
בנוסף, למכשירים ברשת עם פרוטוקול Thread לא תהיה יותר גישה למארח IPv4 דרך נתב הגבולות הזה.
מ-CLI של מכשיר קצה של Thread:
> ping 8.8.8.8 Error 13: InvalidState
כדי להפעיל NAT64, משתמשים ב-nat64 enable. יכול להיות שיעבור זמן עד שמנהל הקידומות יתחיל לפרסם קידומת NAT64:
> nat64 enable Done > nat64 state PrefixManager: Idle Translator: NotWorking Done
אחרי כמה שניות, רכיבי NAT64 אמורים לפעול:
> nat64 state PrefixManager: Active Translator: Active Done > netdata show Prefixes: fd16:a3d:e170:1::/64 paros low f800 Routes: ::/0 s med f800 fd16:a3d:e170:2:0:0::/96 sn low f800 Services: 44970 5d fd4db3e59738319339c4ee02ca9e2b1dd120 s f800 0 Contexts: fd16:a3d:e170:1::/64 1 sc Commissioning: 60365 - - - Done
הערה: השבתה של NAT64 תגרום לניקוי של טבלת המיפוי:
> nat64 mappings | | Address | Ports or ICMP Ids | | 4 to 6 | 6 to 4 | +------------------+-------------------------------------------------------------+-------------------+--------+-------------------------+-------------------------+ | ID | IPv6 | IPv4 | v6 | v4 | Expiry | Pkts | Bytes | Pkts | Bytes | +------------------+------------------------------------------+------------------+---------+---------+--------+----------+--------------+----------+--------------+ Done
6. העברת שאילתות DNS לשרתי DNS במעלה הזרם
כש-NAT64 מופעל בנתב הגבול, OpenThread ינסה להעביר את שאילתות ה-DNS לדומיינים באינטרנט לשרתי DNS במעלה הזרם.
במכשיר הקצה, מוודאים ששרת ה-DNS שמוגדר כברירת מחדל הוא נתב הגבולות:
> dns config Server: [fd4d:b3e5:9738:3193:39c4:ee02:ca9e:2b1d]:53 ResponseTimeout: 6000 ms MaxTxAttempts: 3 RecursionDesired: yes ServiceMode: srv_txt_opt Nat64Mode: allow Done
כתובת ה-IPv6 של השרת (fd4d:b3e5:9738:3193:39c4:ee02:ca9e:2b1d בדוגמה שלמעלה) צריכה להיות אחת מהכתובות של נתב הגבול של OpenThread.
עכשיו אפשר לשלוח שאילתות DNS לדומיינים באינטרנט ממכשיר הקצה:
> dns resolve example.com DNS response for example.com. - 2600:1406:3a00:21:0:0:173e:2e65 TTL:161 2600:1406:3a00:21:0:0:173e:2e66 TTL:161 2600:1406:bc00:53:0:0:b81e:94c8 TTL:161 2600:1406:bc00:53:0:0:b81e:94ce TTL:161 2600:1408:ec00:36:0:0:1736:7f24 TTL:161 2600:1408:ec00:36:0:0:1736:7f31 TTL:161 Done > dns resolve4 example.com DNS response for example.com. - fd16:a3d:e170:2:0:0:6007:80af TTL:300 fd16:a3d:e170:2:0:0:6007:80c6 TTL:300 fd16:a3d:e170:2:0:0:17c0:e450 TTL:300 fd16:a3d:e170:2:0:0:17c0:e454 TTL:300 fd16:a3d:e170:2:0:0:17d7:88 TTL:300 fd16:a3d:e170:2:0:0:17d7:8a TTL:300 Done
7. מזל טוב
הגדרתם בהצלחה נתב גבולות עם תמיכה ב-NAT64, והשתמשתם בו כדי לספק גישה לאינטרנט למכשירי קצה בפרוטוקול Thread.
קריאה נוספת
- מדריכים ל-OpenThread
- OpenThread CLI Reference
- OpenThread API Reference for NAT64
- OpenThread API Reference for upstream DNS
- הפשטת פלטפורמת OpenThread ל-DNS