1. 簡介
什麼是 Thread?
Thread 是一種以 IP 為基礎的低功率無線網狀網路通訊協定,可保護裝置之間和裝置之間的通訊。Thread 網路可根據拓撲變更,避免單點故障。
什麼是 OpenThread?
Google 發布的 OpenThread 是 Thread® 的開放原始碼實作方式。
什麼是 OpenThread 邊界路由器?
Google 發行的 OpenThread 邊界路由器 (OTBR) 是 Thread 邊界路由器的開放原始碼實作。
NAT64
NAT64 是一種機制,可讓僅限 IPv6 網路中的主機存取 IPv4 網路中的資源。NAT64 閘道是 IPv4 通訊協定和 IPv6 通訊協定之間的轉譯器。
作為 OpenThread 邊界路由器的一部分 NAT64 翻譯器,支援 TCP、UDP 與 ICMP (ICMPv6) 通訊協定的翻譯。
建構項目
在本程式碼研究室中,您將設定 OpenThread 邊界路由器和 Thread 裝置,然後透過 OpenThread 邊界路由器啟用並驗證網際網路上的 Thread 裝置和 IPv4 主機之間的通訊。
課程內容
- 如何建構具有 NAT64 功能的 OpenThread 邊界路由器。
- 如何透過 Thread 端裝置與 IPv4 主機通訊。
軟硬體需求
- Linux 工作站,用於建構及刷新 Thread NCP、OpenThread CLI,以及測試 IPv4 連線。
- 搭載 Thread 邊界路由器的 Raspberry Pi 4。Linux 工作站應可透過 IPv4 連線。
- 2 北歐半導體 nRF52840 DK 主機。
本程式碼研究室的網路拓撲:
2. 設定 OpenThread 邊界路由器
請按照「Thread 邊界路由器 - 雙向 IPv6 連線和 DNS 型服務探索」程式碼研究室的設定 OTBR 步驟操作,建構 OpenThread 邊界路由器,變更如下:
在「建構並安裝 OTBR」中,您需要將環境變數 NAT64
設為 1
,並將 NAT64_SERVICE
設為 openthread
,指示指令碼在 OpenThread 中啟用 NAT64 翻譯工具。在步驟之前執行下列指令:
$ export NAT64=1 NAT64_SERVICE=openthread
繼續參閱「Thread 邊界路由器 - 雙向 IPv6 連線和 DNS 式服務探索」程式碼研究室。建立 Thread 網路後,您可以使用 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 是 Thread 領導者,且 Thread 網路資料中有一個 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 主機通訊時,Thread 裝置會使用 NAT64 前置字元。
3. 設定 Thread 結束裝置
按照「使用 nRF52840 主機板和 OpenThread 程式碼研究室設定 Build a Thread 網路」的步驟,建構並刷新 nRF52840 CLI 端裝置,變更以下步驟:
在「Build and flash」中,呼叫 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_JOINER=ON -DOT_COMMISSIONER=ON -DOT_DNS_CLIENT=ON -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON
繼續編寫使用 nRF52840 主機板和 OpenThread 程式碼研究室建構 Thread 網路。使用 CLI 映像檔刷新裝置後,請按照 Thread 邊界路由器 - 雙向 IPv6 連線和 DNS 型服務探索的指示設定 Thread 端裝置。
設定 Thread 端裝置後,請稍待幾秒,確認能否成功加入 Thread 網路。您應該可以在網路資料中找到 NAT64 前置字串 (在本範例中為 fd4c:9574:3720:2:0:0::/96
):
> 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 端裝置。輸入「world」,然後在執行 nc
的 Linux IPv4 主機上按下 Enter 鍵,Thread 裝置端就會輸出以下項目:
TCP: Received 6 bytes: world
透過 UDP 進行通訊
您可以在 Thread 裝置和 IPv4 網路中的主機之間使用 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 端裝置。輸入「world」,然後在執行 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. 將 DNS 查詢轉送至上游 DNS 伺服器
當邊界路由器啟用 NAT64 時,OpenThread 會嘗試將網際網路網域的 DNS 查詢轉送至上游 DNS 伺服器。
內部 DNS-SD 伺服器支援此功能,因此您必須啟用 DNS-SD 伺服器。
$ sudo ot-ctl srp server state running Done
如果它不是 running
,請啟用:
$ sudo ot-ctl srp server enable Done
確認已啟用上游 DNS Proxy:
$ sudo ot-ctl dns server upstream Enabled Done
如果它不是 Enabled
,請啟用:
$ sudo ot-ctl dns server upstream enable Done
如果是端裝置,請確認 SRP 用戶端已啟用,以便傳送 DNS 查詢至邊界路由器:
> srp client state Enabled Done
如果它不是 Enabled
,請啟用:
> srp client autostart enable Done
確認裝置的預設 DNS 伺服器是邊界路由器:
> dns config Server: [fdd2:0e53:2b87:b93f:50ad:4eea:0450:f1bf]:53 ResponseTimeout: 6000 ms MaxTxAttempts: 3 RecursionDesired: yes Done
伺服器 IPv6 位址 (上述範例中的 fdd2:0e53:2b87:b93f:50ad:4eea:0450:f1bf
) 必須是 OpenThread 邊界路由器的其中一個位址。
您現在可以透過端裝置傳送網際網路網域的 DNS 查詢:
> dns resolve example.com DNS response for example.com. - 2606:2800:220:1:248:1893:25c8:1946 TTL:8720 Done > dns resolve4 example.com DNS response for example.com. - fd4c:9574:3720:2:0:0:5db8:d822 TTL:20456 Done
7. 恭喜
恭喜,您已成功設定支援 NAT64 的邊界路由器,並使用該路由器讓 Thread 端裝置的網際網路連線!
延伸閱讀
- OpenThread 指南
- OpenThread CLI 參考資料
- NAT64 的 OpenThread API 參考資料
- 上游 DNS 的 OpenThread API 參考資料
- DNS 的 OpenThread 平台抽象層