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

1. מבוא

7299534792dd9439.png

מה זה Thread?

‫Thread הוא פרוטוקול רשת אלחוטי מבוסס-IP שפועל בצריכת חשמל נמוכה ומאפשר תקשורת מאובטחת בין מכשירים ובין מכשירים לענן. רשתות Thread יכולות להתאים את עצמן לשינויים בטופולוגיה כדי להימנע מנקודות כשל יחידות.

מה זה OpenThread?

OpenThread שפורסם על ידי Google הוא הטמעה בקוד פתוח של Thread®.

מה זה OpenThread Border Router?

OpenThread Border Router‏ (OTBR) שפורסם על ידי Google הוא הטמעה בקוד פתוח של Thread Border Router.

NAT64

‫NAT64 הוא מנגנון שמאפשר למארחים ברשתות IPv6 בלבד לגשת למשאבים ברשתות IPv4. שער NAT64 הוא מתרגם בין פרוטוקולי IPv4 ופרוטוקולי IPv6.

מתרגם NAT64, כחלק מ-OpenThread Border Router, תומך בתרגום של פרוטוקולים TCP,‏ UDP ו-ICMP‏ (ICMPv6).

מה תפַתחו

ב-codelab הזה תגדירו נתב גבולות OpenThread (OTBR) ומכשיר Thread, ואז תפעילו ותאמתו את התקשורת בין מכשירי Thread ומארחי IPv4 באינטרנט באמצעות נתב גבולות OpenThread.

מה תלמדו

  • איך לבנות נתב גבול OpenThread עם תכונות NAT64.
  • איך מתקשרים עם מארחי IPv4 ממכשירי קצה של Thread.

הדרישות

  • תחנת עבודה עם Linux, לבנייה ולהפעלה של Thread RCP, ממשק שורת הפקודה של OpenThread ובדיקת קישוריות 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.

קידומת NAT64 תשמש מכשירי Thread לתקשורת עם מארח IPv4.

3. הגדרת מכשיר קצה בפרוטוקול Thread

פועלים לפי השלב Set up the FTDs (הגדרת מכשירי FTD) במדריך Build a Thread network with nRF52840 boards and OpenThread codelab (בניית רשת Thread באמצעות לוחות nRF52840 ומעבדת קוד של OpenThread) כדי לבנות ולהפעיל מכשיר קצה של 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_DNS_CLIENT=ON -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON

ממשיכים עם Build a Thread network with nRF52840 boards and OpenThread codelab כמו שכתוב. אחרי שמבצעים פלאשינג של תמונת ה-CLI במכשיר הקצה, פועלים לפי השלבים שבקטע הצטרפות לצומת השני ברשת Thread כדי להוסיף את מכשיר Thread לרשת Thread.

מחכים כמה שניות אחרי שמגדירים את מכשיר הקצה של Thread ומוודאים שההצטרפות לרשת 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

מוודאים שנתוני הרשת זהים לנתונים שמופיעים בדוח השקיפות.

4. תקשורת עם מארחי IPv4 ממכשיר קצה של Thread

עכשיו אפשר לתקשר עם מארחים ברשת IPv4 ממכשיר הקצה שהגדרנו.

שליחת בקשות הד ICMP למארחי 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.

במארח 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: fd16:a3d:e170:2:0:0:c0a8:2
Done
> tcp send hello

פלט מארח Linux IPv4:

hello

אפשר גם לשלוח הודעות ממארח Linux IPv4 למכשיר קצה של Thread. מקלידים world ומקישים על 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 ושולחים הודעות למארח Linux IPv4:

> 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

אפשר גם לשלוח הודעות ממארח Linux IPv4 למכשיר קצה של Thread. מקלידים world ומקישים על Enter במארח Linux IPv4 שבו פועל nc, ומכשיר הקצה של Thread מפיק את הפלט הבא:

6 bytes from fd16:a3d:e170:2:0:0:c0a8:2 12345 world

5. הפעלה או השבתה של NAT64 בנתב גבולות

אפשר להפעיל או להשבית את NAT64 מתי שרוצים. כדי להשבית את NAT64, משתמשים ב-nat64 disable. אפשר להשתמש ב-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, משתמשים ב-nat64 enable. יכול להיות שיעבור זמן עד שמנהל הקידומות יתחיל לפרסם קידומת 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 במעלה הזרם.

במכשיר הקצה, מוודאים ששרת ה-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.

קריאה נוספת

מסמכי עזר