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

1. Giriş

699d673d05a55535.png

Thread nedir?

Thread, cihazdan cihaza ve cihazdan buluta güvenli iletişimi sağlayan, IP tabanlı düşük güçte kablosuz mesh ağ protokolüdür. Thread ağları, tek nokta hatalarını önlemek için topoloji değişikliklerine uyum sağlayabilir.

OpenThread nedir?

Google tarafından yayınlanan OpenThread, Thread®'in açık kaynaklı bir uygulamasıdır.

Thread sınır yönlendirici nedir?

Thread sınır yönlendirici, Thread ağını kablosuz veya Ethernet gibi diğer IP tabanlı ağlara bağlar. Thread ağının diğer ağlara bağlanması için sınır yönlendirici gerekir. Thread sınır yönlendirici en azından aşağıdaki işlevleri destekler:

  • Thread ve kablosuz ağ/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.
  • Thread bölümlerini IP tabanlı bağlantılar üzerinden birleştiren, altyapı üzerinden Thread.
  • Bir Thread cihazının kimliğini doğrulamak ve Thread ağına katmak için harici Thread devreye alma aracı (örneğin, cep telefonu)

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

Ne oluşturacaksınız?

Bu codelab'de bir Thread sınır yönlendirici kuracak ve mobil telefonunuzu sınır yönlendirici aracılığıyla bir Thread uç cihazına bağlayacaksınız.

Neler öğreneceksiniz?

  • OTBR'yi ayarlama
  • OTBR ile Thread ağı oluşturma
  • SRP özelliğiyle OpenThread CLI cihazı oluşturma
  • SRP'ye hizmet kaydetme
  • Thread uç cihazlarını keşfetme ve bunlara ulaşma

İhtiyacınız olanlar

  • Thread RCP, OpenThread CLI oluşturma ve yanıp sönme ve IPv6 çoklu yayını test etme için Linux iş istasyonu.
  • Thread sınır yönlendirici için Raspberry Pi.
  • 2 Nordic Semiconductor nRF52840 USB Dongle (bir tanesi RCP, bir tanesi de Thread uç cihazı için).
  • En az iOS 14 yüklü bir iOS telefon veya en az Android 8.1 yüklü bir Android telefon

2. OTBR'yi ayarlama

OTBR'yi ayarlamanın en hızlı yolu OTBR Kurulum Kılavuzu'nu takip etmektir.

OTBR kurulumu tamamlandıktan sonra, OTBR'nin Thread leader olarak çalıştığını doğrulamak için ot-ctl kullanın.

$ sudo ot-ctl state
leader
Done

Ayrıca OTBR'nin, Thread Ağı Verileri'nde otomatik olarak bir off-mesh-routable (OMR) öneki yapılandırdığını doğrulayın.

$ 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 İstemci Uç Cihazını Kurma

OT CLI'yı derleme ve flash'leme

nRF52840 CLI uç cihazı oluşturmak ve flashlamak için nRF52840 kartları ve OpenThread ile Thread ağı oluşturma adlı codelab'in5. adımını uygulayın.

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

Bu nedenle, derleme çağrısının tamamı şu şekilde görünmelidir:

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

Thread ağına katılma

Thread ağına katılmak için OTBR cihazından Active Operational Dataset'i almamız gerekir. ot-ctl'ya geri dönüp etkin veri kümesini alalım:

$ 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'de yazı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

4. Hizmeti Son Cihazda Yayınlama

mDNS, bağlantı yerelinde DNS-SD hizmeti yayınlamak için yaygın olarak kullanılmaktadır. Ancak çoklu yayın mesajları çok fazla bant genişliği tüketir ve düşük güçteki cihazların pilini hızlıca bitirir. Thread, hizmetlerini Border Router'a kaydetmek için tek noktaya yayın SRP protokolünü kullanır ve hizmetleri kablosuz ağ veya Ethernet bağlantısında yayınlamak için Border Router'a güvenir.

Bir hizmeti srp client komutuyla 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ı üzerinden bir Thread uç cihazına ulaşmak için uç cihazın OMR adresinin duyurulması 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. Kayıtlı hizmeti görebilirsiniz:

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

Tüm kurulum çalışmaları tamamlandı ve _ipps._tcp hizmetinin Wi-Fi/Ethernet bağlantısında reklamı yapılmış olmalıdır. Artık son cihaza ulaşma ve onu keşfetme zamanı!

5. Hizmeti Keşfetme

Hizmeti cep telefonuyla keşfetme

54a136a8940897cc.png

Android telefonda mDNS hizmetlerini keşfetmek için Service Browser uygulamasını kullanırız. iOS mobil cihazlar için de eşdeğer bir uygulama bulabilirsiniz. Uygulamayı açtığınızda hizmet _ipps._tcp gösterilir.

Linux ana makinesiyle hizmeti keşfetme

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

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

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

Hizmeti çözüme ulaştırı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 = []
...

macOS ana makinesiyle hizmeti keşfetme

Hizmeti çözmek için macOS'te dns-sd simgesini 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     ""
...

6. Son Cihaza Ping Gönderme

Cep telefonundan ping gönderme

Örneğin, Pixel telefonu ele alalım. Daha önce kaydedilmiş "ot-service" hizmetinin OMR adresini, Hizmet Tarayıcı Uygulamasındaki hizmet örneğinin ayrıntılar sayfasında bulabiliriz.

bb992962e68d250b.png 888daa1df1e1a9bf.png

Artık OMR adresine başka bir Network Analyzer uygulamasıyla ping gönderebiliriz.

Maalesef, Ağ Analizi Uygulaması'nın Android sürümü, ping yardımcı programı için mDNS sorgularını desteklemiyor ve ana makine adına ot-host.local doğrudan ping atamıyoruz (Uygulamanın iOS sürümüyle ana makine adına ping atabiliriz).

Linux/macOS ana makinesinden ping gönderme

Thread Border Router, Wi-Fi/Ethernet bağlantısında öneklerin (Önek Bilgisi Seçeneği aracılığıyla) ve rotaların (Rota Bilgisi Seçeneği aracılığıyla) reklamını yapmak için ICMPv6 Router Advertisements (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 olarak ayarlanır. Ancak bu seçeneği geçersiz kılacak başka ağ daemon'ları olabilir (örneğin, Raspberry Pi'deki dhcpcd, accept_ra değerini 0 olarak geçersiz kılar). accept_ra değerini şu komutla kontrol edebilirsiniz:

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

Aşağıdaki komutla değeri 1 (veya IP yönlendirme etkinse 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'dir. Aşağıdaki komutla 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

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

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

OTBR, RA mesajları göndermeye başladığı ve iki istenmeyen RA mesajı arasındaki aralık birkaç yüz saniye olabileceği için bu yapılandırmaları değiştirmek için çok geç olabilir. Bir yöntem, OTBR'nin istenen RA'larla yanıt vermesi için yönlendirici talebi mesajları göndermek üzere kablosuz ağ erişim noktasıyla bağlantıyı kesip yeniden bağlamaktır. Diğer bir seçenek de sınır yönlendiricide sınır yönlendirme işlevini yeniden başlatmaktır:

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

Kablosuz bağlantıyı yeniden bağlamaya veya Ethernet arayüzünü yeniden başlatmaya çalışıyorsanız dhcpcd'nin kablosuz/Ethernet IPv6 ağınızı yönetmek için kullanılmadığından emin olun. Çünkü 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'de IPv6'yı açıkça devre dışı bırakmak için aşağıdaki satırları dhcpcd yapılandırma dosyasına (ör. /etc/dhcpcd.conf) ekleyin:

noipv6
noipv6rs

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

macOS ana makinesini hazırlama

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

Ana makine adını veya IPv6 adresini ping'leyin.

Artık ot-host.local ana makine adına ping -6 komutuyla ping gönderebiliriz (macOS için ping6):

$ 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ıyla başarısız olabilir. Bunun nedeni, ping komutunun ot-host.local. adını mDNS sorgularıyla çözümlememesidir. /etc/nsswitch.conf dosyasını açın ve hosts ile başlayan satıra mdns6_minimal ifadesini ekleyin:

hosts:          files mdns4_minimal mdns6_minimal dns

Elbette, IPv6 adresine doğrudan ping de 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
...

7. Hizmetin Cihazda Yayınını Kaldırma

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

> srp client host remove
Done

Artık _ipps._tcp hizmetini keşfedememeniz gerekir.

8. Tebrikler

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

Sırada ne var?

Aşağıdaki codelab'lere göz atın:

Referans belgeleri