İleti Dizisi Sınır Yönlendiricisi - Çift Yönlü IPv6 Bağlantısı ve DNS Tabanlı Hizmet Keşfi

1. Giriş

699d673d05a55535.png

İleti Dizisi Kenarlık Yönlendirici nedir?

Thread, IP'ye dayalı ve düşük güçle çalışan kablosuz örgü ağ iletişimi protokolüdür. Bu şekilde, cihazlar arası ve cihazlar arası güvenli iletişimlere olanak tanır. İş parçacığı ağları, tek hata noktasını önlemek için topoloji değişikliklerine uyum sağlayabilir.

İş Parçacık Sınırlayıcı, bir İş Parçacığını Kablosuz veya Ethernet gibi diğer IP tabanlı ağlara bağlar. İleti dizisi ağının diğer ağlara bağlanması için Kenarlık Yönlendirici gerekir. İş parçacığı Kenarlık Yönlendirici'nin aşağıdaki işlevleri en az düzeyde desteklenir:

  • İş parçacığı ve kablosuz/Ethernet ağları arasında çift yönlü IP bağlantısı.
  • mDNS (Kablosuz/Ethernet bağlantısında) ve SRP (İleti dizisi ağında) aracılığıyla çift yönlü hizmet keşfi.
  • İş parçacığı bölümlerini IP tabanlı bağlantılar üzerinden birleştiren alt ağ üzerinden altyapı.
  • Kimlik doğrulama ve bir Thread ağına Thread cihazı ekleme için Harici İş Parçacığı Komisyonu (örneğin, cep telefonu).

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

Neler geliştireceksiniz?

Bu codelab'de İş Parçacık Sınır Yönlendiricisi kuracak ve cep telefonunuzu Sınır Yönlendirici üzerinden bir İş Parçacık Sonlandırma Cihazı'na bağlayacaksınız.

Neler öğreneceksiniz?

  • OTBR'yi ayarlama
  • OTBR ile İleti Dizisi ağı oluşturma
  • SRP özelliğiyle OpenThread CLI cihazı oluşturma
  • SRP ile hizmet kaydetme
  • İş parçacığı bitiş cihazını bulma ve cihaza erişme.

Gerekenler

  • Raspberry Pi 3/4 cihaz ve en az 8 GB kapasitesi olan bir SD kart.
  • 2 Nordic Semiconductor nRF52840 geliştirici kartları.
  • Yönlendiricide IPv6 Yönlendirici Reklam Koruyucusu etkin olmayan bir Kablosuz Erişim Noktası.
  • En az iOS 14 yüklü bir iOS telefon veya en az Android 8.1 yüklü Android telefon.

2. OTBR'yi ayarla

Raspberry Pi kurulumu

raspberrypi.org sitesindeki talimatları uygulayarak rpi-imager aracıyla yeni bir Raspberry Pi cihazı kurmak kolaydır (araçta en yeni Raspberry Pi OS yerine, indir 2021-05-07-raspios-buster-armhf-lite). Bu codelab'de cep telefonu adımlarını tamamlamak için Raspberry Pi'yi bir Kablosuz AP'ye bağlamanız gerekir. Kablosuz bağlantı kurmak için bu kılavuzu izleyin. SSH ile Raspberry Pi'ye giriş yapmak kolaydır. Talimatları burada bulabilirsiniz.

OTBR kodunu al

Raspberry Pi'nize giriş yapıp GitHub'dan ot-br-posix adlı cihazı klonlayın:

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

OTBR derleme ve yükleme

OTBR'nin önyükleme yapan ve İş Parçacık Kenarlık Yönlendiricisi'ni kuran iki komut dosyası vardır:

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

OTBR, hem INFRA_IF_NAME ile belirtilen bir İş Parçacığı arayüzü hem de altyapı ağı arayüzü (ör. Kablosuz/Ethernet) ile çalışır. İş parçacığı arayüzü, OTBR'nin kendisi 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 olarak wlan0 değerine sahiptir. Raspberry Pi cihazınız bir Ethernet kablosuyla bağlı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)

RCP hizmetinin çalışması için otbr-agent hizmetinin etkin olmaması beklenir.

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

RCP donanım yazılımını derleme ve flash

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

Bir nRF52840 RCP cihazı derlemek ve yanıp sönmek için nRF52840 kartları ve OpenThreading ile laboratuvar ağı oluşturma codelab'inin 4. adımını uygulayın:

$ script/build nrf52840 USB_trans

OTBR'yi başlat ve durumu doğrula

nRF52840 kartını Raspberry Pi'ye bağlayın ve 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. İleti dizisi ağı oluşturma

otbr-agent hizmetini kontrol etmek için kullanılabilecek bir ot-ctl komutu vardır. ot-ctl, tüm OpenThread CLI komutlarını kabul eder. Daha fazla ayrıntı için OpenThread CLI Kılavuzu'na bakın.

OTBR ile bir Mesaj Dizisi 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 leader Mesaj Dizisi olarak davrandığını ve Mesaj Dizisi Ağ Verilerinde off-mesh-routable (OMR) öneki olduğunu görebilmelidir:

$ 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 İstemcisi Son Cihazı Kurulumu

OT KSA'sını derleyip flash

Bir nRF52840 CLI uç cihazı oluşturmak ve yanıp sönmek için nRF52840 kartları ve OpenThreading ile iş parçacığı ağı oluşturma codelab'inin 5. adımını uygulayın.

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

Bu nedenle, tam derleme çağrısı aşağıdaki gibi 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 İş Parçacığının ağına katılmak için OTBR cihazından Aktif Operasyonel Veri Kümesini almamız gerekir. otbr-agent komut satırına geri dönelim ve etkin veri kümesini alalım:

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

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

> dataset set active 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff
Done

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

> ifconfig up
Done
> thread start
Done

Birkaç saniye bekleyin ve İleti Dizisi ağına katılmanın 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'de basılı olanla eşleştiğinden emin olun. Artık OTBR'nin OMR adresine ping gönderebiliriz:

> 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'da DNS-SD hizmeti yayınlamak için yaygın şekilde kullanılmaktadır. Ancak çok noktaya yayın mesajları çok fazla bant genişliği tüketir ve düşük güç tüketen cihazların pilini hızla tüketir. İş parçacığı, hizmetlerini Sınır Yönlendirici'ye kaydetmek için tek noktaya yayın SRP protokolünü kullanır ve kablosuz veya Ethernet bağlantısında hizmetlerin reklamını yapmak için Sınır Yönlendirici'yi kullanır.

srp client komutuyla bir hizmet kaydedebiliriz.

SRP istemcisi 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 bir İş Parçacığı bitiş cihazına ulaşması için bitiş cihazın OMR adresinin reklamının yapılması gerekir:

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

Son olarak, sahte bir _ipps._tcp hizmeti kaydedin:

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

Birkaç saniye bekleyin. Hizmetin kaydedildiğini görebiliriz:

> 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 ve _ipps._tcp hizmetinin, kablosuz ağ/Ethernet bağlantısında tanıtılmış olması gerekiyor. Şimdi bitiş cihazını keşfedip onlara ulaşma zamanı!

6. Hizmeti Keşfedin

Hizmeti cep telefonuyla keşfetme

54a136a8940897cc.png

Android telefonla mDNS hizmetlerini keşfetmek için Hizmet Tarayıcı Uygulamasını kullanırız. iOS mobil cihazlar için eşdeğer bir Uygulama da bulunur. Uygulamayı açtığınızda _ipps._tcp hizmeti hemen görünecektir.

Hizmeti bir Linux ana makinesiyle keşfedin

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

avahi-daemon ve avahi-utils'nu yükleyin:

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

Hizmeti çözümleme:

$ 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 barındırıcısıyla keşfetme

Hizmeti çözmek için macOS'te dns-sd adresini 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 ping gönderme

Örnek olarak Pixel telefonu ele alalım. Daha önce kaydedilmiş hizmetin "ot-service"inin OMR adresini, Service Browser App'taki hizmet örneğinin ayrıntılar sayfasında bulabiliriz.

bb992962e68d250b.png 888daa1df1e1a9bf.png

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

Maalesef Ağ Analizcisi Uygulamasının Android sürümü, ping yardımcı programı için mDNS sorgularını desteklemez ve ot-host.local ana makine adını doğrudan pingleyemeyiz (ana makine adını Uygulamanın iOS sürümüyle pingleyebiliriz).

Linux/macOS ana makinesinden ping gönderme

İş Parçacığı Kenarlık Yönlendiricisi, kablosuz bağlantı/Ethernet bağlantısında öneklerin (Önek Bilgileri Seçeneği ile) ve rotaların (Rota Bilgileri Seçeneği ile) tanıtılması için ICMPv6 Yönlendirici Reklamları'nı (RA) gönderir.

Linux ana makinesini hazırlama

Barındırıcınızda RA ve RIO'nun etkinleştirildiğinden emin olmak ö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 ayarlanı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 değerini 0 geçersiz kılar). accept_ra değerini şunlarla kontrol edebilirsiniz:

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

Ayrıca, değeri 1 (veya IP yönlendirmesi etkinleştirilmişse 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ı için accept_ra_rt_info_max_plen seçeneği varsayılan olarak 0 değerine ayarlıdır. 64 değerine ayarlanır.

$ 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 değişiklik kaybolacak. Örneğin, RIO'yu kalıcı olarak etkinleştirmek için aşağıdaki komutları /etc/sysctl.conf öğesine ekleyin:

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

OTBR zaten RA iletileri gönderiyor olduğundan ve iki istenmeyen RA iletisi arasındaki aralık birkaç saniye olabileceğinden, bu yapılandırmaları değiştirmek için çok geç olabilir. Bunun bir yolu, Yönlendirici Talebi verilerini göndermek amacıyla APBR'nin istenen RA'lar ile yanıt vermesi için kablosuz erişim noktasının bağlantısını kesip yeniden bağlanmaktır. Diğer bir seçenek de Sınır Yönlendirici'deki Kenarlık 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 öğesinin kullanılmadığından emin olun. dhcpcd, arayüz her yeniden başlatıldığında her zaman accept_ra seçeneğini geçersiz kılar ve accept_ra yapılandırmanız kaybolur. dhcpcd'de 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 yeniden başlatmanız gerekir.

macOS ana makinesi hazırlama

Her iki accept_ra* seçeneği de varsayılan olarak etkindir, ancak sisteminizi en azından macOS Big Sur'a yükseltmeniz gerekir.

Ana makine adını veya IPv6 adresini pingleme

Artık ping -6 ana makine adına (macOS için ping6) ot-host.local ana makine adını 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, "Name or service not known" hatasına sahip Linux ana makinelerinde başarısız olabilir. Bunun nedeni, ping komutunun mDNS sorgularıyla ot-host.local. adını çözümlememesidir. /etc/nsswitch.conf uygulamasını açın ve hosts ile başlayan satıra mdns6_minimal değerini ekleyin:

hosts:          files mdns4_minimal mdns6_minimal dns

Elbette, istediğiniz zaman IPv6 adresini doğrudan pingleyebilirsiniz:

$ 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. Cihazı Sona Erdirme Hizmeti

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

> srp client host remove
Done

_ipps._tcp hizmetini artık keşfedemezsiniz.

9. Tebrikler

Tebrikler! OTBR'yi, İş Parçacığı bitiş cihazları için çift yönlü IP bağlantısı ve hizmet keşfi sağlamak amacıyla İş Ortağı 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 dokümanlar