Router Thread Line – udostępnianie dostępu do internetu przez NAT64

1. Wprowadzenie

7299534792dd9439.png

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:

c3cd2e081bc052fd.png

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

Dokumentacja