1. מבוא
מה זה Thread?
פרוטוקול Thread הוא פרוטוקול רשת אלחוטית מבוסס-IP בעל מתח נמוך, שמאפשר תקשורת מאובטחת ממכשיר למכשיר וממכשירים לענן. רשתות של פרוטוקול Thread יכולות להסתגל לשינויים בטופולוגיה כדי להימנע מכשלים בנקודה אחת.
מה זה OpenThread?
OpenThread שהשקנו על ידי Google היא הטמעת קוד פתוח של Thread®.
מהו נתב גבול של OpenThread?
OpenThread Border Router (OTBR) שהושק על ידי Google הוא הטמעת קוד פתוח של נתב Thread Border.
NAT64
NAT64 הוא מנגנון שמאפשר למארחים ברשתות IPv6 בלבד לגשת למשאבים ברשתות IPv4. שער NAT64 הוא מתרגם בין פרוטוקולים של IPv4 ופרוטוקולי IPv6.
מתרגם NAT64, כחלק מנתב OpenThread Border Router, תומך בתרגום פרוטוקולים של TCP, UDP ו-ICMP (ICMPv6).
מה תפַתחו
ב-Codelab הזה, אתם מתכוונים להגדיר נתב Border של OpenThread ומכשיר בפרוטוקול Thread ואז להפעיל ולאמת תקשורת בין מכשירי פרוטוקול Thread למארחי IPv4 באינטרנט, דרך נתב גבול של OpenThread.
מה תלמדו
- איך בונים נתב Border של OpenThread עם תכונות NAT64
- איך מתקשרים עם מארחים של IPv4 ממכשירי קצה בפרוטוקול Thread.
למה תזדקק?
- תחנת עבודה של Linux, שמשמשת לפיתוח ולעדכון של פרוטוקול Thread NCP, OpenThread CLI ובדיקת קישוריות IPv4.
- מכשיר Raspberry Pi 4 עם זיכרון RAM בנפח 4GB לנתב הגבול של Thread. המכשיר הזה צריך לאפשר גישה לתחנת העבודה של Linux דרך IPv4.
- 2 לוחות מוליכים למחצה nRF52840 DK.
הטופולוגיה של הרשת עבור ה-Codelab הזה:
2. הגדרת נתב גבול של OpenThread
פועלים לפי שלב OTBR (הגדרת OTBR) של נתב Thread Border - קישוריות דו-כיוונית של IPv6 וקישוריות שירות מבוסס-DNS מבוסס-DNS כדי לבנות את נתב הגבול של OpenThread עם השינוי הבא:
במהלך יצירה והתקנה של OTBR, צריך להנחות את הסקריפט להפעיל את מתרגם NAT64 ב-OpenThread על ידי הגדרת משתנה הסביבה NAT64
ל-1
ול-NAT64_SERVICE
כ-openthread
. מריצים את הפקודה הבאה לפני השלב הבא:
$ export NAT64=1 NAT64_SERVICE=openthread
המשך עם Thread Border Router - קישוריות IPv6 דו-כיוונית וגילוי שירות מבוסס-DNS מבוסס-DNS ככותב הקוד. אחרי יצירת רשת בפרוטוקול Thread, אפשר לוודא שנתב הגבולות מפרסם קידומת NAT64 באמצעות פקודות OpenThread CLI.
קודם כל, צריך לוודא שנתב הגבולות שלנו פועל וש-NAT64 מופעל בנתב הגבול:
$ sudo ot-ctl state leader Done $ sudo ot-ctl nat64 enable Done $ sudo ot-ctl nat64 state PrefixManager: Active Translator: Active Done
נוכל לראות ש-OTBR פועל כמוביל של פרוטוקול Thread ויש קידומת NAT64 (fd4c:9574:3720:2:0:0::/96
במקרה שלנו) בנתוני רשת ה-Thread:
$ sudo ot-ctl netdata show Prefixes: fd4c:9574:3720:1::/64 paos low 0800 Routes: fd49:7770:7fc5:0::/64 s med 0800 fd4c:9574:3720:2:0:0::/96 sn low 0800 Services: 44970 01 41000500000e10 s 0800 44970 5d fdd20e532b87b93f50ad4eea0450f1bfd11f s 0800 Done
ייעשה שימוש בקידומת NAT64 במכשירי Thread בתקשורת עם מארח IPv4.
3. הגדרת מכשיר קצה של פרוטוקול Thread
פועלים לפי השלב 'הגדרת FTD' (הגדרת FTD) ברשת Build a Thread באמצעות לוחות nRF52840 ו-OpenThread Codelab כדי לבנות מכשיר קצה מסוג 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_JOINER=ON -DOT_COMMISSIONER=ON -DOT_DNS_CLIENT=ON -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON
ממשיכים עם בניית רשת של פרוטוקול Thread עם לוחות nRF52840 ו-codelab של OpenThread כפי שכתוב. אחרי שתמונת ה-CLI של מכשיר הקצה הבהבה, פועלים לפי Thread Border Router – קישוריות IPv6 דו-כיוונית וגילוי שירות מבוסס-DNS כדי להגדיר את מכשיר הקצה בפרוטוקול Thread.
ממתינים כמה שניות אחרי הגדרת מכשיר הקצה של פרוטוקול Thread ומוודאים שההצטרפות לרשת של פרוטוקול Thread הושלמה בהצלחה. אמורה להיות קידומת NAT64 מנתוני הרשת (fd4c:9574:3720:2:0:0::/96
במקרה שלנו):
> netdata show Prefixes: fd4c:9574:3720:1::/64 paos low 0800 Routes: fd49:7770:7fc5:0::/64 s med 0800 fd4c:9574:3720:2:0:0::/96 sn low 0800 Services: 44970 01 41000500000e10 s 0800 44970 5d fdd20e532b87b93f50ad4eea0450f1bfd11f s 0800 Done
מוודאים שנתוני הרשת תואמים לנתונים מ-OTBR.
4. תקשורת עם מארחי IPv4 ממכשיר הקצה של פרוטוקול Thread
עכשיו אתם יכולים לתקשר עם מארחים ברשת IPv4 ממכשיר הקצה שהגדרנו עכשיו.
שליחת בקשות הד של ICMP למארחי IPv4
מה-CLI של מכשיר הקצה של פרוטוקול Thread:
> ping 8.8.8.8 Pinging synthesized IPv6 address: fd4c:9574:3720:2:0:0:808:808 16 bytes from fd4c:9574:3720:2:0:0:808:808: icmp_seq=15 hlim=119 time=48ms 1 packets transmitted, 1 packets received. Packet loss = 0.0%. Round-trip min/avg/max = 48/48.0/48 ms. Done
נתב הגבולות יוצר פריט מיפוי NAT64 עבור המכשיר הזה באמצעות הפקודה nat64 mappings
:
$ sudo ot-ctl nat64 mappings | | Address | | 4 to 6 | 6 to 4 | +------------------+-------------------------------------------------------------+--------+-------------------------+-------------------------+ | ID | IPv6 | IPv4 | Expiry | Pkts | Bytes | Pkts | Bytes | +------------------+------------------------------------------+------------------+--------+----------+--------------+----------+--------------+ | 377ee63dd3127f1a | fd4c:9574:3720:1:1d61:b4c1:494f:f975 | 192.168.255.254 | 7190s | 1 | 16 | 1 | 16 | | | TCP | 0 | 0 | 0 | 0 | | | UDP | 0 | 0 | 0 | 0 | | | ICMP | 1 | 16 | 1 | 16 | Done
fd4c:9574:3720:1:1d61:b4c1:494f:f975
צריכה להיות כתובת ה-IPv6 של המכשיר בפרוטוקול Thread.
בכל שלב, מריצים את הפקודה הזו בנתב הגבולות כדי לראות איך היא סופרת את התנועה.
שליחת שאילתות DNS לשרתי DNS של IPv4
אפשר להשתמש ב-dns resolve4
כדי לפענח שם מארח ברשת IPv4. כתובת שרת ה-DNS יכולה להיות גם כתובת IPv4:
> dns resolve4 example.com 8.8.8.8 Synthesized IPv6 DNS server address: fd4c:9574:3720:2:0:0:808:808 DNS response for example.com. - fd4c:9574:3720:2:0:0:5db8:d822 TTL:20456 Done
תקשורת באמצעות TCP
אפשר ליצור חיבורי TCP בין מכשיר הקצה לבין המארחים ברשת IPv4.
נניח שכתובת ה-IP של מארח Linux IPv4 שלכם היא 192.168.0.2
.
במארח Linux IPv4, משתמשים ב-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: fd4c:9574:3720:2:0:0:c0a8:2 Done > tcp send hello
הפלט של מארח Linux IPv4 שלך:
hello
אפשר גם לשלוח הודעות ממארח Linux IPv4 למכשיר קצה Thread. מקלידים 'עולם' ומקישים על 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 ושולחים הודעות למארח IPv4 ב-Linux:
> udp open Done > udp connect 192.168.0.2 12345 Connecting to synthesized IPv6 address: fd4c:9574:3720:2:0:0:c0a8:2 Done > udp send hello Done
הפלט של מארח Linux IPv4 שלך:
hello
אפשר גם לשלוח הודעות ממארח Linux IPv4 למכשיר קצה Thread. מקלידים 'עולם' ומקישים על Enter במארח של Linux IPv4 שמריץ את nc
, ויציאות של מכשיר הקצה של פרוטוקול Thread:
6 bytes from fd4c:9574:3720:2:0:0:c0a8:2 12345 world
5. הפעלה או השבתה של NAT64 בנתב גבול
אפשר להפעיל או להשבית את NAT64 בכל שלב. משתמשים ב-nat64 disable
כדי להשבית את NAT64. ומשתמשים ב-nat64 state
כדי לבדוק את המצב של NAT64.
$ sudo ot-ctl nat64 disable Done $ sudo ot-ctl nat64 state PrefixManager: Disabled Translator: Disabled Done
לאחר ההשבתה, המכשיר לא מפרסם יותר קידומת NAT64:
$ sudo ot-ctl netdata show Prefixes: fd4c:9574:3720:1::/64 paos low 0800 Routes: fd49:7770:7fc5:0::/64 s med 0800 Services: 44970 01 41000500000e10 s 0800 44970 5d fdd20e532b87b93f50ad4eea0450f1bfd11f s 0800 Done
כמו כן, המכשירים ברשת פרוטוקול Thread לא יכולים יותר לגשת למארח IPv4 דרך נתב הגבול הזה.
מה-CLI של מכשיר הקצה של פרוטוקול Thread:
> ping 8.8.8.8 Error 13: InvalidState
משתמשים ב-nat64 enable
כדי להפעיל את NAT64. יכול להיות שיחלוף זמן מה עד שמנהל התחילית יתחיל לפרסם קידומת NAT64:
$ sudo ot-ctl nat64 enable Done $ sudo ot-ctl nat64 state PrefixManager: Idle Translator: NotWorking Done
לאחר מספר שניות, רכיבי ה-NAT64 אמורים להיות פעילים:
$ sudo ot-ctl nat64 state PrefixManager: Active Translator: Active Done $ sudo ot-ctl netdata show Prefixes: fd4c:9574:3720:1::/64 paos low 0800 Routes: fd49:7770:7fc5:0::/64 s med 0800 fd4c:9574:3720:2:0:0::/96 sn low 0800 Services: 44970 01 41000500000e10 s 0800 44970 5d fdd20e532b87b93f50ad4eea0450f1bfd11f s 0800 Done
שימו לב שהשבתת NAT64 תגרום לניקוי טבלת המיפוי:
$ sudo ot-ctl nat64 mappings | | Address | | 4 to 6 | 6 to 4 | +------------------+-------------------------------------------------------------+--------+-------------------------+-------------------------+ | ID | IPv6 | IPv4 | Expiry | Pkts | Bytes | Pkts | Bytes | +------------------+------------------------------------------+------------------+--------+----------+--------------+----------+--------------+ Done
6. העברת שאילתות DNS לשרתי DNS ב-upstream
כש-NAT64 מופעל בנתב הגבול, OpenThread ינסה להעביר את שאילתות ה-DNS של דומיינים באינטרנט לשרתי DNS ב-upstream.
פונקציה זו נתמכת על ידי שרת DNS-SD הפנימי, לכן עליך לוודא ששרת DNS-SD מופעל.
$ sudo ot-ctl srp server state running Done
אם הוא לא running
, יש להפעיל אותו:
$ sudo ot-ctl srp server enable Done
מוודאים ששרת ה-proxy ל-DNS ב-upstream מופעל:
$ sudo ot-ctl dns server upstream Enabled Done
אם הוא לא Enabled
, יש להפעיל אותו:
$ sudo ot-ctl dns server upstream enable Done
במכשירי קצה, צריך לוודא שלקוח ה-SRP מופעל כדי שהוא ישלח שאילתות DNS לנתב הגבול:
> srp client state Enabled Done
אם הוא לא Enabled
, יש להפעיל אותו:
> srp client autostart enable Done
במכשיר הקצה, צריך לוודא ששרת ה-DNS שמוגדר כברירת מחדל הוא נתב הגבולות:
> dns config Server: [fdd2:0e53:2b87:b93f:50ad:4eea:0450:f1bf]:53 ResponseTimeout: 6000 ms MaxTxAttempts: 3 RecursionDesired: yes Done
כתובת ה-IPv6 של השרת (fdd2:0e53:2b87:b93f:50ad:4eea:0450:f1bf
בדוגמה שלמעלה) צריכה להיות אחת מהכתובות של נתב Border Border (נתב גבול של OpenThread).
עכשיו אתם יכולים לשלוח שאילתות DNS לגבי דומיינים באינטרנט ממכשיר הקצה:
> dns resolve example.com DNS response for example.com. - 2606:2800:220:1:248:1893:25c8:1946 TTL:8720 Done > dns resolve4 example.com DNS response for example.com. - fd4c:9574:3720:2:0:0:5db8:d822 TTL:20456 Done
7. מזל טוב
מזל טוב, הגדרת בהצלחה נתב גבול עם תמיכה ב-NAT64 והשתמש בו כדי לספק גישה לאינטרנט למכשירי קצה בפרוטוקול Thread.
קריאה נוספת
- מדריכים ל-OpenThread
- חומר עזר בנושא OpenThread CLI
- חומר עזר בנושא OpenThread API ל-NAT64
- חומר עזר של OpenThread API ל-DNS ב-upstream
- הפשטה של פלטפורמת OpenThread ל-DNS