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

1. Wprowadzenie

7299534792dd9439.png

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:

c3cd2e081bc052fd.png

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-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

Dokumentacja