1. Wprowadzenie

Czym jest Thread?
Thread to oparty na protokole IP bezprzewodowy protokół sieciowy o niskim poborze mocy, który umożliwia bezpieczną komunikację między urządzeniami i między urządzeniami a chmurą. Sieci Thread mogą dostosowywać się do zmian topologii, aby uniknąć awarii pojedynczego punktu.
Co to jest OpenThread?
OpenThread od Google to implementacja open source protokołu Thread®.
Co to jest router graniczny OpenThread?
OpenThread Border Router (OTBR) udostępniony przez Google to implementacja open source routera granicznego Thread.
NAT64
NAT64 to mechanizm, który umożliwia hostom w sieciach obsługujących tylko IPv6 dostęp do zasobów w sieciach IPv4. Brama NAT64 tłumaczy protokoły IPv4 na protokoły IPv6 i odwrotnie.
Translator NAT64, będący częścią routera brzegowego OpenThread, obsługuje tłumaczenie protokołów TCP, UDP i ICMP (ICMPv6).
Co utworzysz
W tym laboratorium nauczysz się konfigurować router graniczny OpenThread (OTBR) i urządzenie Thread, a potem włączać i weryfikować komunikację między urządzeniami Thread a hostami IPv4 w internecie za pomocą routera granicznego OpenThread.
Czego się nauczysz
- Jak utworzyć router graniczny OpenThread z funkcjami NAT64.
- Jak komunikować się z hostami IPv4 z urządzeń końcowych Thread.
Czego potrzebujesz
- Stacja robocza z systemem Linux do tworzenia i flashowania urządzenia RCP Thread, interfejsu wiersza poleceń OpenThread oraz testowania łączności IPv4.
- Raspberry Pi do routera granicznego Thread. Stacja robocza z systemem Linux powinna być dostępna z tego urządzenia przez IPv4.
- 2 klucze USB Nordic Semiconductor nRF52840 (jeden dla RCP i jeden dla urządzenia końcowego Thread).
Topologia sieci w tym ćwiczeniu:

2. Konfigurowanie routera granicznego OpenThread
Najszybszym sposobem skonfigurowania OTBR jest skorzystanie z przewodnika po konfiguracji OTBR.
Po zakończeniu konfiguracji OTBR użyj polecenia ot-ctl, aby sprawdzić, czy usługa NAT64 jest włączona na routerze graniczny:
> nat64 state PrefixManager: Active Translator: Active Done
Router graniczny Thread publikuje prefiks NAT64 w danych sieci Thread:
> netdata show Prefixes: fd16:a3d:e170:1::/64 paros low f800 Routes: ::/0 s med f800 fd16:a3d:e170:2:0:0::/96 sn low f800 Services: 44970 5d fd4db3e59738319339c4ee02ca9e2b1dd120 s f800 0 Contexts: fd16:a3d:e170:1::/64 1 sc Commissioning: 60365 - - - Done
Prefiks NAT64 jest wyświetlany jako wpis trasy z flagą n. W przykładzie powyżej fd16:a3d:e170:2:0:0::/96 to prefiks NAT64.
Prefiks NAT64 będzie używany przez urządzenia Thread podczas komunikacji z hostem IPv4.
3. Konfigurowanie urządzenia końcowego Thread
Wykonaj krok konfiguracji urządzeń FTD z samouczka Tworzenie sieci Thread za pomocą płytek nRF52840 i OpenThread, aby skompilować i zaprogramować urządzenie końcowe CLI nRF52840, wprowadzając zmianę w tym kroku:
W sekcji Build and flash (Kompilacja i flashowanie) musisz dodać do wiersza poleceń znaki -DOT_DNS_CLIENT=ON, -DOT_SRP_CLIENT=ON i -DOT_ECDSA=ON podczas wywoływania polecenia script/build:
$ cd ~/src/ot-nrf528xx $ rm -rf build $ script/build nrf52840 USB_trans -DOT_DNS_CLIENT=ON -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON
Postępuj zgodnie z instrukcjami w samouczku dotyczącym tworzenia sieci Thread za pomocą płytek nRF52840 i OpenThread. Po wgraniu obrazu CLI na urządzenie końcowe postępuj zgodnie z instrukcjami w sekcji Dołączanie drugiego węzła do sieci Thread, aby dodać urządzenie Thread do sieci Thread.
Po skonfigurowaniu urządzenia końcowego Thread poczekaj kilka sekund i sprawdź, czy dołączenie do sieci Thread się powiodło. Podobnie jak powyżej, opublikowany prefiks NAT64 możesz wyświetlić w danych sieci Thread.
> netdata show Prefixes: fd16:a3d:e170:1::/64 paros low f800 Routes: ::/0 s med f800 fd16:a3d:e170:2:0:0::/96 sn low f800 Services: 44970 5d fd4db3e59738319339c4ee02ca9e2b1dd120 s f800 0 Contexts: fd16:a3d:e170:1::/64 1 sc Commissioning: 60365 - - - Done
Sprawdź, czy dane sieciowe są zgodne z danymi z OTBR.
4. Komunikowanie się z hostami IPv4 z urządzenia końcowego Thread
Możesz teraz komunikować się z hostami w sieci IPv4 z urządzenia końcowego, które właśnie skonfigurowaliśmy.
Wysyłanie żądań echa ICMP do hostów IPv4
Z interfejsu wiersza poleceń naszego urządzenia końcowego Thread:
> ping 8.8.8.8 Pinging synthesized IPv6 address: fd16:a3d:e170:2:0:0:808:808 16 bytes from fd16:a3d:e170:2:0:0:808:808: icmp_seq=1 hlim=109 time=28ms 1 packets transmitted, 1 packets received. Packet loss = 0.0%. Round-trip min/avg/max = 28/28.0/28 ms. Done
Router graniczny tworzy dla tego urządzenia element mapowania NAT64 za pomocą polecenia nat64 mappings:
> nat64 mappings | | Address | Ports or ICMP Ids | | 4 to 6 | 6 to 4 | +------------------+-------------------------------------------------------------+-------------------+--------+-------------------------+-------------------------+ | ID | IPv6 | IPv4 | v6 | v4 | Expiry | Pkts | Bytes | Pkts | Bytes | +------------------+------------------------------------------+------------------+---------+---------+--------+----------+--------------+----------+--------------+ | 90b156e3cf609a23 | fd16:a3d:e170:1:492d:bcdb:9f72:6297 | 192.168.255.254 | N/A | N/A | 7162s | 1 | 16 | 1 | 16 | | | TCP | 0 | 0 | 0 | 0 | | | UDP | 0 | 0 | 0 | 0 | | | ICMP | 1 | 16 | 1 | 16 | Done
Wartość fd16:a3d:e170:1:492d:bcdb:9f72:6297 powinna być adresem IPv6 urządzenia Thread.
W dowolnym momencie uruchom to polecenie na routerze granicznym, aby sprawdzić, jak zlicza on ruch.
Wysyłanie zapytań DNS do serwerów DNS IPv4
Użyj dns resolve4, aby rozpoznać nazwę hosta w sieci IPv4. Adres serwera DNS może być też adresem IPv4:
> dns resolve4 example.com 8.8.8.8 Synthesized IPv6 DNS server address: fd16:a3d:e170:2:0:0:808:808 DNS response for example.com. - fd16:a3d:e170:2:0:0:17c0:e454 TTL:295 fd16:a3d:e170:2:0:0:17d7:88 TTL:295 fd16:a3d:e170:2:0:0:17d7:8a TTL:295 fd16:a3d:e170:2:0:0:6007:80af TTL:295 fd16:a3d:e170:2:0:0:6007:80c6 TTL:295 fd16:a3d:e170:2:0:0:17c0:e450 TTL:295 Done
Komunikacja za pomocą protokołu TCP
Można nawiązywać połączenia TCP między urządzeniem końcowym a hostami w sieci IPv4.
Załóżmy, że adres IP hosta Linux IPv4 to 192.168.0.2.
Na hoście Linux IPv4 użyj polecenia nc, aby nasłuchiwać połączeń TCP:
$ nc -l 0.0.0.0 12345
Na urządzeniu końcowym Thread nawiąż połączenie TCP i wyślij wiadomości do hosta Linux IPv4:
> tcp init Done > tcp connect 192.168.0.2 12345 Connecting to synthesized IPv6 address: fd16:a3d:e170:2:0:0:c0a8:2 Done > tcp send hello
Dane wyjściowe hosta Linux IPv4:
hello
Możesz też wysyłać wiadomości z hosta Linux IPv4 na urządzenie końcowe Thread. Wpisz „world” i naciśnij Enter na hoście IPv4 z Linuksem, na którym działa nc. Urządzenie końcowe Thread wyświetli:
TCP: Received 6 bytes: world
Komunikacja przez UDP
Komunikacja za pomocą protokołu UDP jest możliwa między urządzeniami Thread a hostami w sieci IPv4.
Załóżmy, że adres IP hosta Linux IPv4 to 192.168.0.2.
Użyj nc, aby nasłuchiwać połączeń UDP:
$ nc -u -l 0.0.0.0 12345
Na urządzeniu końcowym Thread nawiąż połączenie UDP i wyślij wiadomości do hosta Linux IPv4:
> udp open Done > udp connect 192.168.0.2 12345 Connecting to synthesized IPv6 address: fd16:a3d:e170:2:0:0:c0a8:2 Done > udp send hello Done
Dane wyjściowe hosta Linux IPv4:
hello
Możesz też wysyłać wiadomości z hosta Linux IPv4 na urządzenie końcowe Thread. Wpisz „world” i naciśnij Enter na hoście IPv4 z Linuksem, na którym działa nc. Urządzenie końcowe Thread wyświetli:
6 bytes from fd16:a3d:e170:2:0:0:c0a8:2 12345 world
5. Włączanie NAT64 na routerze granicznym
NAT64 możesz włączyć lub wyłączyć w dowolnym momencie. Aby wyłączyć NAT64, użyj nat64 disable. Aby sprawdzić stan NAT64, użyj polecenia nat64 state.
> nat64 disable Done > nat64 state PrefixManager: Disabled Translator: Disabled Done
Po wyłączeniu urządzenie nie publikuje już prefiksu NAT64:
> netdata show Prefixes: fd16:a3d:e170:1::/64 paros low f800 Routes: ::/0 s med f800 Services: 44970 5d fd4db3e59738319339c4ee02ca9e2b1dd120 s f800 0 Contexts: fd16:a3d:e170:1::/64 1 sc Commissioning: 60365 - - - Done
Urządzenia w sieci Thread nie mogą już też uzyskiwać dostępu do hosta IPv4 za pomocą tego routera granicznego.
Z interfejsu wiersza poleceń naszego urządzenia końcowego Thread:
> ping 8.8.8.8 Error 13: InvalidState
Aby włączyć NAT64, użyj nat64 enable. Zanim menedżer prefiksów zacznie reklamować prefiks NAT64, może minąć trochę czasu:
> nat64 enable Done > nat64 state PrefixManager: Idle Translator: NotWorking Done
Po kilku sekundach komponenty NAT64 powinny być gotowe do działania:
> nat64 state PrefixManager: Active Translator: Active Done > netdata show Prefixes: fd16:a3d:e170:1::/64 paros low f800 Routes: ::/0 s med f800 fd16:a3d:e170:2:0:0::/96 sn low f800 Services: 44970 5d fd4db3e59738319339c4ee02ca9e2b1dd120 s f800 0 Contexts: fd16:a3d:e170:1::/64 1 sc Commissioning: 60365 - - - Done
Pamiętaj, że wyłączenie NAT64 spowoduje wyczyszczenie tabeli mapowania:
> nat64 mappings | | Address | Ports or ICMP Ids | | 4 to 6 | 6 to 4 | +------------------+-------------------------------------------------------------+-------------------+--------+-------------------------+-------------------------+ | ID | IPv6 | IPv4 | v6 | v4 | Expiry | Pkts | Bytes | Pkts | Bytes | +------------------+------------------------------------------+------------------+---------+---------+--------+----------+--------------+----------+--------------+ Done
6. Przekazywanie zapytań DNS do nadrzędnych serwerów DNS
Gdy na routerze granicznym jest włączony NAT64, OpenThread będzie próbować przekazywać zapytania DNS dotyczące domen internetowych do serwerów DNS wyższego poziomu.
Na urządzeniu końcowym sprawdź, czy domyślnym serwerem DNS jest router graniczny:
> dns config Server: [fd4d:b3e5:9738:3193:39c4:ee02:ca9e:2b1d]:53 ResponseTimeout: 6000 ms MaxTxAttempts: 3 RecursionDesired: yes ServiceMode: srv_txt_opt Nat64Mode: allow Done
Adres IPv6 serwera (fd4d:b3e5:9738:3193:39c4:ee02:ca9e:2b1d w przykładzie powyżej) powinien być jednym z adresów routera granicznego OpenThread.
Teraz możesz wysyłać zapytania DNS dotyczące domen internetowych z urządzenia końcowego:
> dns resolve example.com DNS response for example.com. - 2600:1406:3a00:21:0:0:173e:2e65 TTL:161 2600:1406:3a00:21:0:0:173e:2e66 TTL:161 2600:1406:bc00:53:0:0:b81e:94c8 TTL:161 2600:1406:bc00:53:0:0:b81e:94ce TTL:161 2600:1408:ec00:36:0:0:1736:7f24 TTL:161 2600:1408:ec00:36:0:0:1736:7f31 TTL:161 Done > dns resolve4 example.com DNS response for example.com. - fd16:a3d:e170:2:0:0:6007:80af TTL:300 fd16:a3d:e170:2:0:0:6007:80c6 TTL:300 fd16:a3d:e170:2:0:0:17c0:e450 TTL:300 fd16:a3d:e170:2:0:0:17c0:e454 TTL:300 fd16:a3d:e170:2:0:0:17d7:88 TTL:300 fd16:a3d:e170:2:0:0:17d7:8a TTL:300 Done
7. Gratulacje
Gratulacje! Udało Ci się skonfigurować router graniczny z obsługą NAT64 i użyć go do zapewnienia dostępu do internetu urządzeniom końcowym Thread.
Więcej informacji
- Przewodniki OpenThread
- Dokumentacja interfejsu wiersza poleceń OpenThread
- Dokumentacja interfejsu OpenThread API dla NAT64
- Dokumentacja interfejsu OpenThread API dla DNS upstream
- Abstrakcja platformy OpenThread dla DNS