Thread Border Router - اتصال IPv6 دوطرفه و کشف سرویس مبتنی بر DNS

۱. مقدمه

699d673d05a55535.png

نخ چیست؟

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

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

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

روتر حاشیه‌ای نخ چیست؟

یک روتر Thread Border، یک شبکه Thread را به سایر شبکه‌های مبتنی بر IP مانند Wi-Fi یا Ethernet متصل می‌کند. یک شبکه Thread برای اتصال به سایر شبکه‌ها به یک روتر Border نیاز دارد. یک روتر Thread Border حداقل از عملکردهای زیر پشتیبانی می‌کند:

  • اتصال IP دو طرفه بین شبکه‌های Thread و Wi-Fi/Ethernet.
  • کشف سرویس دو طرفه از طریق mDNS (روی لینک Wi-Fi/Ethernet) و SRP (روی شبکه Thread).
  • زیرساخت Thread-over که پارتیشن‌های Thread را روی لینک‌های مبتنی بر IP ادغام می‌کند.
  • راه‌اندازی Thread خارجی (به عنوان مثال، یک تلفن همراه) برای تأیید اعتبار و اتصال یک دستگاه Thread به شبکه Thread.

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

آنچه خواهید ساخت

در این کدلب، شما یک روتر مرزی ترد راه‌اندازی می‌کنید و تلفن همراه خود را از طریق روتر مرزی به یک دستگاه انتهای ترد متصل می‌کنید.

آنچه یاد خواهید گرفت

  • نحوه تنظیم OTBR
  • نحوه تشکیل شبکه Thread با OTBR
  • نحوه ساخت یک دستگاه OpenThread CLI با ویژگی SRP
  • نحوه ثبت سرویس در SRP
  • نحوه کشف و دسترسی به دستگاه انتهای Thread

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

  • یک ایستگاه کاری لینوکس، برای ساخت و فلش کردن RCP Thread، رابط خط فرمان OpenThread و آزمایش IPv6 multicast.
  • یک رزبری پای برای روتر مرزی Thread.
  • دو دانگل USB از شرکت Nordic Semiconductor به شماره nRF52840 (یکی برای RCP و یکی برای دستگاه Thread end).
  • یک گوشی iOS با حداقل iOS 14 یا یک گوشی اندرویدی با حداقل اندروید ۸.۱.

۲. تنظیم OTBR

سریع‌ترین راه برای راه‌اندازی OTBR، دنبال کردن راهنمای راه‌اندازی OTBR است.

پس از اتمام راه‌اندازی OTBR، ot-ctl برای تأیید اینکه OTBR به عنوان یک Thread leader عمل می‌کند، استفاده کنید.

$ sudo ot-ctl state
leader
Done

همچنین تأیید کنید که OTBR به طور خودکار یک پیشوند off-mesh-routable (OMR) را در داده‌های شبکه Thread پیکربندی کرده است.

$ sudo ot-ctl netdata show
Prefixes:
Prefixes:
fd76:a5d1:fcb0:1707::/64 paos med 4000
Routes:
fd49:7770:7fc5:0::/64 s med 4000
Services:
44970 5d c000 s 4000
44970 01 9a04b000000e10 s 4000
Done
$ sudo ot-ctl ipaddr      
fda8:5ce9:df1e:6620:0:ff:fe00:fc11
fda8:5ce9:df1e:6620:0:0:0:fc38
fda8:5ce9:df1e:6620:0:ff:fe00:fc10
fd76:a5d1:fcb0:1707:f3c7:d88c:efd1:24a9
fda8:5ce9:df1e:6620:0:ff:fe00:fc00
fda8:5ce9:df1e:6620:0:ff:fe00:4000
fda8:5ce9:df1e:6620:3593:acfc:10db:1a8d
fe80:0:0:0:a6:301c:3e9f:2f5b
Done

۳. دستگاه نهایی کلاینت SRP را تنظیم کنید

ساخت و فلش کردن OT CLI

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

اما به جای فعال بودن OT_COMMISSIONER و OT_JOINER ، گره CLI به ویژگی‌های OT_SRP_CLIENT و OT_ECDSA نیاز دارد.

بنابراین فراخوانی کامل ساخت باید به این شکل باشد:

$ script/build nrf52840 USB_trans -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON

به شبکه Thread بپیوندید

برای پیوستن به شبکه Thread، باید مجموعه داده‌های عملیاتی فعال را از دستگاه OTBR دریافت کنیم. بیایید به ot-ctl برگردیم و مجموعه داده‌های فعال را دریافت کنیم:

$ sudo ot-ctl dataset active -x
0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff
Done

به جلسه نمایش گره کلاینت SRP برگردید و مجموعه داده فعال را تنظیم کنید:

> dataset set active 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff
Done

سپس، رابط Thread را اجرا کنید:

> ifconfig up
Done
> thread start
Done

چند ثانیه صبر کنید و تأیید کنید که آیا پیوستن به شبکه Thread موفقیت‌آمیز است:

> state
child
Done
> netdata show
Prefixes:
fd76:a5d1:fcb0:1707::/64 paos med 4000
Routes:
fd49:7770:7fc5:0::/64 s med 4000
Services:
44970 5d c000 s 4000
44970 01 9a04b000000e10 s 4000
Done
> ipaddr
fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927
fda8:5ce9:df1e:6620:0:ff:fe00:4001
fda8:5ce9:df1e:6620:ed74:123:cc5d:74ba
fe80:0:0:0:d4a9:39a0:abce:b02e
Done

مطمئن شوید که داده‌های شبکه با داده‌های چاپ شده در OTBR مطابقت دارند. اکنون می‌توانیم آدرس OMR مربوط به OTBR را پینگ کنیم:

> ping fd76:a5d1:fcb0:1707:f3c7:d88c:efd1:24a9
Done
> 16 bytes from fd76:a5d1:fcb0:1707:f3c7:d88c:efd1:24a9: icmp_seq=1 hlim=64 time=49ms

۴. سرویس را در دستگاه نهایی منتشر کنید

mDNS به طور گسترده برای انتشار سرویس DNS-SD در لینک محلی استفاده شده است. اما پیام‌های چندپخشی پهنای باند زیادی مصرف می‌کنند و باتری دستگاه‌های کم‌مصرف را به سرعت خالی می‌کنند. Thread از پروتکل SRP تک‌پخشی برای ثبت سرویس‌های خود در Border Router استفاده می‌کند و برای تبلیغ سرویس‌ها در لینک Wi-Fi یا Ethernet به Border Router متکی است.

ما می‌توانیم یک سرویس را با دستور srp client ثبت کنیم.

به صفحه گره کلاینت SRP بروید و کلاینت SRP را به صورت خودکار شروع کنید:

> srp client autostart enable
Done

نام میزبانی که قرار است در لینک وای‌فای/اترنت نمایش داده شود را تنظیم کنید:

> srp client host name ot-host
Done

برای اینکه دستگاهی که روی لینک وای‌فای/اترنت قرار دارد به دستگاه انتهایی Thread دسترسی پیدا کند، آدرس OMR دستگاه انتهایی باید اعلان شود:

> srp client host address fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927
Done

در پایان، یک سرویس جعلی _ipps._tcp ثبت کنید:

> srp client service add ot-service _ipps._tcp 12345
Done

چند ثانیه صبر کنید تا بتوانیم سرویس ثبت شده را ببینیم:

> srp client service
instance:"ot-service", name:"_ipps._tcp", state:Registered, port:12345, priority:0, weight:0
Done

ما تمام کارهای راه‌اندازی را انجام داده‌ایم و سرویس _ipps._tcp باید روی لینک Wi-Fi/Ethernet نمایش داده می‌شد. حالا وقت آن است که دستگاه نهایی را پیدا کرده و به آن دسترسی پیدا کنیم!

۵. سرویس را کشف کنید

با یک تلفن همراه، سرویس را کشف کنید

54a136a8940897cc.png

ما از برنامه مرورگر سرویس برای کشف سرویس‌های mDNS با گوشی اندروید استفاده می‌کنیم، یک برنامه معادل نیز برای دستگاه‌های تلفن همراه iOS وجود دارد. برنامه را باز کنید و سرویس _ipps._tcp باید نمایش داده شود.

سرویس را با یک میزبان لینوکس کشف کنید

اگر می‌خواهید سرویس را از یک میزبان لینوکس دیگر پیدا کنید، می‌توانید از دستور avahi-browse استفاده کنید.

نصب avahi-daemon و avahi-utils :

$ sudo apt-get install -y avahi-daemon avahi-utils

حل مشکل سرویس:

$ sudo service avahi-daemon start # Ensure the avahi daemon is started.
$ avahi-browse -r _ipps._tcp
+ wlan0 IPv6 ot-service                                    Secure Internet Printer local
= wlan0 IPv6 ot-service                                    Secure Internet Printer local
   hostname = [ot-host.local]
   address = [fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927]
   port = [12345]
   txt = []
...

سرویس را با یک میزبان macOS کشف کنید

برای رفع مشکل سرویس می‌توانید dns-sd در macOS استفاده کنید:

$ dns-sd -Z _ipps._tcp local.
Browsing for _ipps._tcp.local.
DATE: ---Sun 14 Mar 2021---
21:31:42.125  ...STARTING...

; To direct clients to browse a different domain, substitute that domain in place of '@'
lb._dns-sd._udp                                 PTR     @

; In the list of services below, the SRV records will typically reference dot-local Multicast DNS names.
; When transferring this zone file data to your unicast DNS server, you'll need to replace those dot-local
; names with the correct fully-qualified (unicast) domain name of the target host offering the service.

_ipps._tcp                                      PTR     ot-service._ipps._tcp
ot-service._ipps._tcp                           SRV     0 0 12345 ot-host.local. ; Replace with unicast FQDN of target host
ot-service._ipps._tcp                           TXT     ""
...

۶. دستگاه انتهایی را پینگ کنید

پینگ از تلفن همراه

به عنوان مثال، گوشی پیکسل را در نظر بگیرید، می‌توانیم آدرس OMR سرویس قبلاً ثبت شده "ot-service" را در صفحه جزئیات نمونه سرویس در برنامه مرورگر سرویس پیدا کنیم.

bb992962e68d250b.png888daa1df1e1a9bf.png

اکنون می‌توانیم آدرس OMR را با یک برنامه تحلیلگر شبکه دیگر پینگ کنیم.

متأسفانه، نسخه اندروید برنامه Network Analyzer از درخواست‌های mDNS برای ابزار پینگ پشتیبانی نمی‌کند و ما نمی‌توانیم نام میزبان ot-host.local را مستقیماً پینگ کنیم (می‌توانیم نام میزبان را با نسخه iOS برنامه پینگ کنیم).

پینگ گرفتن از یک هاست لینوکس/مک او اس

روتر Thread Border، اعلان‌های روتر ICMPv6 (RA) را برای اعلان پیشوندها (از طریق گزینه اطلاعات پیشوند) و مسیرها (از طریق گزینه اطلاعات مسیر) روی لینک Wi-Fi/Ethernet ارسال می‌کند.

آماده سازی هاست لینوکس

مهم است که مطمئن شوید RA و RIO روی هاست شما فعال هستند:

  1. اگر ip forwarding فعال نباشد، net.ipv6.conf.wlan0.accept_ra باید حداقل 1 و در غیر این صورت 2 باشد.
  2. net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen نباید کوچکتر از 64 باشد.

مقدار پیش‌فرض accept_ra در اکثر توزیع‌ها 1 است. اما ممکن است سرویس‌های شبکه‌ی دیگری وجود داشته باشند که این گزینه را لغو کنند (برای مثال، dhcpcd در رزبری پای، accept_ra به 0 لغو می‌کند). می‌توانید مقدار accept_ra با دستور زیر بررسی کنید:

$ sudo sysctl -n net.ipv6.conf.wlan0.accept_ra
0

و مقدار را روی 1 (یا 2 در صورتی که IP forwarding فعال باشد) تنظیم کنید:

$ sudo sysctl -w net.ipv6.conf.wlan0.accept_ra=1
Net.ipv6.conf.wlan0.accept_ra = 1

گزینه accept_ra_rt_info_max_plen در اکثر توزیع‌های لینوکس به طور پیش‌فرض روی 0 است، آن را با دستور زیر روی 64 تنظیم کنید:

$ sudo sysctl -w net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen=64
net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen = 64

این تغییر پس از راه‌اندازی مجدد میزبان از بین خواهد رفت. برای مثال، دستورات زیر را به /etc/sysctl.conf اضافه کنید تا RIO به طور دائم فعال شود:

$ net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen = 64

ممکن است برای تغییر این تنظیمات خیلی دیر شده باشد زیرا OTBR قبلاً پیام‌های RA ارسال کرده است و فاصله بین دو پیام RA ناخواسته می‌تواند چند صد ثانیه باشد. یک راه این است که اتصال به Wi-Fi AP را قطع و دوباره وصل کنید تا پیام‌های درخواست روتر ارسال شود تا OTBR با RAهای درخواستی پاسخ دهد. گزینه دیگر راه‌اندازی مجدد عملکرد Border Routing در Border Router است:

$ sudo ot-ctl br disable
Done
$ sudo ot-ctl br enable
Done

اگر می‌خواهید وای‌فای را دوباره وصل کنید یا رابط اترنت را مجدداً راه‌اندازی کنید، مطمئن شوید که از dhcpcd برای مدیریت شبکه WiFi-/Ethernet IPv6 خود استفاده نمی‌کنید. زیرا dhcpcd همیشه گزینه accept_ra را هر بار که رابط راه‌اندازی مجدد می‌شود، لغو می‌کند و پیکربندی accept_ra شما از بین می‌رود. خطوط زیر را به فایل پیکربندی dhcpcd (مثلاً /etc/dhcpcd.conf ) اضافه کنید تا IPv6 را در dhcpcd به طور صریح غیرفعال کنید:

noipv6
noipv6rs

برای اعمال تغییر، باید دستگاه را مجدداً راه‌اندازی کنید.

آماده‌سازی میزبان macOS

هر دو گزینه accept_ra* به طور پیش‌فرض فعال هستند، اما شما باید سیستم خود را حداقل به macOS Big Sur ارتقا دهید.

پینگ کردن نام میزبان یا آدرس IPv6

اکنون می‌توانیم نام میزبان ot-host.local را با دستور ping -6 ( ping6 برای macOS) پینگ کنیم:

$ ping -6 ot-host.local.
PING ot-host.local.(fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927)) 56 data bytes
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=1 ttl=63 time=170 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=2 ttl=63 time=64.2 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=3 ttl=63 time=22.8 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=4 ttl=63 time=37.7 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=5 ttl=63 time=28.7 ms
...

این دستور ممکن است در میزبان‌های لینوکس با خطای "Name or service not known" با شکست مواجه شود. دلیل این امر این است که دستور ping نام ot-host.local. را با پرس‌وجوهای mDNS حل نمی‌کند. /etc/nsswitch.conf را باز کنید و mdns6_minimal را به خطی که با hosts شروع می‌شود اضافه کنید:

hosts:          files mdns4_minimal mdns6_minimal dns

البته، شما همیشه می‌توانید آدرس IPv6 را مستقیماً پینگ کنید:

$ ping -6 fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927
PING fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927(fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927) 56 data bytes
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=1 ttl=63 time=32.9 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=2 ttl=63 time=27.8 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=3 ttl=63 time=29.9 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=4 ttl=63 time=73.5 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=5 ttl=63 time=26.4 ms
...

۷. پایان دادن به انتشار سرویس توسط دستگاه

برای حذف آدرس و سرویس ثبت شده از گره کلاینت SRP:

> srp client host remove
Done

اکنون نباید بتوانید سرویس _ipps._tcp را پیدا کنید.

۸. تبریک

تبریک می‌گوییم، شما با موفقیت OTBR را به عنوان یک روتر Thread Border راه‌اندازی کردید تا اتصال IP دو طرفه و کشف سرویس را برای دستگاه‌های Thread end فراهم کند.

بعدش چی؟

به برخی از این آزمایشگاه‌های کد نگاهی بیندازید...

اسناد مرجع