İş Parçacığı Sınır Yönlendirici - İki Yönlü IPv6 Bağlantısı ve DNS Tabanlı Hizmet Keşfi

1. Giriş

699d673d05a55535.png

İş Parçacığı Kenarlığı Yönlendirici nedir?

Thread, cihazlar arasında ve cihazlar arasında güvenli iletişim kurulmasına olanak tanıyan IP tabanlı, düşük güçlü bir kablosuz örgü ağ protokolüdür. Thread ağları, tek hata noktasını önlemek için topoloji değişikliklerine uyum sağlayabilir.

İş Parçacığı Sınır Yönlendiricisi, bir Thread ağını kablosuz veya Ethernet gibi IP tabanlı diğer ağlara bağlar. Thread ağı, diğer ağlara bağlanmak için Sınır Yönlendirici gerektirir. İş Parçacığı Kenarlığı Yönlendiricisi en az aşağıdaki işlevleri destekler:

  • Thread ve kablosuz/Ethernet ağları arasında çift yönlü IP bağlantısı.
  • mDNS (kablosuz/Ethernet bağlantısında) ve SRP (Thread ağında) üzerinden çift yönlü hizmet keşfi.
  • İş parçacığı bölümlerini IP tabanlı bağlantılar üzerinden birleştiren iş parçacığı üzerinden altyapı.
  • Thread cihazının kimliğini doğrulamak ve cihazı bir Thread ağına eklemek için harici Threading (ör. cep telefonu) kullanma.

Google tarafından yayınlanan OpenThread Sınır Yönlendirici (OTBR), Thread Kenarlık Yönlendirici'nin açık kaynaklı bir uygulamasıdır.

Oluşturacaklarınız

Bu codelab'de, İş Parçacığı Yönlendirici'yi kuracak ve cep telefonunuzu Sınır Yönlendirici yoluyla bir Thread End Device'a bağlayacaksınız.

Neler öğreneceksiniz?

  • OTBR nasıl ayarlanır?
  • OTBR ile Thread ağı oluşturma
  • SRP özelliğiyle OpenThread CLI cihazı oluşturma
  • SRP'ye hizmet kaydetme
  • Thread bitiş cihazını bulma ve bu cihazlara erişme

Gerekenler

  • Raspberry Pi 3/4 cihaz ve en az 8 GB özellikli bir SD kart.
  • 2 Nordic Semiconctionor nRF52840 geliştirici kartı.
  • Yönlendiricide IPv6 Yönlendirici Reklam Koruması'nın etkinleştirilmediği bir Wi-Fi AP.
  • En az iOS 14 yüklü bir iOS telefon veya en az Android 8.1 yüklü Android telefon.

2. OTBR'yi kur

Raspberry Pi'yi kurun

raspberrypi.org adresindeki talimatları uygulayarak rpi-imager aracıyla yeni bir Raspberry Pi cihazı kurmak kolaydır (araçtaki en son Raspberry Pi OS'yi kullanmak yerine 2021-05-07-raspios-buster-armhf-lite uygulamasını kendiniz indirebilirsiniz). Bu codelab'deki cep telefonu adımlarını tamamlamak için Raspberry Pi'yi kablosuz erişim noktasına bağlamanız gerekir. Kablosuz bağlantıyı kurmak için bu rehberi uygulayın. SSH ile Raspberry Pi'ye giriş yapmak kolaydır. Talimatları burada bulabilirsiniz.

OTBR kodunu al

Raspberry Pi'nıza giriş yapın ve GitHub'dan ot-br-posix dosyasını klonlayın:

$ git clone https://github.com/openthread/ot-br-posix.git --depth 1

OTBR'yi oluşturma ve yükleme

OTBR, önyükleme yapan ve İş Parçacığı Kenarlığı Yönlendirici'yi ayarlayan iki komut dosyasına sahiptir:

$ cd ot-br-posix
$ ./script/bootstrap
$ INFRA_IF_NAME=wlan0 ./script/setup

OTBR, INFRA_IF_NAME ile belirtilen hem Thread arayüzünde hem de altyapı ağ arayüzünde (ör. Wi-Fi/Ethernet) çalışır. Thread arayüzü, OTBR tarafından oluşturulur ve varsayılan olarak wpan0 olarak adlandırılır. INFRA_IF_NAME açıkça belirtilmediği takdirde altyapı arayüzü varsayılan değeri olan wlan0 olur. Raspberry Pi'niz ethernet kablosuyla bağlandıysa Ethernet arayüz adını belirtin (ör. eth0):

$ INFRA_IF_NAME=eth0 ./script/setup

OTBR'nin başarıyla yüklenip yüklenmediğini kontrol edin:

$ sudo service otbr-agent status
● otbr-agent.service - Border Router Agent
   Loaded: loaded (/lib/systemd/system/otbr-agent.service; enabled; vendor preset: enabled)
   Active: activating (auto-restart) (Result: exit-code) since Mon 2021-03-01 05:43:38 GMT; 2s ago
  Process: 2444 ExecStart=/usr/sbin/otbr-agent $OTBR_AGENT_OPTS (code=exited, status=2)
 Main PID: 2444 (code=exited, status=2)

Çalışması için RCP çipi gerektiğinden otbr-agent hizmetinin etkin olmaması beklenir.

Değişikliklerin geçerli olması için Raspberry Pi'yi yeniden başlatın.

RCP donanım yazılımı geliştirme ve güncelleme

OTBR, Radyo Ortak İşlemci (RCP) modunda 15,4 radyo çipini destekler. Bu modda, OpenThread yığını ana makine tarafında çalışır ve kareleri IEEE802.15.4 alıcı-verici üzerinden iletir/alır.

Bir nRF52840 RCP cihazı derlemek ve yüklemek için nRF52840 anakartları ve OpenThread ile Thread ağı oluşturma codelab'i ile ilgili 4. adımı uygulayın:

$ script/build nrf52840 USB_trans

OTBR'yi başlatın ve durumu doğrulayın

nRF52840 kartını Raspberry Pi'nıza bağlayıp otbr-agent hizmetini başlatın:

$ sudo service otbr-agent restart

otbr-agent hizmetinin etkin olduğunu doğrulayın:

$ sudo service otbr-agent status
● otbr-agent.service - Border Router Agent
   Loaded: loaded (/lib/systemd/system/otbr-agent.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2021-03-01 05:46:26 GMT; 2s ago
 Main PID: 2997 (otbr-agent)
    Tasks: 1 (limit: 4915)
   CGroup: /system.slice/otbr-agent.service
           └─2997 /usr/sbin/otbr-agent -I wpan0 -B wlan0 spinel+hdlc+uart:///dev/ttyACM0

Mar 01 05:46:26 raspberrypi otbr-agent[2997]: Stop publishing service
Mar 01 05:46:26 raspberrypi otbr-agent[2997]: [adproxy] Stopped
Mar 01 05:46:26 raspberrypi otbr-agent[2997]: PSKc is not initialized
Mar 01 05:46:26 raspberrypi otbr-agent[2997]: Check if PSKc is initialized: OK
Mar 01 05:46:26 raspberrypi otbr-agent[2997]: Initialize OpenThread Border Router Agent: OK
Mar 01 05:46:26 raspberrypi otbr-agent[2997]: Border router agent started.
Mar 01 05:46:26 raspberrypi otbr-agent[2997]: [INFO]-CORE----: Notifier: StateChanged (0x00038200) [NetData PanId NetName ExtPanId]
Mar 01 05:46:26 raspberrypi otbr-agent[2997]: [INFO]-PLAT----: Host netif is down

3. Thread ağı oluşturma

otbr-agent hizmetini kontrol etmek için kullanılabilecek bir ot-ctl komutu bulunur. ot-ctl tüm OpenThread CLI komutlarını kabul eder. Ayrıntılı bilgi için OpenThread CLI Guide (OpenThread CLI Kılavuzu) bölümüne bakın.

OTBR ile bir Thread ağı oluşturun:

$ sudo ot-ctl dataset init new
Done
$ sudo ot-ctl dataset commit active
Done
$ sudo ot-ctl ifconfig up
Done
$ sudo ot-ctl thread start
Done

Birkaç saniye bekleyin. OTBR'nin bir İş Parçacığı leader olarak çalıştığını ve Thread Ağ Verilerinde off-mesh-routable (OMR) öneki olduğunu görebiliriz:

$ sudo ot-ctl state
leader
Done
$ 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

4. SRP İstemci Son Cihazını Kurma

OT KSA'yı oluşturma ve güncelleme

Bir nRF52840 CLI son cihazı derlemek ve yüklemek için nRF52840 anakartları ve OpenThread ile Thread ağı oluşturma codelab'i ile ilgili 5. adımı uygulayın.

Ancak CLI düğümü, OT_COMMISSIONER ve OT_JOINER özelliklerini etkinleştirmek yerine OT_SRP_CLIENT ve OT_ECDSA özelliklerini gerektirir.

Dolayısıyla, tam derleme çağrısı şu şekilde görünmelidir:

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

OTBR ağına katılın

otbr-agent hizmeti tarafından oluşturulan Thread ağına katılmak için OTBR cihazından Etkin Operasyonel Veri Kümesi almamız gerekir. otbr-agent komut satırına geri dönüp etkin veri kümesini elde edelim:

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

SRP istemci düğüm ekranı oturumuna dönün ve etkin veri kümesini ayarlayın:

> dataset set active 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff
Done

Ardından, Thread arayüzünü başlatın:

> ifconfig up
Done
> thread start
Done

Birkaç saniye bekleyin ve Thread ağına katılma işleminin başarılı olup olmadığını doğrulayın:

> 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

Ağ verilerinin OTBR üzerinde basılı olan veriyle eşleştiğinden emin olun. Artık OTBR'nin OMR adresini pingleyebiliriz:

> 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

5. Hizmeti Son Cihazda Yayınlama

mDNS, link-local üzerinde DNS-SD hizmetini yayınlamak için yaygın olarak kullanılmaktadır. Ancak çoklu yayın mesajları çok fazla bant genişliği kullanır ve güç seviyesi düşük olan cihazların pilini hızlı bir şekilde tüketir. Thread, hizmetlerini Sınır Yönlendirici'ye kaydetmek için tek yayın SRP protokolünü kullanır ve hizmetlerin reklamını kablosuz ağ veya Ethernet bağlantısı üzerinden yapmak için Sınır Yönlendirici'den yararlanır.

srp client komutuyla bir hizmeti kaydedebiliriz.

SRP istemci düğüm ekranı oturumuna gidin ve SRP istemcisini otomatik olarak başlatın:

> srp client autostart enable
Done

Kablosuz/Ethernet bağlantısında reklamı yapılacak ana makine adını ayarlayın:

> srp client host name ot-host
Done

Kablosuz/Ethernet bağlantısındaki bir cihazın Thread uç cihazına ulaşması için son cihazın OMR adresinin tanıtılması gerekir:

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

Sonunda sahte bir _ipps._tcp hizmeti kaydettirin:

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

Birkaç saniye bekleyin, hizmetin kayıtlı olduğunu görebileceğiz:

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

Tüm kurulum işlemlerini tamamladık. Kablosuz/Ethernet bağlantısı üzerinden _ipps._tcp hizmetinin reklamı yapılmış olmalı. Şimdi son cihazı keşfetmenin ve ona ulaşmanın zamanı geldi.

6. Hizmeti Keşfetme

Hizmeti cep telefonuyla keşfedin

54a136a8940897cc.png

Android telefonla mDNS hizmetlerini keşfetmek için Hizmet Tarayıcısı uygulamasını kullanırız. Bu uygulama, iOS mobil cihazlar için de eşdeğer bir uygulama bulunabilir. Uygulamayı açtığınızda _ipps._tcp hizmeti görünecektir.

Linux ana makinesiyle hizmeti keşfedin

Hizmeti başka bir Linux ana makinesinden keşfetmek isterseniz avahi-browse komutunu kullanabilirsiniz.

avahi-daemon ve avahi-utils uygulamalarını yükleyin:

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

Hizmeti çözün:

$ 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 = []
...

Hizmeti macOS ana makinesiyle keşfetme

Hizmeti çözmek için macOS'te dns-sd aracını kullanabilirsiniz:

$ 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     ""
...

7. Son cihazı pingleme

Cep telefonundan pingleme

Örneğin Pixel telefonu ele alalım. Daha önce kaydedilmiş olan "ot-service" hizmetinin OMR adresini bulabiliriz. kullanın.

bb992962e68d250b.png 888daa1df1e1a9bf.png

Artık OMR adresini başka bir Network Analyzer Uygulaması ile pingleyebiliriz.

Maalesef Network Analyzer Uygulaması'nın Android sürümü, ping yardımcı programı için mDNS sorgularını desteklememektedir ve bu nedenle ot-host.local ana makine adını doğrudan pingleyemiyoruz (ana makine adını, Uygulamanın iOS sürümüyle pingleyebiliriz).

Linux/macOS ana makinesinden pingleme

İş Parçacığı Kenarlığı Yönlendirici, Wi-Fi/Ethernet bağlantısı üzerindeki ön ekleri (Ön Ek Bilgileri Seçeneği aracılığıyla) ve rotaları (Rota Bilgisi Seçeneği aracılığıyla) tanıtmak için ICMPv6 Yönlendirici Reklamları (RA) gönderir.

Linux ana makinesini hazırlama

Barındırıcınızda RA ve RIO'nun etkinleştirildiğinden emin olmanız önemlidir:

  1. IP yönlendirme etkin değilse net.ipv6.conf.wlan0.accept_ra en az 1, aksi takdirde 2 olmalıdır.
  2. net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen, 64 değerinden küçük olmamalıdır.

accept_ra, çoğu dağıtım için varsayılan olarak 1 değerine ayarlıdır. Ancak bu seçeneği geçersiz kılacak başka ağ arka plan programları olabilir (örneğin, Raspberry Pi'deki dhcpcd, accept_ra ile 0 değerini geçersiz kılar). accept_ra değerini şununla kontrol edebilirsiniz:

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

Ayrıca değeri şu şekilde 1 (veya IP yönlendirmenin etkin olması durumunda 2) olarak ayarlayın:

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

Çoğu Linux dağıtımında accept_ra_rt_info_max_plen seçeneği varsayılan olarak 0 şeklindedir. Aşağıdakilerle, bu seçeneği 64 olarak ayarlayın:

$ 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

Ana makine yeniden başlatıldıktan sonra bu değişiklik kaybolur. Örneğin, RIO'yu kalıcı olarak etkinleştirmek için /etc/sysctl.conf öğesine aşağıdaki komutları ekleyin:

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

OTBR zaten RA mesajları gönderiyor olduğundan ve istenmeyen iki RA mesajı arasındaki zaman aralığı birkaç yüz saniye olabileceğinden, bu yapılandırmaları değiştirmek için çok geç olabilir. Bunun bir yolu, Kablosuz erişim noktasının bağlantısını kesip yeniden bağlanarak Yönlendirici İstek mesajları göndermektir. Böylece OTBR istenen RA'larla yanıt verir. Diğer bir seçenek de Sınır Yönlendirici'de Sınır Yönlendirme işlevini yeniden başlatmaktır:

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

Kablosuz ağa yeniden bağlanmaya veya Ethernet arayüzünü yeniden başlatmaya çalışıyorsanız kablosuz/Ethernet IPv6 ağınızı yönetmek için dhcpcd parametresinin kullanılmadığından emin olun. dhcpcd, arayüz her yeniden başlatıldığında accept_ra seçeneğini her zaman geçersiz kılar ve accept_ra yapılandırmanız kaybolur. dhcpcd biçiminde IPv6'yı açıkça devre dışı bırakmak için dhcpcd yapılandırma dosyasına (ör. /etc/dhcpcd.conf) aşağıdaki satırları ekleyin:

noipv6
noipv6rs

Değişikliğin geçerli olması için cihazı yeniden başlatmanız gerekir.

macOS ana makinesini hazırlama

Her iki accept_ra* seçeneği de varsayılan olarak etkindir ancak sisteminizi en az macOS Big Sur sürümüne yükseltmeniz gerekir.

Ana makine adını veya IPv6 adresini pingleme

Artık ot-host.local ana makine adını ping -6 komutuyla (macOS için ping6) pingleyebiliriz:

$ 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
...

Bu komut, Linux ana makinelerinde "Name or service not known" hatası vererek başarısız olabilir. Bunun nedeni, ping komutunun ot-host.local. adını mDNS sorgularıyla çözümlememesidir. /etc/nsswitch.conf öğesini açın ve hosts ile başlayan satıra mdns6_minimal ekleyin:

hosts:          files mdns4_minimal mdns6_minimal dns

Elbette, IPv6 adresine her zaman doğrudan ping gönderebilirsiniz:

$ 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
...

8. Son Cihaz Hizmeti Yayından Kaldırın

SRP istemci düğümünden kayıtlı adresi ve hizmeti kaldırmak için:

> srp client host remove
Done

_ipps._tcp hizmetini şu anda görülememeniz gerekir.

9. Tebrikler

Tebrikler, Thread uç cihazları için çift yönlü IP bağlantısı ve hizmet keşfi sağlamak üzere OTBR'yi İş Parçacığı Sınır Yönlendiricisi olarak başarıyla ayarladınız.

Sırada ne var?

Bu codelab'lerden bazılarına göz atın...

Referans belgeler