Thread Border Router - دسترسی به اینترنت را از طریق NAT64 فراهم می کند

درباره این codelab
schedule۲۳ دقیقه
subjectآخرین به‌روزرسانی: ۱۵ اردیبهشت ۱۴۰۴
account_circleنویسنده: Song Guo, Jonathan Hui

1. مقدمه

7299534792dd9439.png

Thread چیست؟

Thread یک پروتکل شبکه بی سیم کم مصرف مبتنی بر IP است که ارتباطات دستگاه به دستگاه و دستگاه به ابر را ایمن می کند. شبکه های نخ می توانند با تغییرات توپولوژی سازگار شوند تا از خرابی های تک نقطه ای جلوگیری کنند.

OpenThread چیست؟

OpenThread منتشر شده توسط Google یک پیاده سازی متن باز Thread® است.

روتر مرزی OpenThread چیست؟

روتر مرزی OpenThread (OTBR) منتشر شده توسط گوگل یک پیاده سازی متن باز از Thread Border Router است.

NAT64

NAT64 مکانیزمی است که میزبان ها را در شبکه های فقط IPv6 قادر می سازد به منابع در شبکه های IPv4 دسترسی داشته باشند. دروازه NAT64 یک مترجم بین پروتکل های IPv4 و پروتکل های IPv6 است.

مترجم NAT64، به عنوان بخشی از OpenThread Border Router، از ترجمه پروتکل های TCP، UDP و ICMP (ICMPv6) پشتیبانی می کند.

چیزی که خواهی ساخت

در این کد لبه، شما می‌خواهید یک روتر مرزی OpenThread (OTBR) و یک دستگاه Thread راه‌اندازی کنید، سپس ارتباط بین دستگاه‌های Thread و میزبان‌های IPv4 را در اینترنت از طریق OpenThread Border Router فعال و تأیید کنید.

چیزی که یاد خواهید گرفت

  • چگونه یک روتر مرزی OpenThread با ویژگی های NAT64 بسازیم.
  • نحوه ارتباط با میزبان های IPv4 از دستگاه های Thread end.

آنچه شما نیاز دارید

  • یک ایستگاه کاری لینوکس، برای ساخت و فلش کردن Thread RCP، OpenThread CLI و آزمایش اتصال IPv4.
  • Raspberry Pi برای روتر مرزی Thread. ایستگاه کاری لینوکس شما باید از طریق IPv4 از این دستگاه قابل دسترسی باشد.
  • 2 دانگل USB نیمه هادی Nordic nRF52840 (یکی برای RCP و یکی برای دستگاه انتهایی Thread).

توپولوژی شبکه برای این کد لبه:

c3cd2e081bc052fd.png

2. روتر مرزی OpenThread را راه اندازی کنید

سریعترین راه برای راه اندازی OTBR پیروی از راهنمای راه اندازی OTBR است.

پس از تکمیل راه‌اندازی OTBR، ot-ctl استفاده کنید تا تأیید کنید که سرویس NAT64 در روتر مرزی فعال است:

> nat64 state
PrefixManager: Active
Translator: Active
Done

یک روتر مرز رشته پیشوند 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

پیشوند NAT64 به عنوان ورودی مسیر با پرچم n نشان داده می شود. در مثال بالا، fd16:a3d:e170:2:0:0::/96 پیشوند NAT64 است.

پیشوند NAT64 توسط دستگاه های Thread هنگام برقراری ارتباط با میزبان IPv4 استفاده می شود.

3. دستگاه پایان موضوع را راه اندازی کنید

برای ساختن و فلش کردن یک دستگاه انتهایی nRF52840 CLI، با تغییر به مرحله زیر، مرحله Set up the FTDs از شبکه Build a Thread را با بردهای nRF52840 و Codelab OpenThread دنبال کنید:

در Build و Flash ، هنگام فراخوانی script/build ، باید -DOT_DNS_CLIENT=ON ، -DOT_SRP_CLIENT=ON و -DOT_ECDSA=ON را به خط فرمان اضافه کنید:

$ 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 را با بردهای nRF52840 و کد OpenThread ادامه دهید. پس از اینکه دستگاه انتهایی با تصویر CLI فلش شد، Join node دوم به شبکه Thread را دنبال کنید تا دستگاه Thread به شبکه Thread اضافه شود.

پس از راه اندازی دستگاه پایان موضوع، چند ثانیه صبر کنید و بررسی کنید که آیا پیوستن به شبکه Thread موفقیت آمیز است یا خیر. همانطور که در بالا ذکر شد، می توانید پیشوند NAT64 منتشر شده را در Thread Network Data مشاهده کنید.

> 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 را به میزبان های IPv4 ارسال کنید

از CLI دستگاه پایان موضوع ما:

> 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 mappings یک آیتم نقشه برداری NAT64 برای این دستگاه ایجاد می کند:

> 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 ارسال کنید

برای حل یک نام میزبان در شبکه IPv4 از dns resolve4 استفاده کنید. آدرس سرور 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 میزبان IPv4 لینوکس شما 192.168.0.2 است.

در میزبان IPv4 لینوکس خود، از nc برای گوش دادن به اتصالات TCP استفاده کنید:

$ nc -l 0.0.0.0 12345

از دستگاه Thread end خود، یک اتصال TCP ایجاد کنید و پیام هایی را به میزبان لینوکس 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

خروجی های میزبان IPv4 لینوکس شما:

hello

همچنین می‌توانید از میزبان IPv4 لینوکس خود به دستگاه پایان Thread پیام ارسال کنید. "world" را تایپ کنید و روی میزبان IPv4 لینوکس خود که nc را اجرا می کند و خروجی های دستگاه Thread end خود را فشار دهید:

TCP: Received 6 bytes: world

از طریق UDP ارتباط برقرار کنید

امکان برقراری ارتباط با استفاده از UDP بین دستگاه های Thread و هاست در شبکه IPv4 وجود دارد.

فرض کنید آدرس IP میزبان IPv4 لینوکس شما 192.168.0.2 است.

از nc برای گوش دادن به اتصالات UDP استفاده کنید:

$ nc -u -l 0.0.0.0 12345

از دستگاه پایان Thread خود، یک اتصال UDP ایجاد کنید و پیام هایی را به میزبان 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

خروجی های میزبان IPv4 لینوکس شما:

hello

همچنین می‌توانید از میزبان IPv4 لینوکس خود به دستگاه پایان Thread پیام ارسال کنید. "world" را تایپ کنید و روی میزبان IPv4 لینوکس خود که nc را اجرا می کند و خروجی های دستگاه Thread end خود را فشار دهید:

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

5. NAT64 را روی Border Router روشن کنید

هر زمان که بخواهید می توانید 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 دستگاه پایان موضوع ما:

> 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 استفاده کردید!

در ادامه مطلب

اسناد مرجع