ZeroTier の会話には必ず二つの識別子が登場し、チャット画面では見間違えるほど似ています。ノード ID は端末を指します。ネットワーク ID は、その端末が参加したい仮想ネットワークを指します。参加に使うのは二つ目で、メンバーを承認するのは一つ目です。

二つの識別子、二つの役割

ノード ID は、サービスがマシン上で最初に動いたときに生成され、十文字の十六進アドレスです。ID ファイルが削除されるまでそのインストールに付随するため、再インストールすると誰も承認していない新しいメンバーが生まれることがあります。ネットワーク ID は十六文字の十六進表記で、マシンではなく仮想ネットワークを識別します。ネットワークを所有するコントローラ自身もノードであるため、ネットワーク ID の先頭十文字はコントローラのアドレスと一致します。

どちらの値も秘密ではなく、どちらかが他方の代わりになるものでもありません。ネットワーク ID を全参加者と共有するのは普通のことですが、ノード ID を共有するのは、一台の端末をコントローラに示すことです。

値を報告するコマンドから読む

一つのコマンドはローカルサービスの ID を報告し、別のコマンドは参加済みのネットワークを報告します。間違ったコマンドに値を尋ねると、メンバー一覧にネットワーク ID を貼り付ける結果になります。

zerotier-cli info
zerotier-cli status
zerotier-cli listnetworks

一つ目はノードのアドレスと、サービスがオンラインかどうかを出力します。二つ目はバージョンとポートの情報を加えます。三つ目は参加済みのネットワークを ID、状態、割り当てアドレスとともに一覧し、ネットワーク ID が必要なときに使うべき唯一のコマンドです。

ネットワークで参加し、ノードで承認する

参加コマンドは、コントローラを運用する人が渡したネットワーク ID を受け取ります。コマンドが前向きな応答を返すのは要求が送信されたという意味で、プライベートネットワークで参加が許可されたという意味ではありません。

参加後、管理者はそのネットワークのメンバー一覧で端末をノード ID によって承認します。ネットワーク ID を再び必要とすることはなく、ID がそのままアドレスなのでホスト名で端末を承認することもできません。管理者であれば、メンバー一覧を読み、要求とノードのアドレスを照合してください。ネットワークだけを示してノードのアドレスを示さない要求は実行できません。

共通の接頭辞には理由がある

ネットワーク ID はコントローラのノードアドレスで始まるため、同じ十文字が両方に現れます。これは経路指定の便宜であり、二つの値が交換可能だという示唆ではありません。

コントローラの ID が表示名より重要である理由もここにあります。新しい ID でコントローラを復元すると別のアドレス空間ができるため、古い ID の下で定義したネットワークは、名前を再利用しても同じネットワークではありません。

コントローラの ID は設定とともにバックアップに保存してください。その ID を再生成できるラベルとして扱うと、復元は設計のやり直しになります。

結果を検証する。コマンドの出力ではない

参加の成功は確認の始まりであり、終わりではありません。その後でネットワークの項目を見て、状態、割り当てアドレス、ネットワーク ID の三つの欄を読んでください。

zerotier-cli listnetworks -j
ip -br addr show | grep zt
ping -c 2 10.147.20.5

一つ目のコマンドは同じ一覧を解析しやすい形式で出力するので、管理者が期待した内容と比べやすくなります。二つ目はインターフェースがアドレスを受け取ったことを確認し、三つ目はローカルの状態ではなくネットワーク上の相手を試します。

項目が ACCESS_DENIED と言うなら、ノード ID が承認されていません。NOT_FOUND なら、ネットワーク ID が誤っています。アドレスなしで OK なら、次に問うべきはコントローラのアドレス割り当てであり、この三つのどれも再参加では解決しません。

関連記事