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

۱. مقدمه

۷۲۹۹۵۳۴۷۹۲dd۹۴۳۹.png

نخ چیست؟

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

اوپن‌ترید چیست؟

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

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

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

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.

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

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

توپولوژی شبکه برای این آزمایشگاه کد:

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 استفاده خواهد شد.

۳. تنظیم دستگاه انتهای رزوه

برای ساخت و فلش کردن یک دستگاه انتهایی nRF52840 CLI ، مرحله‌ی «تنظیم FTDها» از بخش «ساخت شبکه‌ی Thread با بردهای nRF52840» و OpenThread codelab را دنبال کنید، البته با کمی تغییر به مرحله‌ی زیر:

در 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

همانطور که نوشته شده است، با ساخت یک شبکه Thread با بردهای nRF52840 و Codelab OpenThread ادامه دهید. پس از اینکه دستگاه نهایی با تصویر CLI فلش شد، برای اضافه کردن دستگاه Thread به شبکه Thread، گره دوم را به شبکه Thread متصل کنید .

پس از تنظیم دستگاه Thread end، چند ثانیه صبر کنید و تأیید کنید که آیا اتصال به شبکه 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

مطمئن شوید که داده‌های شبکه با داده‌های OTBR مطابقت دارند.

۴. ارتباط با میزبان‌های 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 mappings یک آیتم NAT64 mapping برای این دستگاه ایجاد می‌کند:

> 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 میزبان لینوکس IPv4 شما 192.168.0.2 است.

روی هاست لینوکس 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

خروجی‌های هاست لینوکس IPv4 شما:

hello

همچنین می‌توانید پیام‌هایی را از میزبان IPv4 لینوکس خود به دستگاه Thread end ارسال کنید. در میزبان IPv4 لینوکس خود که nc را اجرا می‌کند، "world" را تایپ کرده و Enter را فشار دهید، و خروجی دستگاه 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 end ارسال کنید. در میزبان IPv4 لینوکس خود که nc را اجرا می‌کند، "world" را تایپ کرده و Enter را فشار دهید، و خروجی دستگاه Thread end شما به صورت زیر خواهد بود:

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

۵. فعال/غیرفعال کردن NAT64 در روتر Border

شما می‌توانید NAT64 را هر زمان که بخواهید فعال یا غیرفعال کنید. برای غیرفعال کردن NAT64 nat64 disable استفاده کنید. و برای بررسی وضعیت NAT64 از nat64 state استفاده کنید.

> 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

۶. کوئری‌های 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

۷. تبریک

تبریک می‌گویم، شما با موفقیت یک روتر مرزی با پشتیبانی NAT64 راه‌اندازی کردید و از آن برای دسترسی به اینترنت برای دستگاه‌های Thread end استفاده کردید!

مطالعه بیشتر

اسناد مرجع