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

Informacje o tym ćwiczeniu (w Codelabs)
schedule23 minuty
subjectOstatnia aktualizacja: 5 maja 2025
account_circleAutorzy: Song Guo, Jonathan Hui

1. Wprowadzenie

7299534792dd9439.png

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:

c3cd2e081bc052fd.png

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

Dokumenty referencyjne