Router granic wątków – zapewnianie dostępu do internetu przez NAT64

1. Wprowadzenie

7299534792dd9439.png

Co to jest Thread?

Thread to oparty na adresach IP protokół sieci bezprzewodowej typu mesh o niskim poborze energii, który umożliwia bezpieczną komunikację między urządzeniami i chmurą. Sieci Thread mogą dostosowywać się do zmian topologii, aby uniknąć awarii pojedynczych punktów.

Co to jest OpenThread?

OpenThread wydane przez Google to implementacja Thread® typu open source.

Co to jest router granic OpenThread?

Opublikowany przez Google rozwiązanie OpenThread Border Router (OTBR) to implementacja open source routera Border Router.

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 służy do tłumaczenia między protokołami IPv4 a protokołami IPv6.

Tłumacz NAT64 w ramach routera granic OpenThread obsługuje protokoły TCP, UDP i ICMP (ICMPv6).

Co utworzysz

W ramach tego ćwiczenia w Codelabs dowiesz się, jak skonfigurować router granic OpenThread i urządzenie Thread, a następnie włączyć i zweryfikować komunikację między urządzeniami Thread a hostami IPv4 w internecie przy użyciu routera granic 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 służąca do tworzenia i flashowania NCP Thread, interfejsu wiersza poleceń OpenThread oraz testowania połączeń IPv4.
  • Raspberry Pi 4 z 4 GB pamięci RAM do routera granicznego Thread. Twoja stacja robocza z Linuksem powinna być osiągalna przez IPv4 z tego urządzenia.
  • 2 płytki Nordic Semiconductor nRF52840 DK.

Topologia sieci na potrzeby tego ćwiczenia z programowania:

c3cd2e081bc052fd.png

2. Skonfiguruj router granic OpenThread

Wykonaj czynności opisane w kroku „Skonfiguruj OTBR” routera granic wątków – dwukierunkowe połączenia IPv6 i ćwiczenie z programowania oparte na DNS, aby utworzyć router graniczny OpenThread z następującą zmianą:

W sekcji kompilacji i instalacji OTBR musisz nakazać 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

Wykonaj dalsze ćwiczenia z programowania dotyczące routera granic wątków – dwukierunkowe połączenia IPv6 i wykrywania usług opartego na DNS. Po wybraniu opcji Tworzenie sieci Thread możesz sprawdzić, czy router brzegowy publikuje prefiks NAT64, korzystając z poleceń interfejsu wiersza poleceń OpenThread.

Najpierw upewnij się, że router brzegowy działa i że działa NAT64:

$ sudo ot-ctl state
leader
Done
$ sudo ot-ctl nat64 enable
Done
$ sudo ot-ctl nat64 state
PrefixManager: Active
Translator: Active
Done

Powinno być widoczne, że OTBR działa jako lider Thread, a w danych sieciowych Thread zawiera 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

Prefiks NAT64 będzie używany przez urządzenia Thread podczas komunikacji z hostem IPv4.

3. Skonfiguruj urządzenie końcowe Thread

Wykonaj czynności opisane w kroku „Set up the FTDs” (Skonfiguruj FTD) w ramach tworzenia sieci Thread przy użyciu tablic nRF52840 i ćwiczeń z programowania OpenThread, aby skompilować i zainstalować urządzenie końcowe nRF52840 interfejsu wiersza poleceń, z uwzględnieniem tego kroku:

W Build i flash musisz dodać -DOT_DNS_CLIENT=ON, -DOT_SRP_CLIENT=ON i -DOT_ECDSA=ON do wiersza poleceń 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

Wykonaj czynności opisane w części Tworzenie sieci Thread przy użyciu tablic nRF52840 i ćwiczenie z programowania OpenThread. Gdy na urządzeniu końcowym pojawi się obraz interfejsu wiersza poleceń, postępuj zgodnie z instrukcjami w sekcji Thread Border Router – dwukierunkowe połączenia IPv6 i wykrywanie usług oparte na DNS, aby skonfigurować urządzenie końcowe Thread.

Po skonfigurowaniu urządzenia Thread poczekaj kilka sekund i sprawdź, czy udało się dołączyć do sieci Thread. Prefiks NAT64 powinien być widoczny w danych sieciowych (w naszym 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 OTBR.

4. Komunikacja z hostami IPv4 z urządzenia końcowego Thread

Teraz możesz komunikować się z hostami w sieci IPv4 ze skonfigurowanego właśnie urządzenia końcowego.

Wysyłanie żądań echa ICMP do hostów IPv4

W interfejsie wiersza poleceń 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 brzegowy tworzy element mapowania NAT64 dla tego urządzenia 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

Wartość fd4c:9574:3720:1:1d61:b4c1:494f:f975 powinna być adresem IPv6 urządzenia Thread.

W dowolnym momencie uruchom je na routerze granicznym, aby sprawdzić, jak zlicza ruch.

Wysyłaj zapytania DNS do serwerów DNS IPv4

Użyj polecenia 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: 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żliwe jest nawiązanie połączeń TCP między urządzeniem końcowym a hostami w sieci IPv4.

Załóżmy, że adres IP hosta IPv4 z systemem Linux to 192.168.0.2.

Na hoście IPv4 z systemem Linux użyj adresu nc, aby nasłuchiwać połączeń TCP:

$ nc -l 0.0.0.0 12345

Nawiąż połączenie TCP z urządzenia końcowego Thread i wyślij komunikaty do hosta IPv4 z systemem 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

Host z systemem Linux IPv4:

hello

Możesz też wysyłać wiadomości z hosta IPv4 z systemem Linux na urządzenie końcowe Thread. Wpisz „świat” i naciśnij Enter na hoście IPv4 z systemem Linux, na którym działa nc. Odpowiedź urządzenia końcowego Thread:

TCP: Received 6 bytes: world

Komunikacja przez UDP

Możliwe jest komunikację za pomocą protokołu UDP między urządzeniami Thread a hostami w sieci IPv4.

Załóżmy, że adres IP hosta IPv4 z systemem Linux to 192.168.0.2.

Użyj nc do nasłuchiwania połączeń UDP:

$ nc -u -l 0.0.0.0 12345

Z urządzenia końcowego Thread ustanowij połączenie UDP i wyślij wiadomości do hosta IPv4 z Linuksem:

> 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

Host z systemem Linux IPv4:

hello

Możesz też wysyłać wiadomości z hosta IPv4 z systemem Linux na urządzenie końcowe Thread. Wpisz „świat” i naciśnij Enter na hoście IPv4 z systemem Linux, na którym działa nc. Odpowiedź urządzenia końcowego Thread:

6 bytes from fd4c:9574:3720:2:0:0:c0a8:2 12345 world

5. Przełącz NAT64 na routerze granicznym

Usługę NAT64 możesz w każdej chwili włączyć lub wyłączyć. Aby wyłączyć NAT64, użyj nat64 disable. Użyj nat64 state, aby sprawdzić stan NAT64.

$ sudo ot-ctl nat64 disable
Done
$ sudo ot-ctl nat64 state
PrefixManager: Disabled
Translator: Disabled
Done

Po wyłączeniu urządzenie nie będzie już publikować 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

Również urządzenia w sieci Thread nie mają już dostępu do hosta IPv4 za pomocą tego routera brzegowego.

W interfejsie wiersza poleceń urządzenia końcowego Thread:

> ping 8.8.8.8
Error 13: InvalidState

Aby włączyć NAT64, użyj polecenia nat64 enable. Może minąć trochę czasu, zanim menedżer prefiksów 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 być już uruchomione:

$ 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 na routerze granicznym włączona jest usługa NAT64, OpenThread będzie próbowała przekierować zapytania DNS dotyczące domen internetowych do nadrzędnych serwerów DNS.

Ta funkcja jest obsługiwana przez wewnętrzny serwer DNS-SD, więc musisz się upewnić, że serwer DNS-SD jest włączony.

$ sudo ot-ctl srp server state
running
Done

Jeśli jest inna niż running, włącz ją:

$ sudo ot-ctl srp server enable
Done

Sprawdź, czy nadrzędny serwer proxy DNS jest włączony:

$ sudo ot-ctl dns server upstream
Enabled
Done

Jeśli jest inna niż 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 brzegowego:

> srp client state
Enabled
Done

Jeśli jest inna niż Enabled, włącz ją:

> srp client autostart enable
Done

Upewnij się, że na urządzeniu końcowym domyślnym serwerem DNS jest router brzegowy:

> dns config
Server: [fdd2:0e53:2b87:b93f:50ad:4eea:0450:f1bf]:53
ResponseTimeout: 6000 ms
MaxTxAttempts: 3
RecursionDesired: yes
Done

Adres IPv6 serwera (fdd2:0e53:2b87:b93f:50ad:4eea:0450:f1bf w przykładzie powyżej) powinien być jednym z adresów routera granicznego OpenThread.

Teraz możesz wysyłać zapytania DNS do 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

Gratulujemy! Udało Ci się skonfigurować router graniczny z obsługą NAT64 i użyć go, aby zapewnić dostęp do internetu urządzeniom końcowym Thread.

Więcej informacji

Dokumenty referencyjne