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 و یک دستگاه Thread راهاندازی کنید، سپس ارتباط بین دستگاههای Thread و میزبانهای IPv4 را در اینترنت از طریق OpenThread Border Router فعال و تأیید کنید.
چیزی که یاد خواهید گرفت
- چگونه یک روتر مرزی OpenThread با ویژگی های NAT64 بسازیم.
- نحوه ارتباط با میزبان های IPv4 از دستگاه های Thread end.
آنچه شما نیاز دارید
- یک ایستگاه کاری لینوکس، برای ساخت و فلش کردن Thread NCP، OpenThread CLI و آزمایش اتصال IPv4.
- Raspberry Pi 4 با 4 گیگابایت رم برای روتر مرزی Thread. ایستگاه کاری لینوکس شما باید از طریق IPv4 از این دستگاه قابل دسترسی باشد.
- 2 برد Nordic Semiconductor nRF52840 DK.
توپولوژی شبکه برای این کد لبه:
2. روتر مرزی OpenThread را راه اندازی کنید
برای ساخت روتر مرزی OpenThread با تغییر زیر ، مرحله Setup OTBR را در Thread Border Router - اتصال IPv6 دوطرفه و کد آزمایشگاه مبتنی بر DNS Service Discovery دنبال کنید:
در ساخت و نصب OTBR ، باید به اسکریپت بگویید که مترجم NAT64 را در OpenThread با تنظیم متغیر محیطی NAT64
روی 1
و NAT64_SERVICE
روی openthread
فعال کند. قبل از مرحله دستور زیر را اجرا کنید:
$ export NAT64=1 NAT64_SERVICE=openthread
همانطور که نوشته شده است، با Thread Border Router - اتصال IPv6 دوطرفه و کدهای DNS-Based Service Discovery ادامه دهید. پس از تشکیل شبکه موضوع ، می توانید تأیید کنید که روتر مرزی یک پیشوند NAT64 را با دستورات OpenThread CLI منتشر می کند.
ابتدا، مطمئن شوید که روتر مرزی ما فعال است و NAT64 در روتر مرزی فعال است:
$ sudo ot-ctl state leader Done $ sudo ot-ctl nat64 enable Done $ sudo ot-ctl nat64 state PrefixManager: Active Translator: Active Done
ما باید بتوانیم ببینیم که OTBR به عنوان رهبر Thread عمل می کند و یک پیشوند NAT64 ( fd4c:9574:3720:2:0:0::/96
در مورد ما) در Thread Network Data وجود دارد:
$ sudo ot-ctl netdata show Prefixes: fd4c:9574:3720:1::/64 paos low 0800 Routes: fd49:7770:7fc5:0::/64 s med 0800 fd4c:9574:3720:2:0:0::/96 sn low 0800 Services: 44970 01 41000500000e10 s 0800 44970 5d fdd20e532b87b93f50ad4eea0450f1bfd11f s 0800 Done
پیشوند 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_JOINER=ON -DOT_COMMISSIONER=ON -DOT_DNS_CLIENT=ON -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON
همانطور که نوشته شده است ، شبکه Build a Thread را با بردهای nRF52840 و کد OpenThread ادامه دهید. پس از اینکه دستگاه نهایی با تصویر CLI فلش شد، Thread Border Router - Bidirectional IPv6 Connectivity and DNS-Based Service Discovery را دنبال کنید تا دستگاه پایان Thread را راه اندازی کنید.
پس از راه اندازی دستگاه پایان موضوع، چند ثانیه صبر کنید و بررسی کنید که آیا پیوستن به شبکه Thread موفقیت آمیز است یا خیر. شما باید بتوانید پیشوند NAT64 را از داده های شبکه پیدا کنید (در مورد ما fd4c:9574:3720:2:0:0::/96
):
> netdata show Prefixes: fd4c:9574:3720:1::/64 paos low 0800 Routes: fd49:7770:7fc5:0::/64 s med 0800 fd4c:9574:3720:2:0:0::/96 sn low 0800 Services: 44970 01 41000500000e10 s 0800 44970 5d fdd20e532b87b93f50ad4eea0450f1bfd11f s 0800 Done
مطمئن شوید که داده های شبکه با داده های OTBR مطابقت دارد.
4. با میزبان های IPv4 از دستگاه پایان Thread ارتباط برقرار کنید
اکنون میتوانید با میزبانهای شبکه IPv4 از دستگاه نهایی که بهتازگی راهاندازی کردیم، ارتباط برقرار کنید.
درخواست های اکو ICMP را به میزبان های IPv4 ارسال کنید
از CLI دستگاه پایان موضوع ما:
> ping 8.8.8.8 Pinging synthesized IPv6 address: fd4c:9574:3720:2:0:0:808:808 16 bytes from fd4c:9574:3720:2:0:0:808:808: icmp_seq=15 hlim=119 time=48ms 1 packets transmitted, 1 packets received. Packet loss = 0.0%. Round-trip min/avg/max = 48/48.0/48 ms. Done
روتر مرزی با دستور nat64 mappings
یک آیتم نقشه برداری NAT64 برای این دستگاه ایجاد می کند:
$ sudo ot-ctl nat64 mappings | | Address | | 4 to 6 | 6 to 4 | +------------------+-------------------------------------------------------------+--------+-------------------------+-------------------------+ | ID | IPv6 | IPv4 | Expiry | Pkts | Bytes | Pkts | Bytes | +------------------+------------------------------------------+------------------+--------+----------+--------------+----------+--------------+ | 377ee63dd3127f1a | fd4c:9574:3720:1:1d61:b4c1:494f:f975 | 192.168.255.254 | 7190s | 1 | 16 | 1 | 16 | | | TCP | 0 | 0 | 0 | 0 | | | UDP | 0 | 0 | 0 | 0 | | | ICMP | 1 | 16 | 1 | 16 | Done
fd4c:9574:3720:1:1d61:b4c1:494f:f975
باید آدرس IPv6 دستگاه Thread شما باشد.
هر زمان که بخواهید این دستور را روی روتر مرزی اجرا کنید تا ببینید چگونه ترافیک را محاسبه می کند.
پرس و جوهای DNS را به سرورهای DNS IPv4 ارسال کنید
برای حل یک نام میزبان در شبکه IPv4 از dns resolve4
استفاده کنید. آدرس سرور DNS همچنین می تواند یک آدرس IPv4 باشد:
> dns resolve4 example.com 8.8.8.8 Synthesized IPv6 DNS server address: fd4c:9574:3720:2:0:0:808:808 DNS response for example.com. - fd4c:9574:3720:2:0:0:5db8:d822 TTL:20456 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: fd4c:9574:3720: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: fd4c:9574:3720:2:0:0:c0a8:2 Done > udp send hello Done
خروجی های میزبان IPv4 لینوکس شما:
hello
همچنین میتوانید از میزبان IPv4 لینوکس خود به دستگاه پایان Thread پیام ارسال کنید. "world" را تایپ کنید و روی میزبان IPv4 لینوکس خود که nc
اجرا می کند و خروجی های دستگاه Thread end خود را فشار دهید:
6 bytes from fd4c:9574:3720:2:0:0:c0a8:2 12345 world
5. NAT64 را روی Border Router روشن کنید
هر زمان که بخواهید می توانید NAT64 را فعال یا غیرفعال کنید. برای غیرفعال کردن NAT64 از nat64 disable
استفاده کنید. و از nat64 state
برای بررسی وضعیت NAT64 استفاده کنید.
$ sudo ot-ctl nat64 disable Done $ sudo ot-ctl nat64 state PrefixManager: Disabled Translator: Disabled Done
پس از غیرفعال کردن، دستگاه دیگر پیشوند NAT64 را منتشر نمی کند:
$ sudo ot-ctl netdata show Prefixes: fd4c:9574:3720:1::/64 paos low 0800 Routes: fd49:7770:7fc5:0::/64 s med 0800 Services: 44970 01 41000500000e10 s 0800 44970 5d fdd20e532b87b93f50ad4eea0450f1bfd11f s 0800 Done
همچنین دستگاه های موجود در شبکه Thread دیگر نمی توانند از طریق این روتر مرزی به میزبان IPv4 دسترسی داشته باشند.
از CLI دستگاه پایان موضوع ما:
> ping 8.8.8.8 Error 13: InvalidState
برای فعال کردن NAT64 از nat64 enable
استفاده کنید. ممکن است مدتی طول بکشد تا مدیر پیشوند شروع به تبلیغ پیشوند NAT64 کند:
$ sudo ot-ctl nat64 enable Done $ sudo ot-ctl nat64 state PrefixManager: Idle Translator: NotWorking Done
پس از چند ثانیه، اجزای NAT64 باید فعال و فعال شوند:
$ sudo ot-ctl nat64 state PrefixManager: Active Translator: Active Done $ sudo ot-ctl netdata show Prefixes: fd4c:9574:3720:1::/64 paos low 0800 Routes: fd49:7770:7fc5:0::/64 s med 0800 fd4c:9574:3720:2:0:0::/96 sn low 0800 Services: 44970 01 41000500000e10 s 0800 44970 5d fdd20e532b87b93f50ad4eea0450f1bfd11f s 0800 Done
توجه داشته باشید که غیرفعال کردن NAT64 جدول نقشه برداری را پاک می کند:
$ sudo ot-ctl nat64 mappings | | Address | | 4 to 6 | 6 to 4 | +------------------+-------------------------------------------------------------+--------+-------------------------+-------------------------+ | ID | IPv6 | IPv4 | Expiry | Pkts | Bytes | Pkts | Bytes | +------------------+------------------------------------------+------------------+--------+----------+--------------+----------+--------------+ Done
6. پرس و جوهای DNS را به سرورهای DNS بالادستی ارسال کنید
هنگامی که NAT64 در روتر مرزی فعال است، OpenThread سعی می کند پرس و جوهای DNS را برای دامنه های اینترنتی به سرورهای DNS بالادستی ارسال کند.
این عملکرد توسط سرور داخلی DNS-SD پشتیبانی می شود، بنابراین باید مطمئن شوید که سرور DNS-SD فعال است.
$ sudo ot-ctl srp server state running Done
اگر running
نیست، آن را فعال کنید:
$ sudo ot-ctl srp server enable Done
مطمئن شوید که پروکسی DNS بالادست فعال است:
$ sudo ot-ctl dns server upstream Enabled Done
اگر Enabled
نیست، آن را فعال کنید:
$ sudo ot-ctl dns server upstream enable Done
در دستگاههای پایانی، مطمئن شوید که کلاینت SRP فعال است، بنابراین درخواستهای DNS را به روتر مرزی ارسال میکند:
> srp client state Enabled Done
اگر Enabled
نیست، آن را فعال کنید:
> srp client autostart enable Done
در دستگاه نهایی خود، مطمئن شوید که سرور DNS پیشفرض روتر مرزی است:
> dns config Server: [fdd2:0e53:2b87:b93f:50ad:4eea:0450:f1bf]:53 ResponseTimeout: 6000 ms MaxTxAttempts: 3 RecursionDesired: yes Done
آدرس IPv6 سرور ( fdd2:0e53:2b87:b93f:50ad:4eea:0450:f1bf
در مثال بالا)، باید یکی از آدرسهای روتر مرزی OpenThread شما باشد.
اکنون می توانید پرس و جوهای DNS برای دامنه های اینترنتی را از دستگاه نهایی ارسال کنید:
> dns resolve example.com DNS response for example.com. - 2606:2800:220:1:248:1893:25c8:1946 TTL:8720 Done > dns resolve4 example.com DNS response for example.com. - fd4c:9574:3720:2:0:0:5db8:d822 TTL:20456 Done
7. تبریک می گویم
تبریک میگوییم، شما با موفقیت یک روتر مرزی را با پشتیبانی NAT64 راهاندازی کردید و از آن برای دسترسی به اینترنت به دستگاههای پایانی Thread استفاده کردید!
در ادامه مطلب
- راهنمای OpenThread
- مرجع OpenThread CLI
- مرجع OpenThread API برای NAT64
- مرجع OpenThread API برای DNS بالادست
- انتزاع پلتفرم OpenThread برای DNS