Thread 邊界路由器 - 透過 NAT64 提供網際網路存取權

程式碼研究室簡介
schedule23 分鐘
subject上次更新時間:2025年5月5日
account_circle作者:Song Guo, Jonathan Hui

1. 簡介

7299534792dd9439.png

什麼是 Thread?

Thread 是一種 IP 架構的低耗電無線網格網路通訊協定,可實現安全的裝置對裝置和裝置對雲端通訊。Thread 網路可因應拓撲結構變更,避免單點故障。

什麼是 OpenThread?

Google 發布的 OpenThread 是 Thread® 的開放原始碼實作項目。

什麼是 OpenThread 邊界路由器?

Google 發布的 OpenThread Border Router (OTBR) 是 Thread 邊界路由器的開放原始碼實作項目。

NAT64

NAT64 是一種機制,可讓僅限 IPv6 網路中的主機存取 IPv4 網路中的資源。NAT64 閘道是 IPv4 和 IPv6 通訊協定之間的轉譯器。

NAT64 轉譯器是 OpenThread 邊界路由器的一部分,可轉譯 TCP、UDP 和 ICMP (ICMPv6) 通訊協定。

建構項目

在本程式碼研究室中,您將設定 OpenThread 邊界路由器 (OTBR) 和 Thread 裝置,然後透過 OpenThread 邊界路由器,啟用並驗證 Thread 裝置與網際網路上的 IPv4 主機之間的通訊。

課程內容

  • 如何建構具備 NAT64 功能的 OpenThread 邊界路由器。
  • 如何透過 Thread 端裝置與 IPv4 主機通訊。

軟硬體需求

  • Linux 工作站,用於建構及刷新 Thread RCP、OpenThread CLI,以及測試 IPv4 連線。
  • 用於 Thread 邊界路由器的 Raspberry Pi。您必須透過 IPv4 從此裝置存取 Linux 工作站。
  • 2 個 Nordic Semiconductor nRF52840 USB 轉接器 (一個用於 RCP,另一個用於 Thread 端裝置)。

本程式碼研究室的網路拓撲:

c3cd2e081bc052fd.png

2. 設定 OpenThread 邊界路由器

如要快速設定 OTBR,請按照OTBR 設定指南操作。

OTBR 設定完成後,請使用 ot-ctl 驗證邊界路由器是否已啟用 NAT64 服務:

> nat64 state
PrefixManager: Active
Translator: Active
Done

Thread 邊界路由器會在 Thread 網路資料中發布 NAT64 前置字:

> 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

NAT64 前置字串會顯示為含有 n 標記的路徑項目。在上述範例中,fd16:a3d:e170:2:0:0::/96 是 NAT64 前置字串。

與 IPv4 主機通訊時,Thread 裝置會使用 NAT64 前置字串。

3. 設定 Thread 端點裝置

請按照「使用 nRF52840 電路板和 OpenThread 程式碼研究室建立 Thread 網路」程式碼研究室的「設定 FTD」步驟,建立並閃記 nRF52840 CLI 終端裝置,但請變更下列步驟:

建構和閃燈中,您必須在呼叫 script/build 時,將 -DOT_DNS_CLIENT=ON-DOT_SRP_CLIENT=ON-DOT_ECDSA=ON 附加至指令列:

$ cd ~/src/ot-nrf528xx
$ rm -rf build
$ script/build nrf52840 USB_trans -DOT_DNS_CLIENT=ON -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON

請繼續參閱「使用 nRF52840 主機板和 OpenThread 程式碼研究室建構 Thread 網路」一文。使用 CLI 映像檔刷新終端裝置後,請按照「將第二個節點加入 Thread 網路」中的步驟,將 Thread 裝置加入 Thread 網路。

設定 Thread 端裝置後,請稍候幾秒,確認是否已成功加入 Thread 網路。如上所述,您可以在 Thread 網路資料中查看已發布的 NAT64 前置字元。

> 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

確認網路資料與 OTBR 的資料相符。

4. 透過 Thread 端裝置與 IPv4 主機通訊

您現在可以透過我們剛設定的裝置,與 IPv4 網路上的主機進行通訊。

向 IPv4 主機傳送 ICMP 回音要求

在 Thread 端裝置的 CLI 中:

> 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

邊界路由器會透過 nat64 mappings 指令為此裝置建立 NAT64 對應項目:

> 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

fd16:a3d:e170:1:492d:bcdb:9f72:6297 應為 Thread 裝置的 IPv6 位址。

您隨時可以在邊界路由器上執行這項指令,查看邊界路由器如何計算流量。

將 DNS 查詢傳送至 IPv4 DNS 伺服器

使用 dns resolve4 解析 IPv4 網路上的主機名稱。DNS 伺服器位址也可以是 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

透過 TCP 進行通訊

您可以在 IPv4 網路中,在終端裝置和主機之間建立 TCP 連線。

假設 Linux IPv4 主機的 IP 位址為 192.168.0.2

在 Linux IPv4 主機上,使用 nc 監聽 TCP 連線:

$ nc -l 0.0.0.0 12345

從 Thread 端裝置建立 TCP 連線,並將訊息傳送至 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

Linux IPv4 主機會輸出:

hello

您也可以從 Linux IPv4 主機將訊息傳送至 Thread 端點裝置。在執行 nc 的 Linux IPv4 主機上輸入「world」並按下 Enter 鍵,執行緒端裝置會輸出以下內容:

TCP: Received 6 bytes: world

透過 UDP 進行通訊

在 IPv4 網路中,Thread 裝置和主機之間可以使用 UDP 通訊。

假設 Linux IPv4 主機的 IP 位址為 192.168.0.2

使用 nc 監聽 UDP 連線:

$ nc -u -l 0.0.0.0 12345

從 Thread 端裝置建立 UDP 連線,並傳送訊息至 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

Linux IPv4 主機會輸出:

hello

您也可以從 Linux IPv4 主機將訊息傳送至 Thread 端點裝置。在執行 nc 的 Linux IPv4 主機上輸入「world」,然後按下 Enter 鍵,執行緒端裝置會輸出以下內容:

6 bytes from fd16:a3d:e170:2:0:0:c0a8:2 12345 world

5. 在邊界路由器上切換 NAT64

您隨時可以啟用或停用 NAT64。使用 nat64 disable 停用 NAT64。並使用 nat64 state 查看 NAT64 的狀態。

> nat64 disable
Done
> nat64 state
PrefixManager: Disabled
Translator: Disabled
Done

停用後,裝置就不會再發布 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

此外,Thread 網路中的裝置也無法再透過這個邊界路由器存取 IPv4 主機。

在 Thread 端裝置的 CLI 中:

> ping 8.8.8.8
Error 13: InvalidState

使用 nat64 enable 啟用 NAT64。前置詞管理工具可能需要一段時間,才能開始宣告 NAT64 前置詞:

> nat64 enable
Done
> nat64 state
PrefixManager: Idle
Translator: NotWorking
Done

幾秒後,NAT64 元件應會啟動並運作:

> 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

請注意,停用 NAT64 會清除對應表:

> 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. 將 DNS 查詢轉送至上游 DNS 伺服器

在邊界路由器上啟用 NAT64 後,OpenThread 會嘗試將網際網路網域的 DNS 查詢轉送至上游 DNS 伺服器。

在終端裝置上,確認預設 DNS 伺服器是邊界路由器:

> 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

伺服器 IPv6 位址 (上例中的 fd4d:b3e5:9738:3193:39c4:ee02:ca9e:2b1d) 應為 OpenThread 邊界路由器的其中一個位址。

您現在可以從終端裝置傳送網際網路網域的 DNS 查詢:

> 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. 恭喜

恭喜!您已成功設定支援 NAT64 的邊界路由器,並使用該路由器為 Thread 終端裝置提供網際網路存取權!

延伸閱讀

參考文件