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