Router Pembatas Thread - Konektivitas IPv6 Dua Arah dan Penemuan Layanan Berbasis DNS

1. Pengantar

699d673d05a55535.png

Apa itu Thread?

Thread adalah protokol jaringan mesh nirkabel berdaya rendah berbasis IP yang memungkinkan komunikasi perangkat-ke-perangkat dan perangkat-ke-cloud yang aman. Jaringan Thread dapat beradaptasi dengan perubahan topologi untuk menghindari kegagalan satu titik.

Apa itu OpenThread?

OpenThread yang dirilis oleh Google adalah implementasi open source Thread®.

Apa yang dimaksud dengan Router Pembatas Thread?

Router Pembatas Thread menghubungkan jaringan Thread ke jaringan berbasis IP lainnya, seperti Wi-Fi atau Ethernet. Jaringan Thread memerlukan Router Pembatas untuk terhubung ke jaringan lain. Router Pembatas Thread minimal mendukung fungsi berikut:

  • Konektivitas IP dua arah antara jaringan Thread dan Wi-Fi/Ethernet.
  • Penemuan layanan dua arah melalui mDNS (di link Wi-Fi/Ethernet) dan SRP (di jaringan Thread).
  • Thread-over-infrastructure yang menggabungkan partisi Thread melalui link berbasis IP.
  • Penyiapan Thread Eksternal (misalnya, ponsel) untuk mengautentikasi dan bergabung dengan perangkat Thread ke jaringan Thread.

OpenThread Border Router (OTBR) yang dirilis oleh Google adalah implementasi open source dari Thread Border Router.

Yang akan Anda build

Dalam codelab ini, Anda akan menyiapkan Router Pembatas Thread dan menghubungkan ponsel Anda ke Perangkat Akhir Thread melalui Router Pembatas.

Yang akan Anda pelajari

  • Cara menyiapkan OTBR
  • Cara membentuk jaringan Thread dengan OTBR
  • Cara membuat perangkat CLI OpenThread dengan fitur SRP
  • Cara mendaftarkan layanan dengan SRP
  • Cara menemukan dan menjangkau perangkat akhir Thread

Yang Anda butuhkan

  • Workstation Linux, untuk membuat dan mem-flash RCP Thread, OpenThread CLI, dan menguji multicast IPv6.
  • Raspberry Pi untuk router pembatas Thread.
  • 2 Dongle USB Nordic Semiconductor nRF52840 (satu untuk RCP dan satu untuk perangkat akhir Thread).
  • Ponsel iOS dengan minimal iOS 14 atau ponsel Android dengan minimal Android 8.1.

2. Menyiapkan OTBR

Cara tercepat untuk menyiapkan OTBR adalah dengan mengikuti Panduan Penyiapan OTBR.

Setelah penyiapan OTBR selesai, gunakan ot-ctl untuk memvalidasi bahwa OTBR bertindak sebagai leader Thread.

$ sudo ot-ctl state
leader
Done

Selain itu, validasi bahwa OTBR telah otomatis mengonfigurasi awalan off-mesh-routable (OMR) dalam Data Jaringan 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. Menyiapkan Perangkat Akhir Klien SRP

Bangun dan flash OT CLI

Ikuti langkah 5 codelab Membangun jaringan Thread dengan board nRF52840 dan OpenThread untuk membuat dan mem-flash perangkat akhir CLI nRF52840.

Namun, alih-alih mengaktifkan OT_COMMISSIONER dan OT_JOINER, node CLI memerlukan fitur OT_SRP_CLIENT dan OT_ECDSA.

Jadi, pemanggilan build lengkap akan terlihat seperti ini:

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

Bergabung ke jaringan Thread

Untuk bergabung dengan jaringan Thread, kita perlu mendapatkan Active Operational Dataset dari perangkat OTBR. Mari kembali ke ot-ctl dan dapatkan set data aktif:

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

Kembali ke sesi layar node klien SRP dan tetapkan set data aktif:

> dataset set active 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff
Done

Kemudian, mulai antarmuka Thread:

> ifconfig up
Done
> thread start
Done

Tunggu beberapa detik dan verifikasi apakah bergabung ke jaringan Thread berhasil:

> 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

Pastikan data jaringan cocok dengan yang tercetak di OTBR. Sekarang kita dapat melakukan ping ke alamat 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. Memublikasikan Layanan di Perangkat Akhir

mDNS telah banyak digunakan untuk memublikasikan layanan DNS-SD di link-local. Namun, pesan multicast menggunakan terlalu banyak bandwidth dan akan menghabiskan baterai perangkat berdaya rendah dengan cepat. Thread menggunakan protokol SRP unicast untuk mendaftarkan layanannya dengan Border Router dan mengandalkan Border Router untuk mengiklankan layanan di link Wi-Fi atau Ethernet.

Kita dapat mendaftarkan layanan dengan perintah srp client.

Buka sesi layar node klien SRP dan mulai otomatis klien SRP:

> srp client autostart enable
Done

Tetapkan nama host yang akan diiklankan di link Wi-Fi/Ethernet:

> srp client host name ot-host
Done

Agar perangkat di link Wi-Fi/Ethernet dapat menjangkau perangkat akhir Thread, alamat OMR perangkat akhir harus diiklankan:

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

Di akhir, daftarkan layanan _ipps._tcp palsu:

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

Tunggu beberapa detik dan kita akan dapat melihat layanan yang terdaftar:

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

Kita telah menyelesaikan semua pekerjaan penyiapan dan layanan _ipps._tcp seharusnya diiklankan di link Wi-Fi/Ethernet. Sekarang saatnya menemukan dan menjangkau perangkat akhir.

5. Menemukan Layanan

Menemukan layanan dengan ponsel

54a136a8940897cc.png

Kita menggunakan Aplikasi Service Browser untuk menemukan layanan mDNS dengan ponsel Android. Aplikasi yang setara juga dapat ditemukan untuk perangkat seluler iOS. Buka Aplikasi dan layanan _ipps._tcp akan muncul.

Menemukan layanan dengan host Linux

Jika ingin menemukan layanan dari host Linux lain, Anda dapat menggunakan perintah avahi-browse.

Instal avahi-daemon dan avahi-utils:

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

Menyelesaikan layanan:

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

Menemukan layanan dengan host macOS

Anda dapat menggunakan dns-sd di macOS untuk menyelesaikan layanan:

$ 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. Melakukan Ping ke Perangkat Akhir

Ping dari ponsel

Ambil contoh ponsel Pixel, kita dapat mengetahui alamat OMR layanan "ot-service" yang sebelumnya terdaftar di halaman detail instance layanan di Aplikasi Service Browser.

bb992962e68d250b.png 888daa1df1e1a9bf.png

Sekarang kita dapat melakukan ping ke alamat OMR dengan Aplikasi Network Analyzer lainnya.

Sayangnya, versi Android Aplikasi Network Analyzer tidak mendukung kueri mDNS untuk utilitas ping dan kita tidak dapat melakukan ping langsung ke nama host ot-host.local (kita dapat melakukan ping ke nama host dengan Aplikasi versi iOS).

Ping dari host Linux/macOS

Thread Border Router mengirimkan Iklan Router ICMPv6 (RA) untuk mengiklankan awalan (melalui Opsi Informasi Awalan) dan rute (melalui Opsi Informasi Rute) di link Wi-Fi/Ethernet.

Menyiapkan host Linux

Penting untuk memastikan bahwa RA dan RIO diaktifkan di host Anda:

  1. net.ipv6.conf.wlan0.accept_ra harus minimal 1 jika penerusan IP tidak diaktifkan, dan 2 jika tidak.
  2. net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen tidak boleh lebih kecil dari 64.

accept_ra secara default ditetapkan ke 1 untuk sebagian besar distribusi. Namun, mungkin ada daemon jaringan lain yang akan menggantikan opsi ini (misalnya, dhcpcd di Raspberry Pi akan menggantikan accept_ra menjadi 0). Anda dapat memeriksa nilai accept_ra dengan:

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

Tetapkan nilai ke 1 (atau 2 jika penerusan IP diaktifkan) dengan:

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

Opsi accept_ra_rt_info_max_plen di sebagian besar distribusi Linux secara default adalah 0, tetapkan ke 64 dengan:

$ 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

Perubahan akan hilang setelah memulai ulang host. Misalnya, tambahkan perintah di bawah ke /etc/sysctl.conf untuk mengaktifkan RIO secara permanen:

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

Mungkin sudah terlambat untuk mengubah konfigurasi tersebut karena OTBR telah mengirim pesan RA dan interval antara dua pesan RA yang tidak diminta bisa mencapai beberapa ratus detik. Salah satu caranya adalah dengan memutuskan dan menghubungkan kembali ke AP Wi-Fi untuk mengirim pesan Permintaan Router sehingga OTBR akan merespons dengan RA yang diminta. Opsi lainnya adalah memulai ulang fungsi Perutean Pembatas di Router Pembatas:

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

Jika Anda mencoba menghubungkan kembali Wi-Fi atau memulai ulang antarmuka Ethernet, pastikan dhcpcd tidak digunakan untuk mengelola jaringan IPv6 Wi-Fi/Ethernet Anda. Karena dhcpcd selalu menggantikan opsi accept_ra setiap kali antarmuka dimulai ulang dan konfigurasi accept_ra Anda akan hilang. Tambahkan baris di bawah ke file konfigurasi dhcpcd (misalnya, /etc/dhcpcd.conf) untuk menonaktifkan IPv6 secara eksplisit di dhcpcd:

noipv6
noipv6rs

Anda harus memulai ulang agar perubahan diterapkan.

Siapkan host macOS

Kedua opsi accept_ra* diaktifkan secara default, tetapi Anda harus mengupgrade sistem ke minimal macOS Big Sur.

Melakukan ping ke nama host atau alamat IPv6

Kita sekarang dapat melakukan ping ke nama host ot-host.local dengan perintah ping -6 (ping6 untuk 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
...

Perintah ini mungkin gagal di host Linux dengan error "Name or service not known". Hal ini karena perintah ping tidak me-resolve nama ot-host.local. dengan kueri mDNS. Buka /etc/nsswitch.conf dan tambahkan mdns6_minimal ke baris yang dimulai dengan hosts:

hosts:          files mdns4_minimal mdns6_minimal dns

Tentu saja, Anda selalu dapat melakukan ping langsung ke alamat 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. Membatalkan Publikasi Layanan Perangkat Akhir

Untuk menghapus alamat dan layanan yang terdaftar dari node klien SRP:

> srp client host remove
Done

Anda tidak dapat menemukan layanan _ipps._tcp sekarang.

8. Selamat

Selamat, Anda telah berhasil menyiapkan OTBR sebagai Router Pembatas Thread untuk menyediakan konektivitas IP dua arah dan penemuan layanan untuk perangkat akhir Thread.

Apa langkah selanjutnya?

Lihat beberapa codelab ini...

Dokumen referensi