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

מידע על Codelab זה
schedule23 דקות
subjectהעדכון האחרון: 5 במאי 2025
account_circleנכתב על ידי Song Guo, Jonathan Hui

1. מבוא

7299534792dd9439.png

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

c3cd2e081bc052fd.png

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.

קריאה נוספת

מסמכי עזרה