1. מבוא
מהו Thread?
Thread הוא פרוטוקול רשתות רשתות רשתות אלחוטיות מבוסס-IP עם צריכת אנרגיה נמוכה, שמאפשר תקשורת מאובטחת בין מכשירים ומכשירים לענן. רשתות של חוטים יכולות להתאים את עצמן לשינויים בטופולוגיה כדי למנוע נקודות כשל בודדות.
מהו OpenThread?
OpenThread שפורסם על ידי Google הוא הטמעה של Thread® בקוד פתוח.
מהו נתב גבולות של OpenThread?
OpenThread Border Router (OTBR) שפורסם על ידי Google הוא הטמעה בקוד פתוח של Thread Border Router.
NAT64
NAT64 הוא מנגנון שמאפשר למארחים ברשתות IPv6 בלבד לגשת למשאבים ברשתות IPv4. שער NAT64 הוא מתרגם בין פרוטוקולי IPv4 לבין פרוטוקולי IPv6.
המתרגם NAT64, כחלק מ-OpenThread Border Router, תומך בתרגום של פרוטוקולים TCP, UDP ו-ICMP (ICMPv6).
מה תפַתחו
בסדנת הקוד הזו תלמדו להגדיר נתב גבולות של OpenThread (OTBR) ומכשיר Thread, ואז להפעיל ולבדוק תקשורת בין מכשירי Thread למארחי IPv4 באינטרנט דרך נתב גבולות של OpenThread.
מה תלמדו
- איך יוצרים נתב גבול של OpenThread עם תכונות NAT64.
- איך מתקשרים עם מארחי IPv4 ממכשירי קצה של Thread.
מה נדרש
- תחנת עבודה של Linux, ליצירה ולחיבור של Thread RCP, ממשק OpenThread CLI ובדיקת קישוריות 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.
מכשירי Thread ישתמשו בתחילית NAT64 כשהם יתקשרו עם מארח IPv4.
3. הגדרת מכשיר קצה ב-Thread
פועלים לפי השלב 'הגדרת FTDs' במדריך ליצירת רשת Thread באמצעות לוחות nRF52840 ו-OpenThread codelab כדי ליצור מכשיר קצה מסוג nRF52840 CLI ולבצע בו הפעלה מחדש (flash), עם שינוי בשלב הבא:
ביצירה והעברה (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
ממשיכים לפי ההוראות במדריך יצירת רשת Thread באמצעות לוחות nRF52840 ו-OpenThread Codelab. אחרי שתמלאו את השלבים לעדכון הקושחה של מכשיר הקצה באמצעות קובץ ה-CLI, תוכלו להיעזר במאמר הצטרפות הצומת השני לרשת Thread כדי להוסיף את מכשיר Thread לרשת Thread.
אחרי שמגדירים את מכשיר הקצה של Thread, ממתינים כמה שניות ובודקים אם הצטרפות לרשת Thread הושלמה. כמו למעלה, אפשר לראות את הקידומת של NAT64 שפורסמה בנתוני הרשת של השרשור.
> 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
מוודאים שנתוני הרשת תואמים לנתונים מ-OTBR.
4. תקשורת עם מארחי IPv4 ממכשיר הקצה של Thread
עכשיו אפשר לתקשר עם מארחים ברשת IPv4 ממכשיר הקצה שהגדרתם עכשיו.
שליחת בקשות ICMP echo למארחי 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
.
במארח IPv4 ב-Linux, משתמשים ב-nc
כדי להאזין לחיבורי TCP:
$ nc -l 0.0.0.0 12345
במכשיר הקצה של Thread, יוצרים חיבור TCP ושולחים הודעות למארח IPv4 ב-Linux:
> 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
אפשר גם לשלוח הודעות מהמארח IPv4 של Linux למכשיר קצה של Thread. מקלידים "world" ומקישים על Enter במארח IPv4 ב-Linux שבו פועל 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 ושולחים הודעות למארח IPv4 ב-Linux:
> 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
אפשר גם לשלוח הודעות מהמארח IPv4 של Linux למכשיר קצה של Thread. מקלידים "world" ומקישים על Enter במארח IPv4 ב-Linux שבו פועל nc
, והמכשיר הקצה של Thread מודיע:
6 bytes from fd16:a3d:e170:2:0:0:c0a8:2 12345 world
5. החלפת מצב של NAT64 בנתב גבולות
אפשר להפעיל או להשבית את NAT64 מתי שרוצים. משתמשים ב-nat64 disable
כדי להשבית את NAT64. ואפשר להשתמש ב-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 enable
כדי להפעיל את NAT64. יכול להיות שיחלוף זמן מה עד שמנהל הקידומות יתחיל לפרסם קידומת 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 ב-upstream.
במכשיר הקצה, מוודאים ששרת ה-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
- OpenThread API Reference for NAT64
- מידע על OpenThread API ל-DNS במקור
- החרגה של פלטפורמת OpenThread ל-DNS