۱. مقدمه

نخ چیست؟
ترد (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).
توپولوژی شبکه برای این آزمایشگاه کد:

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 استفاده کردید!
مطالعه بیشتر
- راهنماهای OpenThread
- مرجع OpenThread CLI
- مرجع API OpenThread برای NAT64
- مرجع API OpenThread برای DNS بالادست
- انتزاع پلتفرم OpenThread برای DNS