1. Wprowadzenie
Co to jest Thread?
Thread to oparty na adresie IP protokół sieci bezprzewodowej sieci o niskiej mocy, który umożliwia bezpieczną komunikację między urządzeniami i między urządzeniami. Sieci wątków mogą dostosowywać się do zmian w topologii, aby uniknąć awarii jednego punktu.
Co to jest OpenThread?
OpenThread wydany przez Google to implementacja oprogramowania Thread® na licencji open source.
Co to jest router graniczny OpenThread?
OTBR to opracowany przez Google program typu open source związany z routerem granicznym.
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 między protokołami IPv4 i IPv6.
Tłumacz NAT64 w ramach oprogramowania OpenThread Border Router obsługuje protokoły TCP, UDP i ICMP (ICMP v6).
Co utworzysz
Dzięki nim dowiesz się, jak skonfigurować router wątkowy OpenThread i urządzenie z wątkami, a następnie włączyć i zweryfikować komunikację między urządzeniami Thread i hostami IPv4 w internecie przy użyciu routera OpenThread Border.
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 umożliwiająca tworzenie i uruchamianie kodu NCP wątków, interfejsu wiersza poleceń OpenThread oraz testowanie połączeń IPv4.
- Raspberry Pi 4 z 4 GB pamięci RAM do routera granicznego Thread. Twoja stacja robocza Linuksa powinna być dostępna przez IPv4 na tym urządzeniu.
- 2 półki Nordic półprzewodnik, nRF52840 DK.
Topologia sieci dla tego ćwiczenia z programowania:
2. Skonfiguruj router graniczny OpenThread
Wykonaj krok OTBR konfiguracji routera granicznego – dwukierunkowa usługa połączeń IPv6 i wykrywanie usług opartych na DNS, aby utworzyć router graniczny OpenThread, z tą zmianą:
W sekcji Tworzenie i instalowanie OTBR musisz polecić skryptowi włączenie tłumacza NAT64 w OpenThread przez ustawienie zmiennej środowiskowej NAT64
na 1
i NAT64_SERVICE
na openthread
. Przed wykonaniem kroku uruchom to polecenie:
$ export NAT64=1 NAT64_SERVICE=openthread
Kontynuuj ćwiczenia z ćwiczenia z programowania routera granicznego IPv6 i usługi wykrywania połączeń opartych na DNS. Po utworzeniu sieci typu Thread możesz sprawdzić, czy router graniczny publikuje prefiks NAT64, używając poleceń interfejsu wiersza poleceń OpenThread.
Najpierw sprawdź, czy router graniczny działa i czy NAT64 działa na routerze granicznym:
$ sudo ot-ctl state leader Done $ sudo ot-ctl nat64 enable Done $ sudo ot-ctl nat64 state PrefixManager: Active Translator: Active Done
Widać, że system OTBR pełni funkcję lidera w wątkach, a w danych sieci z wątkami pojawia się prefiks NAT64 (w tym przypadku: fd4c:9574:3720:2:0:0::/96
).
$ sudo ot-ctl netdata show Prefixes: fd4c:9574:3720:1::/64 paos low 0800 Routes: fd49:7770:7fc5:0::/64 s med 0800 fd4c:9574:3720:2:0:0::/96 sn low 0800 Services: 44970 01 41000500000e10 s 0800 44970 5d fdd20e532b87b93f50ad4eea0450f1bfd11f s 0800 Done
Urządzenia z wątkami będą używać prefiksu NAT64 podczas komunikacji z hostem IPv4.
3. Skonfiguruj urządzenie końcowe wątku
Wykonaj czynności opisane w sekcji Konfigurowanie sieci FTD kompilacji w sieci kompilacji z płytami nRF52840 i ćwiczenia z programowania OpenThread, aby zbudować i uruchomić urządzenie końcowe interfejsu wiersza poleceń nRF52840 w następujący sposób:
W przypadku kompilacji i błysku musisz dodać do wiersza poleceń -DOT_DNS_CLIENT=ON
, -DOT_SRP_CLIENT=ON
i -DOT_ECDSA=ON
podczas wywoływania script/build
:
$ cd ~/src/ot-nrf528xx $ rm -rf build $ script/build nrf52840 USB_trans -DOT_JOINER=ON -DOT_COMMISSIONER=ON -DOT_DNS_CLIENT=ON -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON
Kontynuuj tworzenie sieci wątków przy użyciu tablic nRF52840 i ćwiczenia z programowania OpenThread. Po załadowaniu obrazu z interfejsu wiersza poleceń na urządzeniu końcowym wykonaj czynności opisane w artykule Thread Border Router – Bidirectional IPv6 Connectivity and DNS-based Service Discovery (Konfigurowanie routera granicy wątków – dwukierunkowa łączność IPv6 i wykrywanie usług oparte na DNS).
Zaczekaj kilka sekund po skonfigurowaniu urządzenia końcowego Thread i sprawdź, czy udało się dołączyć do sieci Thread. Prefiks NAT64 powinien być widoczny w danych sieciowych (w tym przypadku fd4c:9574:3720:2:0:0::/96
):
> netdata show Prefixes: fd4c:9574:3720:1::/64 paos low 0800 Routes: fd49:7770:7fc5:0::/64 s med 0800 fd4c:9574:3720:2:0:0::/96 sn low 0800 Services: 44970 01 41000500000e10 s 0800 44970 5d fdd20e532b87b93f50ad4eea0450f1bfd11f s 0800 Done
Upewnij się, że dane sieci są zgodne z danymi od OTBR.
4. Komunikowanie się z hostami IPv4 z urządzenia końcowego Thread
Możesz teraz komunikować się z hostami w sieci IPv4 z właśnie skonfigurowanego urządzenia.
Wysyłanie żądań echa ICMP do hostów IPv4
W interfejsie wiersza poleceń naszego urządzenia końcowego Thread:
> ping 8.8.8.8 Pinging synthesized IPv6 address: fd4c:9574:3720:2:0:0:808:808 16 bytes from fd4c:9574:3720:2:0:0:808:808: icmp_seq=15 hlim=119 time=48ms 1 packets transmitted, 1 packets received. Packet loss = 0.0%. Round-trip min/avg/max = 48/48.0/48 ms. Done
Router obramowania tworzy dla tego urządzenia element mapowania NAT64 za pomocą polecenia nat64 mappings
:
$ sudo ot-ctl nat64 mappings | | Address | | 4 to 6 | 6 to 4 | +------------------+-------------------------------------------------------------+--------+-------------------------+-------------------------+ | ID | IPv6 | IPv4 | Expiry | Pkts | Bytes | Pkts | Bytes | +------------------+------------------------------------------+------------------+--------+----------+--------------+----------+--------------+ | 377ee63dd3127f1a | fd4c:9574:3720:1:1d61:b4c1:494f:f975 | 192.168.255.254 | 7190s | 1 | 16 | 1 | 16 | | | TCP | 0 | 0 | 0 | 0 | | | UDP | 0 | 0 | 0 | 0 | | | ICMP | 1 | 16 | 1 | 16 | Done
Właściwość fd4c:9574:3720:1:1d61:b4c1:494f:f975
powinna być adresem IPv6 urządzenia z wątkiem.
Uruchom to polecenie w routerze granicznym, aby zobaczyć, jak liczy ruch.
Wysyłanie zapytań DNS do serwerów DNS IPv4
Użyj dns resolve4
, aby znaleźć 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: fd4c:9574:3720:2:0:0:808:808 DNS response for example.com. - fd4c:9574:3720:2:0:0:5db8:d822 TTL:20456 Done
Komunikacja przez TCP
Można nawiązać połączenia TCP między urządzeniem końcowym a hostami w sieci IPv4.
Załóżmy, że adres IP hosta IPv4 systemu Linux to 192.168.0.2
.
Na hoście systemu IPv4 w systemie Linux użyj protokołu 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 IPv4 w systemie Linux:
> tcp init Done > tcp connect 192.168.0.2 12345 Connecting to synthesized IPv6 address: fd4c:9574:3720:2:0:0:c0a8:2 Done > tcp send hello
Dane wyjściowe hosta IPv4 Linuksa:
hello
Możesz też wysyłać wiadomości z hosta IPv4 w systemie Linux do urządzenia końcowego Thread. Wpisz „world” i naciśnij Enter na hoście systemu IPv4 w systemie Linux, na którym działa urządzenie nc
:
TCP: Received 6 bytes: world
Komunikacja przez UDP
Można komunikować się przez UDP przez urządzenia Thread i hosty w sieci IPv4.
Załóżmy, że adres IP hosta IPv4 systemu Linux 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ąż połączenie UDP i wyślij wiadomości do hosta IPv4 w systemie Linux:
> udp open Done > udp connect 192.168.0.2 12345 Connecting to synthesized IPv6 address: fd4c:9574:3720:2:0:0:c0a8:2 Done > udp send hello Done
Dane wyjściowe hosta IPv4 Linuksa:
hello
Możesz też wysyłać wiadomości z hosta IPv4 w systemie Linux do urządzenia końcowego Thread. Wpisz „world” i naciśnij Enter na hoście systemu IPv4 w systemie Linux, na którym działa urządzenie nc
:
6 bytes from fd4c:9574:3720:2:0:0:c0a8:2 12345 world
5. Przełącz NAT64 na routerze granicznym
NAT64 możesz włączyć lub wyłączyć w każdej chwili. Aby wyłączyć NAT64, użyj nat64 disable
. Używaj funkcji nat64 state
, aby sprawdzać stan NAT64.
$ sudo ot-ctl nat64 disable Done $ sudo ot-ctl nat64 state PrefixManager: Disabled Translator: Disabled Done
Po wyłączeniu urządzenie nie publikuje już prefiksu NAT64:
$ sudo ot-ctl netdata show Prefixes: fd4c:9574:3720:1::/64 paos low 0800 Routes: fd49:7770:7fc5:0::/64 s med 0800 Services: 44970 01 41000500000e10 s 0800 44970 5d fdd20e532b87b93f50ad4eea0450f1bfd11f s 0800 Done
Ponadto urządzenia w sieci Thread nie mają już dostępu do hosta IPv4 przez ten router graniczny.
W interfejsie wiersza poleceń naszego urządzenia końcowego Thread:
> ping 8.8.8.8 Error 13: InvalidState
Aby włączyć NAT64, użyj nat64 enable
. Może minąć trochę czasu, zanim menedżer prefiksu zacznie reklamować prefiks NAT64:
$ sudo ot-ctl nat64 enable Done $ sudo ot-ctl nat64 state PrefixManager: Idle Translator: NotWorking Done
Po kilku sekundach komponenty NAT64 powinny zacząć działać:
$ sudo ot-ctl nat64 state PrefixManager: Active Translator: Active Done $ sudo ot-ctl netdata show Prefixes: fd4c:9574:3720:1::/64 paos low 0800 Routes: fd49:7770:7fc5:0::/64 s med 0800 fd4c:9574:3720:2:0:0::/96 sn low 0800 Services: 44970 01 41000500000e10 s 0800 44970 5d fdd20e532b87b93f50ad4eea0450f1bfd11f s 0800 Done
Pamiętaj, że wyłączenie NAT64 spowoduje wyczyszczenie tabeli mapowania:
$ sudo ot-ctl nat64 mappings | | Address | | 4 to 6 | 6 to 4 | +------------------+-------------------------------------------------------------+--------+-------------------------+-------------------------+ | ID | IPv6 | IPv4 | Expiry | Pkts | Bytes | Pkts | Bytes | +------------------+------------------------------------------+------------------+--------+----------+--------------+----------+--------------+ Done
6. Przekazywanie zapytań DNS do nadrzędnych serwerów DNS
Gdy NAT64 jest włączony na routerze granicznym, OpenThread próbuje przekazywać zapytania DNS domen internetowych na wychodzące serwery DNS.
Ta funkcja jest obsługiwana przez wewnętrzny serwer DNS-SD, dlatego musisz upewnić się, że ten serwer jest włączony.
$ sudo ot-ctl srp server state running Done
Jeśli nie jest running
, włącz ją:
$ sudo ot-ctl srp server enable Done
Sprawdź, czy serwer proxy DNS jest włączony:
$ sudo ot-ctl dns server upstream Enabled Done
Jeśli nie jest Enabled
, włącz ją:
$ sudo ot-ctl dns server upstream enable Done
Na urządzeniach końcowych upewnij się, że klient SRP jest włączony, aby wysyłać zapytania DNS do routera granicznego:
> srp client state Enabled Done
Jeśli nie jest Enabled
, włącz ją:
> srp client autostart enable Done
Na urządzeniu końcowym sprawdź, czy domyślnym serwerem DNS jest router graniczny:
> dns config Server: [fdd2:0e53:2b87:b93f:50ad:4eea:0450:f1bf]:53 ResponseTimeout: 6000 ms MaxTxAttempts: 3 RecursionDesired: yes Done
Adres IPv6 serwera (w powyższym przykładzie fdd2:0e53:2b87:b93f:50ad:4eea:0450:f1bf
) powinien być jednym z adresów routera granicznego OpenThread.
Teraz możesz wysyłać zapytania DNS dla domen internetowych z urządzenia końcowego:
> dns resolve example.com DNS response for example.com. - 2606:2800:220:1:248:1893:25c8:1946 TTL:8720 Done > dns resolve4 example.com DNS response for example.com. - fd4c:9574:3720:2:0:0:5db8:d822 TTL:20456 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 z wątkami.
Więcej informacji
- Przewodniki na temat OpenThread
- Dokumentacja wiersza poleceń OpenThread
- Dokumentacja interfejsu OpenThread API dotycząca NAT64
- Dokumentacja OpenThread API na potrzeby nadrzędnego DNS
- Streszczenie platformy OpenThread dla DNS