WireGuard のラボ:2つの拠点をつなぐ VPN トンネルをブラウザーで作る
このラボでは、各生徒がつなぐべき2つの小さな拠点を受け取ります。生徒専用の Ubuntu VM の中に4台のマシンが作られます。各拠点にホストとゲートウェイが1つずつあり、2つのゲートウェイは、インターネットを表し、どちらのプライベートネットワークも知らないリンクでつながっています。生徒はゲートウェイの間に WireGuard のトンネルを作り、一方の拠点のホストがもう一方の拠点のホストに ping を送れるようにします。
生徒のパソコンには何もインストールせず、VPN の機器も要りません。ホストもゲートウェイもネットワーク名前空間で、トンネルは Ubuntu のカーネルが備える本物の WireGuard です。使うコマンドも本物の wg と wg-quick です。
生徒が学ぶこと
VPN トンネルが2つのプライベートネットワークをどうつなぐか:wg genkey と wg pubkey で各ゲートウェイに鍵のペアを作ること、秘密鍵はほかの誰にも読めないようにすべき理由、トンネルのアドレスと各ゲートウェイの相手(ピア)とそこへ送ってよいネットワークを書いた wg0.conf を書くこと、トンネルを上げて wg show でハンドシェイクを読むこと、そして2つのネットワークをトンネルに通す経路を作ることです。tcpdump でインターネットのリンクを観察し、そこを通るのが暗号化された UDP であることを確かめ、再起動のあとに保存したファイルからトンネルが戻るようにします。
トポロジー
拠点 A は、ゲートウェイ gwA の先にある 10.1.0.0/24 のホスト a1 で、拠点 B は、ゲートウェイ gwB の先にある 10.2.0.0/24 のホスト b1 です。ゲートウェイは、インターネットを表す 203.0.113.0/24 でつながっています。このリンクにはどちらのプライベートネットワークへの経路もなく、与えてはいけません。トンネルを作るまで、a1 から b1 への ping は失敗します。各ゲートウェイの WireGuard のファイルは、そのゲートウェイ自身の /etc/wireguard にあり、VM 上では /etc/netns/gwA/wireguard と /etc/netns/gwB/wireguard です。アドレスは、ラボがホームフォルダーに置く README にあります。README には何をするかが書かれていて、答えは書かれていません。
ブラウザーで動かす
VM ラボはモジュールのラボ課題として設定し、サンプルはラボのページにあります。マシンは小さく、CPU 1つ、メモリ 1 GB、ディスク 10 GB です。
- ラボを追加する. 自分が教えるモジュールで課題を追加し、「Ubuntu VM ラボ」のカードを選びます。ページにはcompose ファイルの代わりにマシンの短い記述が表示されます。
- サンプルから始める. ページには、そこから始められるサンプルのラボが用意されています。WireGuard tunnel を選びます。サンプルを使うとテキストが置き換わりますが、「元に戻す」で自分のテキストに戻せます。
- 公開して自分のコピーを起動する. 「公開」してから「起動」を押します。VM の初回起動時に、ラボ自身の setup スクリプトが Ubuntu のアーカイブから wireguard-tools と tcpdump をインストールし、wglab コマンドと README を書きます。所要時間は数秒です。
- ターミナルを開く. ターミナルを開き、ホームフォルダーの README.md を読みます。何を作るかが書かれていて、答えは書かれていません。
このラボの基本レッスン
WireGuard Basics は、Ubuntu VM であるこのラボで行う小さなレッスンです。各ステップに説明と「実行」ボタンがあり、コマンドをマシンのターミナルに入力して、出力を表示します。生徒は、マシンを確かめ、遠いホストに ping を送って Destination Net Unreachable と返されるのを見て、ゲートウェイの2本の経路を読んで理由を知り、まだトンネルがないので wg show が何も出力しないことを確かめます。
レッスンは見て回るだけで、トンネルを作るというラボ自身の課題は生徒に任せるので、答えは示しません。レッスンはわざと小さくしてあります。ラボで行うレッスンがどういうものかを教師に見せるためのもので、残りはラボが担います。変更したいときは、自分のモジュールにコピーしてください。
採点の仕組み
このラボにはチェックがあります。保存されたマシンのコピーを再起動したあとに実行するので、生徒が各ゲートウェイの wg0.conf に保存したものだけが見えます。実際の状態が成り立っているときだけ合格します。設定ファイルは所有者だけが読めること、それぞれがもう一方のゲートウェイの公開鍵を相手にしていること、両方のゲートウェイに新しいハンドシェイクがあること、ホストの間の ping がトンネルを通ってバイトを動かすこと、そしてインターネットのリンクで取った記録に UDP しかなく、プライベートアドレスが見えないことです。2つのネットワークの間の単なるスタティックルートは合格せず、手で上げたまま保存していないトンネルも合格せず、チェックが出力した最初の行に理由が書かれます。
- 配布する. ほかの課題と同じようにラボを配布します。期限を付けることもできます。各生徒には専用の VM が渡され、セッションをまたいで保持されます。
- チェックを実行する. クラス一覧の生徒の行で「チェックを実行」を押します。保存されたマシンのコピーが(元には保存されない形で)起動し、ラボのチェックスクリプトが root で実行されて、合格したか、何を出力したか、いつかが表示されます。結果は生徒には知らされません。
- 採点する. チェックが出力した最初の行を読みます。誰でも読める鍵や、トンネルを通らなかった ping など、何が正しくないかが書かれています。足りない場合は理由を書いて差し戻します。
GitHub の定義ファイル
このファイルはラボの定義のすべてで、プラットフォームが実行するものと同じテキストです。サイズ、setup スクリプト、トポロジーのツール、README、チェックが入っています。コピーして、アドレスを変えたり3つ目の拠点を足したりすれば、もっと長いラボになります。
よくある質問
- このラボには VPN の機器やライセンスが必要ですか?
- いいえ。WireGuard は無料のソフトウェアで、トンネルは Ubuntu 自身のカーネルのモジュールと wireguard-tools パッケージで作られます。パッケージは生徒の VM の起動時に Ubuntu のアーカイブからインストールされ、当社が配布するものはありません。
- 生徒はラボから本物のインターネットに出られますか?
- いいえ。VM が届くのは Ubuntu のアーカイブ、PyPI、npm、GitHub だけで、それ以外には届きません。2つの拠点の間の「インターネット」は VM の中の仮想リンクなので、トンネルは同じマシンの中にある2つの拠点の間につながります。
- WireGuard のラボはどのように採点されますか?
- チェックは、新しく起動した保存済みマシンのコピーで実行されます。各 wg0.conf は所有者だけが読めて、もう一方のゲートウェイの公開鍵が書かれていること、両ゲートウェイに最近のハンドシェイクがあること、ホスト間の ping がトンネルを通ってバイトを動かすことが条件です。ただのスタティックルートでは合格しません。