נתב Thread Border - קישוריות IPv6 דו-כיוונית וגילוי שירות מבוסס-DNS

1. מבוא

699d673d05a55535.png

מה זה Thread?

‫Thread הוא פרוטוקול רשת אלחוטית מבוסס-IP שצורכת מעט חשמל, ומאפשרת תקשורת מאובטחת בין מכשירים ובין מכשירים לענן. רשתות Thread יכולות להתאים את עצמן לשינויים בטופולוגיה כדי להימנע מכשל בנקודה אחת.

מה זה OpenThread?

OpenThread שפורסם על ידי Google הוא הטמעה בקוד פתוח של Thread®.

מהו נתב גבולות לפרוטוקול Thread?

נתב גבולות עם פרוטוקול Thread מחבר רשת עם פרוטוקול Thread לרשתות אחרות שמבוססות על IP, כמו Wi-Fi או אתרנט. כדי להתחבר לרשתות אחרות, רשת עם פרוטוקול Thread צריכה נתב גבולות. נתב גבולות עם פרוטוקול Thread תומך לכל הפחות בפונקציות הבאות:

  • קישוריות IP דו-כיוונית בין רשתות Thread ו-Wi-Fi/Ethernet.
  • זיהוי שירותים דו-כיווני באמצעות mDNS (בקישור Wi-Fi/Ethernet) ו-SRP (ברשת Thread).
  • פרוטוקול Thread-over-infrastructure שמאחד מחיצות של Thread באמצעות קישורים מבוססי-IP.
  • הפעלה חיצונית של מכשיר Thread (לדוגמה, טלפון נייד) כדי לאמת ולהצטרף למכשיר Thread ברשת Thread.

OpenThread Border Router‏ (OTBR) שפורסם על ידי Google הוא הטמעה בקוד פתוח של נתב גבולות עם פרוטוקול Thread.

מה תפַתחו

ב-codelab הזה תגדירו נתב גבולות לפרוטוקול Thread ותחברו את הטלפון הנייד למכשיר קצה לפרוטוקול Thread באמצעות נתב הגבולות.

מה תלמדו

  • איך מגדירים OTBR
  • איך יוצרים רשת Thread באמצעות OTBR
  • איך יוצרים מכשיר OpenThread CLI עם תכונת ה-SRP
  • איך רושמים שירות ב-SRP
  • איך מאתרים מכשיר קצה של Thread ויוצרים איתו קשר

מה נדרש

  • תחנת עבודה של Linux, ליצירה ולהפעלה של Thread RCP,‏ OpenThread CLI ובדיקה של IPv6 multicast.
  • ‫Raspberry Pi לנתב הגבולות עם פרוטוקול Thread.
  • ‫2 מתאמי USB של Nordic Semiconductor nRF52840 (אחד ל-RCP ואחד למכשיר הקצה של Thread).
  • טלפון iOS עם iOS 14 ומעלה או טלפון Android עם Android 8.1 ומעלה.

2. הגדרת 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

3. הגדרת מכשיר קצה של לקוח SRP

פיתוח והפעלה של OT CLI

פועלים לפי שלב 5 ב-codelab Build a Thread network with nRF52840 boards and OpenThread כדי ליצור ולהפעיל מכשיר קצה nRF52840 CLI.

אבל במקום להפעיל את OT_COMMISSIONER ו-OT_JOINER, צומת ה-CLI דורש את התכונות OT_SRP_CLIENT ו-OT_ECDSA.

לכן, הקריאה המלאה ל-build צריכה להיראות כך:

$ 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 בקישור מקומי. אבל הודעות מרובות שידור צורכות יותר מדי רוחב פס ומרוקנות את הסוללה של מכשירים עם צריכת חשמל נמוכה במהירות. הפרוטוקול SRP מסוג unicast משמש את Thread כדי לרשום את השירותים שלו בנתב הגבול, והוא מסתמך על נתב הגבול כדי לפרסם את השירותים בקישור 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 עבור כלי הפינג, ואין לנו אפשרות לבצע פינג ישירות לשם המארח ot-host.local (אפשר לבצע פינג לשם המארח באמצעות הגרסה של האפליקציה ל-iOS).

פינג ממארח Linux/macOS

נתב הגבול של Thread שולח הודעות ICMPv6 Router Advertisements (RA) כדי לפרסם קידומות (באמצעות Prefix Information Option) ומסלולים (באמצעות Route Information Option) בקישור 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

ברוב הפצות Linux, האפשרות 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

השינוי יבוטל אחרי הפעלה מחדש של המארח. לדוגמה, כדי להפעיל את RIO באופן קבוע, מוסיפים את הפקודות הבאות ל-/etc/sysctl.conf:

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

יכול להיות שכבר מאוחר מדי לשנות את ההגדרות האלה, כי ה-OTBR כבר שולח הודעות RA, והמרווח בין שתי הודעות RA לא רצויות יכול להיות כמה מאות שניות. אחת הדרכים היא לנתק את הגישה ל-Wi-Fi ולחבר אותה מחדש כדי לשלוח הודעות Router Solicitation, כך ש-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.

מה השלב הבא?

כדאי לעיין בכמה מה-codelabs האלה…

מסמכי עזר