جهاز توجيه حدود مؤشر الترابط - إمكانية الاتصال ثنائي الاتجاه عبر IPv6 واكتشاف الخدمة المستندة إلى نظام أسماء النطاقات

1. مقدمة

699d673d05a55535.png

ما هو بروتوكول Thread؟

‫Thread هو بروتوكول شبكة لاسلكية منخفضة الطاقة مستند إلى بروتوكول الإنترنت (IP) ويتيح إجراء اتصالات آمنة بين الأجهزة وبين الأجهزة والسحابة الإلكترونية. يمكن أن تتكيّف شبكات Thread مع التغييرات في البنية لتجنُّب الأعطال في نقطة واحدة.

ما هي OpenThread؟

‫OpenThread، الذي أصدرته Google، هو تطبيق مفتوح المصدر لبروتوكول Thread®.

ما هو جهاز توجيه حدود شبكة Thread؟

يربط جهاز توجيه حدود شبكة Thread شبكة Thread بشبكات أخرى تستند إلى بروتوكول الإنترنت، مثل شبكة Wi-Fi أو إيثرنت. تتطلّب شبكة Thread جهاز توجيه حدود شبكة Thread للاتصال بالشبكات الأخرى. يجب أن يتيح جهاز توجيه حدود شبكة Thread الحد الأدنى من الوظائف التالية:

  • إمكانية الاتصال الثنائي الاتجاه عبر بروتوكول الإنترنت بين شبكات Thread وWi-Fi/Ethernet
  • اكتشاف الخدمات الثنائي الاتجاه من خلال mDNS (على رابط Wi-Fi/Ethernet) وSRP (على شبكة Thread).
  • بنية أساسية لبروتوكول Thread تدمج أقسام Thread عبر روابط مستندة إلى بروتوكول الإنترنت
  • تفعيل جهاز Thread خارجي (مثل هاتف جوّال) للمصادقة والانضمام إلى شبكة Thread

OpenThread Border Router (OTBR) الذي أصدرته Google هو تطبيق مفتوح المصدر لجهاز توجيه حدود شبكة Thread.

ما ستنشئه

في هذا الدرس العملي، ستتعرّف على كيفية إعداد جهاز توجيه حدود شبكة Thread وربط هاتفك الجوّال بجهاز طرفي لشبكة Thread من خلال جهاز توجيه الحدود.

أهداف الدورة التعليمية

  • كيفية إعداد OTBR
  • كيفية إنشاء شبكة Thread باستخدام OTBR
  • كيفية إنشاء جهاز OpenThread CLI باستخدام ميزة SRP
  • كيفية تسجيل خدمة باستخدام SRP
  • كيفية العثور على جهاز طرفي يعمل بنظام Thread والوصول إليه

المتطلبات

  • محطة عمل Linux لإنشاء وتثبيت Thread RCP وOpenThread CLI واختبار البث المتعدد IPv6
  • جهاز Raspberry Pi لجهاز توجيه حدود شبكة Thread
  • جهازان من Nordic Semiconductor nRF52840 USB Dongles (أحدهما لجهاز RCP والآخر لجهاز Thread النهائي)
  • هاتف iOS يعمل بالإصدار 14 أو الإصدارات الأحدث أو هاتف Android يعمل بالإصدار 8.1 أو الإصدارات الأحدث

2. إعداد OTBR

أسرع طريقة لإعداد OTBR هي اتّباع دليل إعداد OTBR.

بعد اكتمال عملية إعداد OTBR، استخدِم ot-ctl للتأكّد من أنّ OTBR يعمل كجهاز leader Thread.

$ 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

3- إعداد جهاز المستخدم النهائي لبرنامج SRP

إنشاء واجهة سطر الأوامر (CLI) وتثبيتها

اتّبِع الخطوة 5 من برنامج Build a Thread network with nRF52840 boards and OpenThread التدريبي لإنشاء جهاز طرفي nRF52840 CLI وتثبيت البرنامج عليه.

ولكن بدلاً من تفعيل OT_COMMISSIONER وOT_JOINER، تتطلّب عقدة واجهة سطر الأوامر الميزتَين 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

4. نشر الخدمة على الجهاز الطرفي

يتم استخدام mDNS على نطاق واسع لنشر خدمة DNS-SD على الرابط المحلي. لكن رسائل البث المتعدد تستهلك الكثير من معدل نقل البيانات وتستنزف البطارية في الأجهزة المنخفضة الطاقة بسرعة. تستخدم أجهزة Thread بروتوكول SRP أحادي الإرسال لتسجيل خدماتها لدى جهاز توجيه الحدود، وتعتمد على جهاز توجيه الحدود للإعلان عن الخدمات على رابط Wi-Fi أو Ethernet.

يمكننا تسجيل خدمة باستخدام الأمر srp client.

انتقِل إلى جلسة شاشة عقدة عميل SRP وابدأ تشغيل عميل SRP تلقائيًا:

> srp client autostart enable
Done

اضبط اسم المضيف الذي سيتم الإعلان عنه على رابط Wi-Fi/Ethernet:

> srp client host name ot-host
Done

لكي يتمكّن جهاز متصل بشبكة Wi-Fi أو Ethernet من الوصول إلى جهاز طرفي متصل بشبكة 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. حان الوقت لاكتشاف الجهاز النهائي والوصول إليه الآن.

5- استكشاف الخدمة

اكتشاف الخدمة باستخدام هاتف جوّال

54a136a8940897cc.png

نستخدم تطبيق Service Browser للعثور على خدمات mDNS باستخدام هاتف Android، ويمكن أيضًا العثور على تطبيق مكافئ لأجهزة iOS الجوّالة. افتح التطبيق وستظهر الخدمة _ipps._tcp.

اكتشاف الخدمة باستخدام مضيف Linux

إذا أردت اكتشاف الخدمة من مضيف Linux آخر، يمكنك استخدام الأمر 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     ""
...

6. إرسال إشارة إلى الجهاز النهائي

إرسال إشارة من هاتف جوّال

لنأخذ هاتف Pixel كمثال، يمكننا معرفة عنوان OMR للخدمة "ot-service" المسجّلة سابقًا في صفحة التفاصيل الخاصة بمثيل الخدمة في تطبيق "متصفّح الخدمات".

bb992962e68d250b.png 888daa1df1e1a9bf.png

يمكننا الآن إرسال طلب اختبار الاتصال إلى عنوان OMR باستخدام تطبيق آخر من تطبيقات Network Analyzer.

لا يتيح إصدار تطبيق Network Analyzer على Android طلبات mDNS لأداة ping، ولا يمكننا إرسال طلب ping إلى اسم المضيف ot-host.local مباشرةً (يمكننا إرسال طلب ping إلى اسم المضيف باستخدام إصدار التطبيق على iOS).

اختبار الاتصال من مضيف Linux أو macOS

يرسل جهاز توجيه حدود شبكة Thread إعلانات جهاز التوجيه ICMPv6 (RA) للإعلان عن البادئات (عبر خيار معلومات البادئة) والمسارات (عبر خيار معلومات المسار) على رابط Wi-Fi/Ethernet.

إعداد مضيف Linux

من المهم التأكّد من تفعيل RA وRIO على المضيف:

  1. يجب أن تكون قيمة net.ipv6.conf.wlan0.accept_ra هي 1 على الأقل إذا لم يتم تفعيل إعادة توجيه عناوين IP، و2 في حال تفعيلها.
  2. يجب ألا تكون قيمة net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen أقل من قيمة 64.

يتم ضبط قيمة accept_ra تلقائيًا على 1 في معظم التوزيعات. ولكن قد تكون هناك برامج خفية أخرى للشبكة ستتجاوز هذا الخيار (على سبيل المثال، سيتجاوز dhcpcd على Raspberry Pi الخيار accept_ra ليصبح 0). يمكنك التحقّق من قيمة accept_ra باستخدام:

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

اضبط القيمة على 1 (أو 2 في حال تفعيل إعادة توجيه عناوين IP) باستخدام:

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

يكون الخيار accept_ra_rt_info_max_plen في معظم توزيعات Linux مضبوطًا تلقائيًا على 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 وإعادة الاتصال بها لإرسال رسائل طلب جهاز التوجيه حتى يستجيب OTBR برسائل RA المطلوبة. يمكنك أيضًا إعادة تشغيل وظيفة "توجيه الحدود" على جهاز توجيه الحدود باتّباع الخطوات التالية:

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

إذا كنت تحاول إعادة الاتصال بشبكة Wi-Fi أو إعادة تشغيل واجهة إيثرنت، تأكَّد من عدم استخدام dhcpcd لإدارة شبكة IPv6 الخاصة بشبكة Wi-Fi أو إيثرنت. لأنّ 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
...

قد يتعذّر تنفيذ هذا الأمر على مضيفي Linux بسبب ظهور الخطأ "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
...

7. إنهاء نشر الخدمة على الأجهزة

لإزالة العنوان والخدمة المسجّلتَين من عقدة برنامج SRP:

> srp client host remove
Done

من المفترض ألا تتمكّن من العثور على خدمة _ipps._tcp الآن.

8. تهانينا

تهانينا، لقد نجحت في إعداد OTBR كجهاز توجيه حدود شبكة Thread لتوفير اتصال IP ثنائي الاتجاه واكتشاف الخدمة لأجهزة Thread الطرفية.

ما هي الخطوات التالية؟

يمكنك الاطّلاع على بعض دروس الترميز التطبيقية هذه...

المستندات المرجعية