1. 簡介
什麼是 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 端裝置)。
本程式碼研究室的網路拓撲:
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 終端裝置提供網際網路存取權!
延伸閱讀
- OpenThread 指南
- OpenThread CLI 參考資料
- NAT64 適用的 OpenThread API 參考資料
- 上游 DNS 的 OpenThread API 參考資料
- DNS 的 OpenThread 平台抽象化