נתב Thread Border - מספקים גישה לאינטרנט דרך NAT64

1. מבוא

7299534792dd9439.png

מהו שרשור?

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 זה:

c3cd2e081bc052fd.png

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.

קריאה נוספת

מסמכי עזר