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

1. 簡介

7299534792dd9439.png

什麼是執行緒?

Thread 是一種 IP 型低功耗網網路通訊協定,可讓裝置間的通訊成為裝置與雲端之間的通訊。執行緒網路可以適應拓撲變更,避免單點故障。

什麼是 OpenThread?

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

什麼是 OpenThread 邊界路由器?

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

NA64

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

屬於 NATThread 邊界路由器的 NAT64 轉譯器支援轉譯 TCP、UDP 與 ICMP (ICMPv6) 通訊協定。

建構項目

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

課程內容

  • 如何建立具備 NAT64 功能的 OpenThread 邊界路由器。
  • 如何與 Thread 結束裝置的 IPv4 主機通訊。

軟硬體需求

  • 一個 Linux 工作站,用於建構及更新 Thread NCP、OpenThread CLI 以及測試 IPv4 連線。
  • 為 Thread 邊界路由器提供 4 GB RAM 的 Raspberry Pi 4。你的 Linux 工作站應可透過 IPv4 存取。
  • 2 Nordic Semiconductor nRF52840 DK.

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

c3cd2e081bc052fd.png

2. 設定 OpenThread 邊界路由器

按照「Thread 邊界路由器 - 雙向 IPv6 連線能力」和「以 DNS 為基礎的服務探索程式碼研究室」中的「設定 OTBR 步驟」,建構 OpenThread 邊界路由器並進行下列變更:

在「Build and install OTBR」中,您必須將環境變數 NAT64 設為 1,並將 NAT64_SERVICE 設為 openthread,藉此指示指令碼以在 OpenThread 中啟用 NAT64 翻譯工具。執行下列指令之前:

$ export NAT64=1 NAT64_SERVICE=openthread

繼續撰寫執行緒邊界路由器 - 雙向 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 程式碼研究室設定「建立 Thread 的 FTDs」步驟,以建構和更新 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 echo 要求傳送至 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 主機,然後按下 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 主機,然後按下 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

幾秒後,NAT44 元件應能啟動並開始運作:

$ 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 伺服器

在邊框路由器啟用網路位址轉譯 (NAT)44 時,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 終端裝置提供網際網路存取權!

其他資訊

參考文件