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

透過集合功能整理內容 你可以依據偏好儲存及分類內容。

1. 簡介

7299534792dd9439.png

什麼是 Thread?

Thread 是符合 IP 架構的低功耗無線網狀網路通訊協定,可讓裝置與裝置之間進行雲端通訊通訊。執行緒網路可因應拓撲變化進行調整,以避免單點故障。

什麼是 OpenThread?

Google 釋出的 OpenThread 是 Thread® 的開放原始碼實作。

什麼是 OpenThread Border 路由器?

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

網路位址轉譯 (NAT64)

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

NAT64 翻譯工具屬於 OpenThread Border 路由器的一部分,可支援翻譯 TCP、UDP 和 ICMP (ICMPv6) 通訊協定。

建構項目

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

課程內容

  • 如何使用 NAT64 功能建構 OpenThread 邊界路由器。
  • 如何與執行緒執行緒裝置與 IPv4 主機通訊。

軟硬體需求

  • 用於建構及重新整理 Thread NCP、OpenThread CLI 及測試 IPv4 連線的 Linux 工作站。
  • Raspberry Pi 4,具備 4 GB RAM 供 Thread 邊界路由器使用。您的 Linux 工作站必須可透過這部裝置的 IPv4 連線。
  • 2 個北歐半導體 nRF52840 DK 電路板。

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

c3cd2e081bc052fd.png

2. 設定 OpenThread 邊界路由器

按照「Thread Border Router 的設定 OTBR 步驟 - Bidirectional IPv6 Connectivity and DNS-Based Service Discovery」程式碼研究室,建立 OpenThread 邊框路由器,並執行下列變更:

在「Build and install OTBR」(建構及安裝 OTBR) 中,您需要將指令碼 NAT64 設為 1,並將 NAT64_SERVICE 設為 openthread,藉此指示指令碼在 OpenThread 中啟用 NAT64 轉譯器。在開始執行前執行下列指令:

$ export NAT64=1 NAT64_SERVICE=openthread

請繼續編寫 Thread Border 路由器 - 雙向 IPv6 連線和 DNS 型服務探索程式碼研究室。建立執行緒網路後,您可以透過 OpenThread CLI 指令驗證邊框路由器正在發布 NAT64 前置字串。

首先,請確認邊框路由器已啟動且正在執行邊框,且 NAT64 已啟用在邊界路由器上:

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

我們應該可以看到 OTBR 是執行緒領導,且執行緒網路資料中有一個 NAT64 前置字串 (在此範例中為 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

執行緒裝置與 IPv4 主機通訊時會使用 NAT64 前置字串。

3. 設定 Thread 終端裝置

按照「使用 nRF52840 板和 OpenThread 程式碼研究室建立 FTD 步驟」一文中的操作說明,建立 nRF52840 CLI 結束裝置並刷新,以便變更下列步驟:

建構與刷新作業中,您必須在呼叫 script/build 時將 -DOT_DNS_CLIENT=ON 附加至指令列:

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

請繼續閱讀使用 nRF52840 電路板和 OpenThread 程式碼研究室建構執行緒網路。使用 CLI 映像檔刷新裝置結尾的裝置後,請遵循「Thread Border Router - Bidirectional IPv6 Connectivity and DNS-Based Service Discovery」來設定 Thread 結束裝置。

完成 Thread 裝置設定後等待幾秒鐘,確認加入 Thread 網路是否成功。您應能在網路資料 (這裡為 fd4c:9574:3720:2:0:0::/96) 中尋找 NAT64 前置字串:

> 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

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

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

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

將 ICMP 回呼要求傳送至 IPv4 主機

透過 Thread 結束裝置的 CLI 執行:

> 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

邊界路由器會透過 nat64 mappings 指令為這部裝置建立網路位址轉譯 (NAT64) 對應項目:

$ 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

fd4c:9574:3720:1:1d61:b4c1:494f:f975 應為 Thread 裝置的 IPv6 位址。

您只要在邊界路由器上執行這個指令,即可查看流量的計算方式。

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

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

透過 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: fd4c:9574:3720:2:0:0:c0a8:2
Done
> tcp send hello

您的 Linux IPv4 主機輸出:

hello

您也可以透過 Linux IPv4 主機傳送訊息至 Thread 終端裝置。輸入「世界」,並在執行 nc 的 Linux IPv4 主機上按 Enter 鍵,以及 Thread 結束裝置輸出:

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: fd4c:9574:3720:2:0:0:c0a8:2
Done
> udp send hello
Done

您的 Linux IPv4 主機輸出:

hello

您也可以透過 Linux IPv4 主機傳送訊息至 Thread 終端裝置。輸入「世界」,並在執行 nc 的 Linux IPv4 主機上按 Enter 鍵,以及 Thread 結束裝置輸出:

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

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

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

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

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

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

透過 Thread 結束裝置的 CLI 執行:

> ping 8.8.8.8
Error 13: InvalidState

使用 nat64 enable 啟用 NAT64。前置字元管理工具可能需要一些時間才會開始支援 NAT64 前置字元:

$ sudo ot-ctl nat64 enable
Done
$ sudo ot-ctl nat64 state
PrefixManager: Idle
Translator: NotWorking
Done

幾秒後,NAT64 元件應該可以啟動並執行:

$ 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

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

$ sudo ot-ctl nat64 mappings
|                  | Address                                                     |        | 4 to 6                  | 6 to 4                  |
+------------------+-------------------------------------------------------------+--------+-------------------------+-------------------------+
| ID               | IPv6                                     | IPv4             | Expiry | Pkts     | Bytes        | Pkts     | Bytes        |
+------------------+------------------------------------------+------------------+--------+----------+--------------+----------+--------------+
Done

6. 恭喜

恭喜!您已成功設定支援網路位址轉譯 (NAT66) 的邊界路由器,以便透過網際網路提供 Thread 終端裝置連線!

延伸閱讀

參考文件