1. はじめに
Thread とは何ですか?
Thread は、デバイス間の安全な通信とデバイス間の通信を可能にする IP ベースの低電力ワイヤレス メッシュ ネットワーク プロトコルです。Thread ネットワークはトポロジの変更に対応して単一点の障害を回避できます。
OpenThread とは
Google がリリースした OpenThread は、Thread® のオープンソース実装です。
OpenThread ボーダー ルーターとは
Google がリリースした OpenThread ボーダー ルーター(OTBR)は、Thread ボーダー ルーターのオープンソース実装です。
NAT64
NAT64 は、IPv6 専用ネットワークのホストが IPv4 ネットワーク内のリソースにアクセスできるようにするメカニズムです。NAT64 ゲートウェイは、IPv4 プロトコルと IPv6 プロトコル間のトランスレータです。
NAT64 トランスレータは、OpenThread ボーダー ルーターの一部として、TCP、UDP、ICMP(ICMPv6)プロトコルの変換をサポートしています。
作成するアプリの概要
この Codelab では、OpenThread ボーダー ルーターと Thread デバイスを設定し、インターネット上の Thread デバイスと IPv4 ホスト間の通信を有効化して検証します。
学習内容
- NAT64 機能を備えた OpenThread ボーダー ルーターの構築方法
- Thread エンドデバイスから IPv4 ホストと通信する方法。
必要なもの
- Thread NCP の構築とフラッシュ、OpenThread CLI、IPv4 接続のテストを行うための Linux ワークステーション。
- Thread ボーダー ルーター用の 4 GB の RAM を搭載した Raspberry Pi 4。Linux ワークステーションには、このデバイスから IPv4 経由でアクセス可能である必要があります。
- Nordic Semiconductor nRF52840 DK ボード 2 枚。
この Codelab のネットワーク トポロジ:
2. OpenThread ボーダー ルーターのセットアップ
Thread ボーダー ルーター - 双方向 IPv6 接続と DNS ベースのサービス ディスカバリの Codelab の OTBR の設定の手順に沿って、OpenThread ボーダー ルーターをビルドします。ただし、次の変更を行います。
OTBR をビルドしてインストールするには、環境変数 NAT64
を 1
に、NAT64_SERVICE
を openthread
に設定して、OpenThread で NAT64 トランスレータを有効にするようにスクリプトに指示する必要があります。この手順の前に次のコマンドを実行します。
$ export NAT64=1 NAT64_SERVICE=openthread
「Thread ボーダー ルーター - 双方向 IPv6 接続と DNS ベースのサービス ディスカバリ」Codelab に進みます。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
NAT 64 プレフィックスは、IPv4 ホストとの通信時に Thread デバイスによって使用されます。
3. Thread エンドデバイスのセットアップ
nRF52840 ボードを使用した Open Thread ネットワークの構築と OpenThread Codelab の 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_JOINER=ON -DOT_COMMISSIONER=ON -DOT_DNS_CLIENT=ON -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON
「Build a Thread network with nRF52840 boards and OpenThread Codelab」に進みます。エンドデバイスが CLI イメージでフラッシュされたら、Thread ボーダー ルーター - 双方向 IPv6 接続と DNS ベースのサービス ディスカバリに沿って 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 ネットワーク上のホストと通信できるようになりました。
IPv4 ホストに ICMP エコー リクエストを送信する
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 アドレスである必要があります。
常にボーダー ルーターでこのコマンドを実行し、トラフィックのカウント方法を確認してください。
IPv4 DNS サーバーに 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 を無効にするには nat64 disable
を使用します。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 プロキシが有効になっていることを確認します。
$ 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 ボーダー ルーターのアドレスの 1 つである必要があります。
これで、インターネット ドメインの 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 プラットフォーム抽象化