Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

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

1. Pengantar

699d673d05a55535.png

Apa yang dimaksud dengan Thread Border Router?

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

Router Thread Border menghubungkan jaringan Thread ke jaringan berbasis IP lainnya, seperti Wi-Fi atau Ethernet. Jaringan Thread memerlukan Border Router untuk terhubung ke jaringan lain. Thread Border Router 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).
  • Infrastruktur thread-over yang menggabungkan partisi Thread melalui link berbasis IP.
  • Komisi Thread Eksternal (misalnya, ponsel) untuk mengautentikasi dan menggabungkan perangkat Thread ke jaringan Thread.

OpenThread Border Router (OTBR) yang dirilis Google adalah penerapan open source Thread Border Router.

Yang akan Anda buat

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

Yang akan Anda pelajari

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

Yang Anda butuhkan

  • Perangkat Raspberry Pi 3/4 dan kartu SD dengan kemampuan minimal 8 GB.
  • 2 papan dev nRF52840 Semikonduktor Nordik.
  • Wi-Fi AP tanpa IPv6 Router Advertising Guard diaktifkan pada router.
  • Ponsel iOS dengan ponsel iOS setidaknya 14 atau Android dengan setidaknya Android 8.1.

2. Menyiapkan OTBR

Menyiapkan Raspberry Pi

Menyiapkan perangkat Raspberry Pi baru dengan alat rpi-imager sangat mudah dengan mengikuti petunjuk di raspberrypi.org (bukan menggunakan Raspberry Pi OS terbaru di alat ini, download 2021-05-07-raspios-buster-armhf-lite sendiri). Untuk menyelesaikan langkah-langkah ponsel dalam codelab ini, Anda perlu menghubungkan Raspberry Pi ke Wi-Fi AP. Ikuti panduan ini untuk menyiapkan konektivitas nirkabel. Login ke Raspberry Pi dengan SSH lebih mudah, Anda dapat menemukan petunjuk di sini.

Dapatkan kode OTBR

Login ke Raspberry Pi dan clone ot-br-posix dari GitHub:

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

Membuat dan menginstal OTBR

OTBR memiliki dua skrip yang melakukan bootstrap dan menyiapkan Thread Border Router:

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

OTBR berfungsi pada antarmuka Thread dan antarmuka jaringan infrastruktur (misalnya Wi-Fi/Ethernet) yang ditentukan dengan INFRA_IF_NAME. Antarmuka Thread dibuat oleh OTBR itu sendiri dan diberi nama wpan0 secara default dan antarmuka infrastruktur memiliki nilai default wlan0 jika INFRA_IF_NAME tidak ditentukan secara eksplisit. Jika Raspberry Pi Anda terhubung dengan kabel Ethernet, tentukan nama antarmuka Ethernet (misalnya eth0):

$ INFRA_IF_NAME=eth0 ./script/setup

Periksa apakah OTBR berhasil diinstal:

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

Layanan otbr-agent diharapkan tidak aktif, karena memerlukan chip RCP untuk berjalan.

Mulai ulang Raspberry Pi agar perubahan diterapkan.

Mem-build dan mem-flash firmware RCP

OTBR mendukung chip radio 15,4 dalam mode Radio Co-Processor (RCP). Dalam mode ini, tumpukan OpenThread berjalan di sisi host dan mengirimkan/menerima frame melalui transceiver IEEE802.15.4.

Ikuti langkah 4 dari Mem-build jaringan Thread dengan board nRF52840 dan codelab OpenThread untuk mem-build dan mem-flash perangkat RCP nRF52840:

$ script/build nrf52840 USB_trans

Memulai OTBR dan memverifikasi status

Hubungkan board nRF52840 ke Raspberry Pi dan mulai layanan otbr-agent:

$ sudo service otbr-agent restart

Pastikan layanan otbr-agent aktif:

$ 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 Membentuk jaringan Thread

Ada perintah ot-ctl yang dapat digunakan untuk mengontrol layanan otbr-agent. ot-ctl menerima semua perintah CLI OpenThread, lihat Panduan CLI OpenThread untuk detail selengkapnya.

Bentuk jaringan Thread dengan OTBR:

$ 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

Tunggu beberapa detik, kita akan dapat melihat bahwa OTBR berfungsi sebagai Thread leader dan ada awalan off-mesh-routable (OMR) di Data Jaringan Thread:

$ 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. Menyiapkan Perangkat Akhir Klien SRP

Mem-build dan mem-flash CLI OT

Ikuti langkah 5 dari Build a Thread network with nRF52840 boards dan OpenThread codelab untuk mem-build dan mem-flash perangkat akhir nRF52840 CLI.

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 dengan jaringan OTBR

Untuk bergabung ke jaringan Thread yang dibuat oleh layanan otbr-agent, kita perlu mendapatkan Set Data Operasional Aktif dari perangkat OTBR. Mari kembali ke command line otbr-agent 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 dengan 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 dicetak di OTBR. Sekarang kami dapat mem-ping 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

5. Memublikasikan Layanan di Perangkat Akhir

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

Kita dapat mendaftarkan layanan dengan perintah srp client.

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

> srp client autostart enable
Done

Tetapkan hostname yang akan diiklankan pada link Wi-Fi/Ethernet:

> srp client host name ot-host
Done

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

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

Di bagian akhir, daftarkan layanan _ipps._tcp palsu:

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

Tunggu beberapa detik dan kami akan dapat melihat layanan terdaftar:

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

Kami telah menyelesaikan semua pekerjaan penyiapan dan layanan _ipps._tcp seharusnya telah diiklankan di link Wi-Fi/Ethernet. Saatnya menemukan dan menjangkau perangkat akhir sekarang.

6. Temukan Layanan

Menemukan layanan dengan ponsel

54a136a8940897cc.png

Kami menggunakan Aplikasi Browser Layanan 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

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

7. Ping Perangkat Akhir

Mem-ping dari ponsel

Ambil contoh ponsel Pixel sebagai contoh, kita dapat mencari tahu alamat OMR dari layanan "otot-service" yang terdaftar sebelumnya di halaman detail instance layanan di Aplikasi Browser Layanan.

bb992962e68d250b.png 888daa1df1e1a9bf.png

Sekarang kita dapat mem-ping alamat OMR dengan Aplikasi Network Analyzer lain.

Sayangnya, Aplikasi Penganalisis Jaringan versi Android tidak mendukung kueri mDNS untuk utilitas ping, dan kami tidak dapat mem-ping hostname ot-host.local secara langsung (kami dapat mem-ping hostname dengan Aplikasi versi iOS).

Ping dari host Linux/macOS

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

Menyiapkan host Linux

Penting untuk memastikan RA dan RIO diaktifkan di host Anda:

  1. net.ipv6.conf.wlan0.accept_ra minimal harus 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 ditetapkan secara default ke 1 untuk sebagian besar distribusi. Namun, mungkin ada daemon jaringan lain yang akan mengganti opsi ini (misalnya, dhcpcd pada Raspberry Pi akan mengganti accept_ra menjadi 0). Anda dapat memeriksa nilai accept_ra dengan:

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

Dan setel nilainya 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 pada sebagian besar distribusi Linux ditetapkan secara default ke 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 mengirimkan pesan RA dan interval antara dua pesan RA yang tidak diminta bisa mencapai beberapa ratus detik. Salah satu caranya adalah dengan memutuskan sambungan dan menyambungkan kembali ke Wi-Fi AP untuk mengirim pesan Permohonan Router agar OTBR akan merespons dengan RA yang diminta. Opsi lainnya adalah memulai ulang fungsi Border Routing di Border Router:

$ 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 Wi-Fi/Ethernet IPv6. Karena dhcpcd selalu mengganti 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 dalam dhcpcd:

noipv6
noipv6rs

Anda harus memulai ulang agar perubahan diterapkan.

Menyiapkan host macOS

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

Mem-ping nama host atau alamat IPv6

Sekarang kita dapat mem-ping hostname 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 pada host Linux yang menampilkan error "Name or service not known". Itu karena perintah ping tidak menyelesaikan nama ot-host.local. dengan kueri mDNS. Buka /etc/nsswitch.conf dan tambahkan mdns6_minimal ke baris yang diawali dengan hosts:

hosts:          files mdns4_minimal mdns6_minimal dns

Tentu saja, Anda selalu dapat langsung mem-ping 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
...

8 Akhiri Perangkat Batalkan Publikasi Layanan

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

> srp client host remove
Done

Anda tidak akan dapat menemukan layanan _ipps._tcp sekarang.

9. Selamat

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

Apa selanjutnya?

Lihat beberapa codelab ini...

Dokumen referensi