1. Wprowadzenie
Czym jest Thread?
Thread to protokół sieci bezprzewodowej typu mesh 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 udostępniony przez Google to implementacja Thread® typu open source.
Co to jest router graniczny OpenThread?
OpenThread Border Router (OTBR) opublikowany przez Google to implementacja routera granicznego Thread w wersji open source.
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 jest tłumaczem protokołów IPv4 i IPv6.
Tłumacz NAT64, który jest częścią routera granicznego OpenThread, obsługuje tłumaczenie protokołów TCP, UDP i ICMP (ICMPv6).
Co utworzysz
W tym laboratorium konfigurujesz router OpenThread Border Router (OTBR) i urządzenie Thread, a potem włączasz i sprawdzasz komunikację między urządzeniami Thread i hostami IPv4 w internecie za pomocą routera OpenThread Border Router.
Czego się nauczysz
- Jak skonfigurować router brzegowy OpenThread z funkcjami NAT64.
- Jak komunikować się z hostami IPv4 z urządzeń końcowych Thread.
Czego potrzebujesz
- stacja robocza z systemem Linux do kompilowania i programowania układu Thread RCP, interfejsu wiersza poleceń OpenThread oraz testowania połączeń IPv4;
- Raspberry Pi do routera granicznego Thread. Z tego urządzenia można się połączyć z komputerem z systemem Linux przez IPv4.
- 2 dongle USB nRF52840 firmy Nordic Semiconductor (jeden do RCP, a drugi do urządzenia końcowego Thread).
Topologia sieci w tym ćwiczeniu z programowania:
2. Konfigurowanie routera granicznego OpenThread
Najszybszym sposobem skonfigurowania usługi OTBR jest skorzystanie z przewodnika po konfiguracji usługi OTBR.
Po zakończeniu konfigurowania routera brzegowego użyj polecenia ot-ctl
, aby sprawdzić, czy usługa NAT64 jest włączona na routerze brzegowym:
> 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 wyświetla się 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
Aby skompilować i sflashować urządzenie końcowe z interfejsem wiersza poleceń nRF52840, wykonaj ten krok w ramach tworzenia sieci Thread z kartami nRF52840 i kodem OpenThread, z tą zmianą w wykonywanych czynnościach:
W sekcji Kompilowanie i flashowanie musisz dołączyć do wiersza poleceń opcje -DOT_DNS_CLIENT=ON
, -DOT_SRP_CLIENT=ON
i -DOT_ECDSA=ON
, gdy wywołujesz polecenie 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
Kontynuuj tworzenie sieci Thread za pomocą płytek nRF52840 i OpenThread w ramach Codelab. Po zaflashowaniu urządzenia końcowego obrazem CLI wykonaj instrukcje z sekcji Dołączanie drugiego węzła do sieci Thread, aby dodać urządzenie Thread do sieci Thread.
Poczekaj kilka sekund po skonfigurowaniu urządzenia końcowego Thread i sprawdź, czy udało się nawiązać połączenie z siecią Thread. Jak wspomniano powyżej, opublikowany prefiks NAT64 można zobaczyć 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 w 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ń echo ICMP do hostów IPv4
W interfejsie wiersza poleceń urządzenia z dostępem do 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 element mapowania NAT64 dla tego urządzenia 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 możesz uruchomić to polecenie na routerze brzegowym, aby sprawdzić, jak liczy on ruch.
Wysyłanie zapytań DNS do serwerów DNS IPv4
Użyj polecenia dns resolve4
, aby przetłumaczyć 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 przez TCP
Możliwe jest nawiązywanie połączeń 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 IPv4 w systemie Linux użyj polecenia nc
, aby nasłuchiwać połączeń TCP:
$ nc -l 0.0.0.0 12345
Na urządzeniu końcowym Thread nawiązuj połączenie TCP i wysyłaj wiadomości do hosta IPv4 w systemie Linux:
> 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
Host IPv4 w systemie Linux:
hello
Możesz też wysyłać wiadomości z hosta Linux IPv4 do urządzenia końcowego w sieci Thread. Wpisz „world” i naciśnij Enter na hoście IPv4 Linuksa z nc
, a urządzenie końcowe Thread wyświetli:
TCP: Received 6 bytes: world
Komunikacja przez UDP
Urządzenia i hosty w sieci IPv4 mogą komunikować się ze sobą za pomocą protokołu UDP.
Załóżmy, że adres IP hosta Linux IPv4 to 192.168.0.2
.
Aby nasłuchiwać połączeń UDP, użyj nc
:
$ nc -u -l 0.0.0.0 12345
Na urządzeniu końcowym Thread nawiązuj połączenie UDP i wysyłaj wiadomości do hosta IPv4 w systemie Linux:
> 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
Host IPv4 w systemie Linux:
hello
Możesz też wysyłać wiadomości z hosta Linux IPv4 do urządzenia końcowego w sieci Thread. Wpisz „world” i naciśnij Enter na hoście IPv4 Linuksa z nc
, a urządzenie końcowe Thread wyświetli:
6 bytes from fd16:a3d:e170:2:0:0:c0a8:2 12345 world
5. Włączanie i wyłączanie NAT64 na routerze granicznym
NAT64 możesz włączyć lub wyłączyć w dowolnym momencie. Aby wyłączyć NAT64, użyj polecenia 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
Ponadto urządzenia w sieci Thread nie mogą już uzyskać dostępu do hosta IPv4 przez ten router graniczny.
W interfejsie wiersza poleceń urządzenia z dostępem do 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ć uruchomione:
> 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. Przekierowywanie zapytań DNS do serwerów DNS w górę łańcucha
Gdy NAT64 jest włączony na routerze brzegowym, OpenThread będzie próbować przekierowywać zapytania DNS dotyczące domen internetowych do serwerów DNS nadrzędnych.
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 OpenThread Border Router.
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 brzegowy z obsługą NAT64 i wykorzystać go do zapewnienia dostępu do internetu urządzeniom końcowym Thread.
Więcej informacji
- Przewodniki OpenThread
- Informacje o OpenThread CLI
- Dokumentacja interfejsu OpenThread API dla NAT64
- Dokumentacja interfejsu OpenThread API na potrzeby DNS upstream
- Abstrahowanie platformy OpenThread do DNS