1. מבוא
מהו שרשור?
Thread הוא פרוטוקול של רשת אלחוטית מבוססת-IP עם צריכת אנרגיה נמוכה. פרוטוקול זה מאפשר תקשורת מאובטחת בין מכשירים לבין מכשירים לענן. רשתות שרשור יכולות להסתגל לשינויים בטופולוגיה כדי להימנע מכשלים בנקודה אחת.
מהו OpenThread?
OpenThread פורסם על ידי Google הוא הטמעת קוד פתוח של Thread®.
מהו נתב גבול פתוח?
OpenThread Border Router (OTBR) שהושק על ידי Google הוא הטמעה של קוד פתוח של Thread Border Router.
NAT64
NAT64 הוא מנגנון שמאפשר למארחים ברשתות IPv6 בלבד לגשת למשאבים ברשתות IPv4. שער NAT64 הוא מתרגם בין פרוטוקולים של IPv4 לבין פרוטוקולים של IPv6.
מתרגם NAT64, כחלק מ-OpenThread Border Router, תומך בתרגום פרוטוקולים של TCP, UDP ו-ICMPv6.
מה תפַתחו
ב-Codelab הזה תגדירו נתב OpenThread Border ומכשיר Thread, ואז תוכלו להפעיל ולאמת תקשורת בין מכשירי Thread לבין מארחי IPv4 באינטרנט דרך OpenThread Border Router.
מה תלמדו
- הסבר על בניית נתב גבול OpenThread עם תכונות של NAT64.
- איך לתקשר עם מארחי IPv4 ממכשירי סיום של Thread.
מה הדרישות כדי להצטרף לתוכנית?
- תחנת עבודה של Linux ליצירה ולפלאש של NCP Thread, OpenOpen CLI ובדיקת קישוריות IPv4.
- פטל P4 4 עם RAM בנפח 4GB לנתב הגבולות. אפשר יהיה לגשת לתחנת העבודה ב-Linux דרך IPv4 מהמכשיר הזה.
- 2 לוחות SRiconicon nRF52840 DK.
הטופולוגיה של הרשת עבור Codelab זה:
2. הגדרת נתב גבול של OpenThread
מבצעים את שלב ההגדרה OTBR של נתב הגבולות Thread – נתב דו-כיווני IPv6 ו-Code-Service Discovery Discovery כדי לבנות את נתב הגבולות OpenOpen, עם השינוי הבא:
בקטע Build and install OTBR, עליך לומר לסקריפט להפעיל את מתרגם NAT64 ב-OpenThread על ידי הגדרת משתנה הסביבה NAT64
כ-1
ו-NAT64_SERVICE
כ-openthread
. מריצים את הפקודה הבאה לפני השלב:
$ export NAT64=1 NAT64_SERVICE=openthread
יש להמשיך לפי הקוד של נתב הגבולות של שרשור - הקישוריות הדו-כיוונית של IPv6 וזיהוי שירות מבוסס-DNS. לאחר יצירת רשת של שרשור, מוודאים שנתב הגבולות מפרסם קידומת 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 פועלת כמובילה בשרשור, ושיש קידומת 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. הגדרת המכשיר לסיום השרשור
פועלים לפי השלבים בקטע הגדרת שלב ה-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 ו-OpenThread Code. לאחר שמכשיר הקצה מהבהב עם תמונת ה-CLI, פועלים לפי ההוראות במאמר Thread Border Router – Bidirectional IPv6 Connectivity and DNS-based Service Discovery כדי להגדיר את מכשיר ה-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 של מכשיר השרשור שלנו:
> 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 לשרתי DNS4 של DNS
יש להשתמש ב-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 של מארח ה-IPv4 של Linux היא 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: fd4c:9574:3720:2:0:0:c0a8:2 Done > tcp send hello
פלטי המארח של Linux IPv4:
hello
אפשר גם לשלוח הודעות ממארח Linux IPv4 למכשיר הקצה של Thread. מקלידים "world" ומקישים על Enter במארח Linux IPv4 שמפעיל את nc
. הפלט של הפלט של המכשיר מיוצג בשרשור:
TCP: Received 6 bytes: world
תקשורת באמצעות UDP
ניתן לתקשר באמצעות UDP בין מכשירי Thread ומארחים ברשת IPv4.
נניח שכתובת ה-IP של מארח ה-IPv4 של Linux היא 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: fd4c:9574:3720:2:0:0:c0a8:2 Done > udp send hello Done
פלטי המארח של Linux IPv4:
hello
אפשר גם לשלוח הודעות ממארח Linux IPv4 למכשיר הקצה של Thread. מקלידים "world" ומקישים על Enter במארח Linux IPv4 שמפעיל את nc
. הפלט של הפלט של המכשיר מיוצג בשרשור:
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 של מכשיר השרשור שלנו:
> 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 במעלה.
הפונקציה הפנימית של DNS-SD תומכת בשרת הזה, כך שצריך לוודא ששרת ה-DNS-SD מופעל.
$ sudo ot-ctl srp server state running Done
אם לא הערך של running
, יש להפעיל אותו:
$ sudo ot-ctl srp server enable Done
יש לוודא ששרת ה-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
בדוגמה שלמעלה) צריכה להיות אחת מהכתובות של נתב ה-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 End.
קריאה נוספת
- מדריכים לשרשורים פתוחים
- חומרי עזר ל-CLI של OpenThread
- הפניית API של OpenThread ל-NAT64
- הפניית API של OpenThread עבור DNS upstream
- הפשטה של פלטפורמת OpenThread ל-DNS