このドキュメントはソフトウェア開発者を対象に書かれています。 ZeroTier の使用方法については、Web サイト、ドキュメント サイト、およびディスカッション フォーラムを参照してください。
ZeroTier は、地球用のスマートでプログラム可能なイーサネット スイッチです。これにより、ネットワークに接続されたすべてのデバイス、VM、コンテナ、アプリケーションが、すべて同じ物理データ センターまたはクラウド リージョンに存在するかのように通信できるようになります。
これは、暗号化アドレス指定された安全なピアツーピア ネットワーク (VL1 と呼ばれる) と、VXLAN に似たイーサネット エミュレーション層 (VL2 と呼ばれる) を組み合わせることで実現されます。当社の VL2 イーサネット仮想化レイヤーには、ネットワークのマイクロセグメンテーションやセキュリティ監視のためのきめ細かいアクセス制御ルールなどの高度なエンタープライズ SDN 機能が含まれています。
すべての ZeroTier トラフィックは、お客様のみが管理する秘密キーを使用してエンドツーエンドで暗号化されます。ほとんどのトラフィック フローはピアツーピアですが、ピアツーピア接続を確立できないユーザーのために無料 (ただし低速) 中継を提供します。
ZeroTier の目標と設計原則は、とりわけ元の Google BeyondCorp 論文と Jericho フォーラムの「非境界化」の概念からインスピレーションを受けています。
詳細および事前に構築されたバイナリ パッケージについては、ZeroTier のサイトにアクセスしてください。 Android および iOS 用のアプリは、Google Play および Apple アプリ ストアから無料で入手できます。
ZeroTier は、BSL バージョン 1.1 に基づいてライセンスされています。詳細については、LICENSE.txt と ZeroTier の価格ページを参照してください。 ZeroTier は、企業および学術機関の内部および非営利目的で無料で使用できます。 ZeroTier に基づいてクローズドソースのアプリやデバイスを構築したり、ZeroTier ネットワーク コントローラーやネットワーク管理を SaaS サービスとして提供したりするなど、特定の種類の商用利用には商用ライセンスが必要です。
ZeroTier には少量のサードパーティ コードも含まれていますが、BSL ライセンスの対象ではありません。サードパーティコードのリスト、それが含まれる場所、およびそれに適用されるライセンスについては、AUTHORS.md を参照してください。 ZeroTier のサードパーティ コードはすべて、自由にライセンスされています (MIT、BSD、Apache、パブリック ドメインなど)。
ZeroTier の世界のすべては、40 ビット/10 桁のZeroTier アドレスと 64 ビット/16 桁のネットワーク IDの 2 種類の識別子によって制御されます。これらの識別子は、その長さによって簡単に区別できます。 ZeroTier アドレスはノードまたは「デバイス」 (ラップトップ、電話、サーバー、VM、アプリなど) を識別し、ネットワーク ID はデバイスが参加できる仮想イーサネット ネットワークを識別します。
ZeroTier アドレスは、VLAN をサポートする地球規模の巨大なエンタープライズ イーサネット スマート スイッチ上のポート番号と考えることができます。ネットワーク ID は、これらのポートを割り当てることができる VLAN ID です。 1 つのポートを複数の VLAN に割り当てることができます。
ZeroTier アドレスは8056c2e21c
のようになり、ネットワーク ID は8056c2e21c000001
のようになります。ネットワーク ID は、そのネットワークのプライマリ コントローラの ZeroTier アドレスと、このコントローラ上のネットワークを識別する任意の 24 ビット ID で構成されます。ネットワーク コントローラーは、OpenFlow などの SDN プロトコルの SDN コントローラーにほぼ似ていますが、VXLAN と VL2 の類似点と同様、これをプロトコルや設計が同じであると解釈するべきではありません。 my.zerotier.com で便利で安価な SaaS ホスト型コントローラーを使用することも、JSON 構成ファイルをいじったり、そのためのスクリプトを作成したりしても構わない場合は、独自のコントローラーを実行することもできます。
基本パスには、ZeroTier One サービスのメイン エントリ ポイント ( one.cpp
)、セルフ テスト コード、メイクファイルなどが含まれます。
artwork/
: アイコン、ロゴなどattic/
: 参照用に残しておきたい古いものと実験的なコード。controller/
: リファレンス ネットワーク コントローラー実装。デスクトップおよびサーバーのビルド ターゲットにデフォルトでビルドおよび組み込まれます。debian/
: Linux 上で Debian パッケージを構築するためのファイル。doc/
: マニュアルページおよびその他のドキュメント。ext/
: サードパーティのライブラリ、一部のプラットフォーム (Mac および Windows) での便宜のために出荷されるバイナリ、およびインストール サポート ファイル。include/
: ZeroTier コアのファイルをインクルードします。java/
: Android モバイル アプリで使用される JNI ラッパー。 (Android アプリ全体はオープンソースではありませんが、将来オープンソースになる可能性があります。)node/
: ZeroTier 仮想イーサネット スイッチ コア。コードの残りの部分から完全に分離されるように設計されており、スタンドアロンの OS に依存しないライブラリとして構築できます。開発者への注意: C++11 サポートのない古い組み込みプラットフォーム上にこれを構築したいため、ここでは C++11 機能を使用しないでください。 C++11 は他の場所でも使用できます。osdep/
: 特定のターゲット向けにのみ構築されたプラットフォーム固有のものを含む、OS をサポートおよび統合するためのコード。rule-compiler/
: ネットワークレベルのルールを定義するための JavaScript ルール言語コンパイラ。service/
: ZeroTier One サービス。ZeroTier コアをラップし、デスクトップ、ラップトップ、サーバー、VM、コンテナーの仮想ネットワークへの VPN のような接続を提供します。windows/
: Visual Studio ソリューション ファイル、Windows サービス コード、および Windows タスク バー アプリ UI。zeroidc/
: SSO 対応ネットワークにログインするために ZeroTier サービスによって使用される OIDC 実装。 (この部分は Rust で書かれており、将来的にはさらに多くの Rust がこのリポジトリに登場する予定です。)dev
ブランチからリクエストをプルしてください。
リリースは、 dev
main
にマージし、タグ付けしてビルドを実行することによって行われます。
Mac と Linux でビルドするには、 make
と入力するだけです。 FreeBSD および OpenBSD ではgmake
(GNU make) が必要で、パッケージまたはポートからインストールできます。 Windows の場合、 windows/
に Visual Studio ソリューションがあります。
gmake
と入力してビルドします。binutils
が必要です。 pkg install binutils
と入力してインストールします。/dev/tap0
から/dev/tap3
まで)、ネットワーク メンバーシップは 4 つに制限されています。gmake
と入力してビルドします。 make selftest
と入力すると、さまざまな内部を単体テストし、ビルド環境のいくつかの側面についてレポートするゼロ層セルフテストバイナリが構築されます。これを新しいプラットフォームやアーキテクチャで試してみることをお勧めします。
-h
オプションを指定してzerotier-oneを実行すると、ヘルプが表示されます。
Linux および BSD では、ソースからビルドした場合は、次のコマンドでサービスを開始できます。
sudo ./zerotier-one -d
ほとんどのディストリビューション、macOS、および Windows では、インストーラーがサービスを開始し、起動時に開始するように設定します。
システムのホーム フォルダーが自動的に作成されます。
このサービスは JSON API を介して制御され、デフォルトでは127.0.0.1:9993
で利用可能です。また、 0.0.0.0:9993
もリッスンしますが、これはlocal.conf
でallowManagementFrom
が適切に設定されている場合にのみ使用できます。ネットワークへの参加やネットワークからの離脱などの標準的なことを行うための API 呼び出しを行うために、 zerotier-cliコマンド ライン ユーティリティが含まれています。ホーム フォルダー内のauthtoken.secretファイルには、この API にアクセスするためのシークレット トークンが含まれています。 API ドキュメントについては、service/README.md を参照してください。
各 OS でホーム フォルダーが (デフォルトで) 存在する場所は次のとおりです。
/var/lib/zerotier-one
/var/db/zerotier-one
/Library/Application Support/ZeroTier/One
ProgramDataZeroTierOne
(これがデフォルトです。Windows が非標準のドライブ文字割り当てまたはレイアウトでインストールされている場合、ベースの「共有アプリ データ」フォルダーは異なる可能性があります。)ほとんどのユーザーにとって、それは問題なく機能します。
ローカル システム ファイアウォールを実行している場合は、ゼロ階層を許可するルールを追加することをお勧めします。 Windows 用のバイナリをインストールした場合、これは自動的に行われます。他のプラットフォームでは、構成に応じてローカル ファイアウォール ルールを手動で編集する必要がある場合があります。
詳細については、ドキュメント サイトを参照してください。
Mac ファイアウォールは、システム環境設定の「セキュリティ」にあります。 Linux には、さまざまなファイアウォール構成システムとツールがあります。
CentOS では、 /etc/sysconfig/iptables
で IPTables ルールを確認します。他のディストリビューションについては、ディストリビューションのドキュメントを参照してください。また、Little Snitch (Mac)、McAfee Firewall Enterprise (Windows) などの商用サードパーティ製ファイアウォール アプリケーションを実行している場合は、その UI やドキュメントも確認する必要があります。一部の企業環境ではファイアウォール ソフトウェアが集中管理されている場合があるため、IT 部門への連絡も必要になる場合があります。
ZeroTier One ピアは、受信側の UDP ポート 9993 が開いている場合、自動的に互いの位置を特定し、ローカル有線 LAN 経由で直接通信します。そのポートがフィルタリングされている場合、互いの LAN アナウンス パケットを見ることができなくなります。同じ物理ネットワーク上のデバイス間でパフォーマンスの低下が発生している場合は、ファイアウォール設定を確認してください。 LAN 自動位置情報がない場合、ピアは「ループバック」NAT トラバーサルを試行する必要がありますが、失敗する場合があり、いずれの場合もすべてのパケットが外部ルーターを 2 回トラバースする必要があります。
特定の種類のファイアウォールや「対称」NAT デバイスの内側にいるユーザーは、外部ピアに直接接続できない場合があります。 ZeroTier はポート予測のサポートが制限されており、対称 NAT を通過しようとしますが、これは常に機能するとは限りません。 P2P 接続が失敗すると、UDP パケットがリレー サーバーからバウンスされることになり、パフォーマンスが低下します。一部の NAT ルーターには構成可能な NAT モードがあり、これを「フル コーン」に設定すると、この問題が解決されます。これを実行すると、VoIP 電話、Skype、BitTorrent、WebRTC、特定のゲームなどでも魔法のような改善が見られるかもしれません。これらはすべて、私たちの技術と同様の NAT トラバーサル技術を使用しているからです。
ユーザーとインターネット間のファイアウォールが ZeroTier の UDP トラフィックをブロックした場合は、ポート 443 経由のルートサーバーへの最後の手段である TCP トンネリング (https 偽装) にフォールバックします。これはほぼどこでも機能しますが、UDP や直接ピアツーピア接続と比較すると非常に遅くなります。
追加のヘルプはナレッジベースで見つけることができます。
Prometheus メトリクスは/metrics
API エンドポイントで利用できます。このエンドポイントは、不要な情報漏洩を防ぐために、 metricstoken.secret
に保存されている API キーによって保護されています。メトリクスから収集できる情報には、インスタンスが通信している参加ネットワークやピアが含まれます。
アクセス制御は、ZeroTier コントロール インターフェイス自体とmetricstoken.secret
を介して行われます。これは、 X-ZT1-Auth
HTTP ヘッダー フィールド経由でベアラー認証トークンとして送信することも、 ?auth=<token>
として URL に追加することもできます。次のコマンドを使用して、 cURL
経由で現在のメトリクスを確認できます。
// Linux
curl -H "X-ZT1-Auth: $(sudo cat /var/lib/zerotier-one/metricstoken.secret)" http://localhost:9993/metrics
// macOS
curl -H "X-ZT1-Auth: $(sudo cat /Library/Application Support/ZeroTier/One/metricstoken.secret)" http://localhost:9993/metrics
// Windows PowerShell (Admin)
Invoke-RestMethod -Headers @{'X-ZT1-Auth' = "$(Get-Content C:ProgramDataZeroTierOnemetricstoken.secret)"; } -Uri http://localhost:9993/metrics
ZeroTier が実行されているマシン上の Prometheus でスクレイピング ジョブを構成するには、これを Prometheus のscrape_config
に追加します。
- job_name: zerotier-one
honor_labels: true
scrape_interval: 15s
metrics_path: /metrics
static_configs:
- targets:
- 127.0.0.1:9993
labels:
group: zerotier-one
node_id: $YOUR_10_CHARACTER_NODE_ID
authorization:
credentials: $YOUR_METRICS_TOKEN_SECRET
これらの方法のどちらも望ましくない場合は、Prometheus Proxy またはその他のツールを介してメトリクスを配布することがおそらく可能です。注: これは内部でテストされていませんが、おそらく正しい構成で動作するでしょう。
メトリクスは、ZeroTier の作業ディレクトリのディスク上でも利用できます。
// Linux /var/lib/zerotier-one/metrics.prom
// macOS /ライブラリ/アプリケーション サポート/ZeroTier/One/metrics.prom
//Windows C:ProgramDataZeroTierOnemetrics.prom
メトリクス名 | ラベル | メトリックタイプ | 説明 |
---|---|---|---|
zt_packet | パケットタイプ、方向 | カウンタ | ZeroTier パケット タイプの数 |
zt_packet_error | エラーの種類、方向 | カウンタ | ZeroTier パケット エラー |
zt_data | プロトコル、方向 | カウンタ | ZeroTier が送信または受信したバイト数 |
zt_num_networks | ゲージ | このインスタンスが参加しているネットワークの数 | |
zt_network_multicast_groups_subscribed | ネットワークID | ゲージ | ネットワークが加入しているマルチキャスト グループの数 |
zt_network_packets | network_id、方向 | カウンタ | ネットワークごとの受信/送信パケット数 |
zt_peer_latency | ノードID | ヒストグラム | ピア遅延 (ミリ秒) |
zt_peer_path_count | ノードID、ステータス | ゲージ | ピアへのパスの数 |
zt_peer_packets | ノードID、方向 | カウンタ | ピアとの間のパケット数 |
zt_peer_packet_errors | ノードID | カウンタ | ピアからの受信パケットエラーの数 |
追跡したい他のメトリクスがある場合は、問題で質問するか、プル リクエストを送信してください。
シングル ページ アプリのホストに適した静的 http ファイル サーバーが http://localhost:9993/app/ にあります。
zerotier-cli info -j
使用して、zerotier-one サービスの homeDir を見つけます。
cd $ZT_HOME
sudo mkdir -p app/app1
sudo mkdir -p app/appB
echo ' <html><meta charset=utf-8><title>appA</title><body><h1>hello world A ' | sudo tee app/appA/index.html
echo ' <html><meta charset=utf-8><title>app2</title><body><h1>hello world 2 ' | sudo tee app/app2/index.html
curl -sL http://localhost:9993/app/appA http://localhost:9993/app/app2
次に、http://localhost:9993/app/app1/ および http://localhost:9993/app/appB/ にアクセスします。
パスが存在しないへのリクエストは、SPA の慣例として、アプリのルートのindex.html を返します。必要に応じて、サービスまたはコントローラー API と通信する JavaScript を作成できます。