ZeroTierでグローバルな仮想LANを構築:パブリックIPなしでセキュアなP2P接続を実現

Networking tutorial - IT technology blog
Networking tutorial - IT technology blog

ネットワークの壁:CGNATと固定IP

自宅サーバー、リモートワークステーション、クラウドVPSを1つのシームレスなネットワークに統合するのは、かつては技術的に非常に困難な作業でした。OpenVPNやIPSecを構成したことがある人なら、その苦労がわかるでしょう。通常、固定のパブリックIP、煩雑なポートフォワーディング設定、そしてISPがCGNAT(キャリアグレードNAT)を使用して着信トラフィックをブロックしていないことを祈る必要があります。

Starlinkや5Gホットスポット、あるいは一般的な家庭用光回線を利用しているユーザーにとって、パブリックIPは月額10ドルから20ドル程度の追加費用がかかる贅沢品であることが多いです。私は数年間、カフェから自宅のラボにアクセスするためだけに、壊れやすいダイナミックDNSスクリプトの管理に明け暮れていました。ZeroTierに切り替えたことで、その状況は一変しました。15台の分散されたLinuxノードを6ヶ月間運用した結果、その信頼性は明らかです。このツールは、通常のインフラのオーバーヘッドなしに、ローカル環境とリモート環境のギャップを埋めてくれます。

ZeroTierがいかにして世界をフラットにするか

ZeroTierは、ソフトウェア定義のマネージドイーサネットスイッチとして機能します。クラウド上に浮かぶ巨大な仮想パッチケーブルだと考えてください。エージェントをインストールすると、物理的な場所に関係なく、デバイスはこのスイッチに「プラグイン」されます。これにより、既存のインターネット接続の上にレイヤー2の仮想ローカルエリアネットワーク(VLAN)が構築されます。

標準的なVPNは、すべてのトラフィックが中央サーバーを経由するハブ・アンド・スポーク・モデルを採用しています。ZeroTierは異なります。これは「STUN/ICE」技術を活用してファイアウォールを突破する、ピア・ツー・ピア(P2P)アーキテクチャを使用しています。

デバイスAがデバイスBと通信するとき、それらは直接暗号化されたトンネルを確立します。データはZeroTierのサーバーを経由せず、マシン間を直接流れます。このアーキテクチャにより、レイテンシ(遅延)が劇的に削減されます。私のテストでは、都市をまたぐ接続の遅延が45ms(ルーティング経由)から、わずか12ms(直接P2P)に短縮されました。

パワーユーザーにとっての主な利点

  • ルーター設定が不要: ファイアウォールのポートを触る必要はありません。UDP 9993を使用しますが、ほとんどの場合、自動的に通信経路を見つけ出します。
  • 真のレイヤー2イーサネット: 物理LANを模倣します。mDNS、Windowsネットワーク探索、LAN専用ゲームなど、通常インターネット経由では動作しないプロトコルも、設定なしでそのまま動作します。
  • 軍用レベルのセキュリティ: すべてのパケットは、256ビットのEd25519署名とPoly1305認証を使用してエンドツーエンドで暗号化されます。

ステップ1:コントロールプレーンのセットアップ

まず、ネットワークコントローラーを構成する必要があります。セルフホストも可能ですが、ZeroTier Centralのウェブインターフェースは25ノードまで無料で利用でき、ほとんどのプロフェッショナルなセットアップをカバーできます。

  1. my.zerotier.com でアカウントを作成します。
  2. Create A Network をクリックして、一意の16桁のネットワークID(例:8056c2e21c000001)を生成します。
  3. Access Controlを Private に設定します。これにより、IDを推測されたとしても、手動で承認しない限り誰もネットワークに参加できなくなります。
  4. IPv4 Auto-Assignの範囲を選択します。192.168.1.x などの一般的なホームルーターのデフォルト設定との衝突を避けるため、10.147.17.* を推奨します。

ステップ2:エージェントのインストール

各デバイスがネットワークに参加するには、ZeroTierクライアントが必要です。Ubuntu、Debian、CentOSサーバーの場合は、systemdとの最適な統合のために公式リポジトリのスクリプトを使用してください。SnapやFlatpakはネットワークインターフェースの権限で問題が発生することが多いため、ここでは避けてください。

curl -s https://install.zerotier.com | sudo bash

スクリプトが完了したら、サービスが起動時に実行されるように設定します。

sudo systemctl enable zerotier-one
sudo systemctl start zerotier-one

WindowsおよびmacOSユーザーは、MSIまたはPKGインストーラーをダウンロードするだけです。システムトレイに常駐し、バックグラウンドで重い処理をこなしてくれます。

ステップ3:ノードの参加と承認

次に、デバイスにネットワークを見つけるよう指示します。Linuxではコマンドラインツールを使用します。

sudo zerotier-cli join 8056c2e21c000001

200 join OK というレスポンスが表示されるはずです。ただし、この時点ではデバイスはまだ「待機室」にいます。ZeroTier Centralのダッシュボードに戻り、Members セクションまでスクロールしてください。「Auth?」列のチェックボックスをオンにして、デバイスを許可します。匿名のIDリストにならないよう、すぐにノードに名前(例:「Hanoi-Storage-01」)を付けることをお勧めします。

新しいネットワークインターフェースを確認して、接続を確かめます。

ip addr show

先ほど選択した範囲のIPが割り当てられた zt インターフェース(zt0ztwdll6t など)が表示されます。

ステップ4:実環境でのパフォーマンステスト

接続されると、これらのマシンは同じローカルスイッチ上にあるかのように動作します。リモートサーバーのIPが 10.147.17.55 であれば、どこからでもSSH接続が可能です。

ssh [email protected]

テスト中、CGNAT配下のNASとHetzner의 VPS間で50GBのデータベースバックアップを同期しました。iperf3 を使用したところ、光回線の最大アップロード容量の94%の速度を記録しました。P2Pハンドシェイクにより、ISPの制限を正常に回避できました。

直接パスが確立されているか、あるいはスロットリング(帯域制限)されているかを確認するには、以下を実行します。

sudo zerotier-cli peers

LINK 列を確認してください。DIRECT は高速なP2Pトンネルが確立されていることを意味します。RELAY はファイアウォールの制限が非常に厳しく、トラフィックがZeroTierのルートサーバーを経由していることを意味し、速度が制限されます。

仮想LANのセキュリティ強化

VPNをファイアウォールと混同しないでください。ZeroTierはあくまで仮想ケーブルに過ぎません。データベースを 0.0.0.0 で公開したままにすると、仮想ネットワーク上の全員がアクセスできてしまいます。Linuxでは UFW を使用して、ZeroTierインターフェースを個別にロックダウンしてください。

sudo ufw allow in on zt+ to any port 22 proto tcp

zt+ ワイルドカードはプロのテクニックです。OSによって割り当てられるランダムな文字列に関係なく、あらゆるZeroTierインターフェースにルールを適用します。これにより、パブリックインターネットのポート22は閉じたまま、プライベートな仮想リンク経由のSSHのみを許可できます。

6ヶ月使用した結論

従来のVPNをやめたことで、毎月のメンテナンス時間を大幅に削減できました。最大のメリットはローミング機能です。ラップトップをオフィスのWi-Fiから4Gモバイルホットスポットに切り替えても、ZeroTierは約2秒でトンネルを再確立します。「再接続」をクリックしたり、タイムアウトを待ったりする必要はありません。小規模なチームや個人開発者にとって、これはクラウド上のハードウェアとローカルマシンの間の距離を事実上なくしてくれます。

Share: