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

1. מבוא

7299534792dd9439.png

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

c3cd2e081bc052fd.png

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.

קריאה נוספת

מסמכי עזר