クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

二つの拠点をVPNでつなぐ(WireGuard)

このレッスンのあとで: トンネルが二つの拠点をつなぐ仕組みを説明できる。

55分のレッスンコマンド6件WireGuard のラボ:2つの拠点をつなぐ VPN トンネルをブラウザーで作る

大阪の店と東京のファイル

ある会社は、大阪に店、東京に事務所を持ち、それぞれに社内のネットワークがあります。店は、事務所のファイルサーバーを使いたいのです。

二つをつなぐのは、誰にでも開かれたインターネットだけです。トンネルは、社内の通信を包んでそこを渡し、途中の誰にも読ませません。

このレッスンのゴール

メモ

トンネルが二つの拠点をつなぐ仕組みを説明できる。

重要な言葉

ことばいみれい
トンネル社内の通信を、別の通信で包んで運ぶ仕組み
鍵のペア自分だけが持つ秘密鍵と、渡してよい公開鍵の組
ピアトンネルの反対側にいる機器
エンドポイントピアに届くための、公開アドレスとポート203.0.113.2:51820
AllowedIPsそのピアに使えるネットワーク。トンネルへの経路にもなる
ハンドシェイク両端が正しい鍵を持つと確かめ合うやり取り

学生が入力するセルは、このプレビューでは空白です。

社内の網は渡れない

どの拠点も、プライベートアドレスを使っています。インターネットには、それらへの経路がありません。一方の拠点から他方へ送るパケットは、途中で捨てられます。

トンネルがこれを解きます。拠点のゲートウェイは、社内のパケットを丸ごと、相手のゲートウェイ宛ての新しいパケットの中に入れます。

インターネットから見えるのは、二つのゲートウェイの間の通信だけです。

例: 一つのパケットを二か所から見る

場所送信元宛先見えるもの
店の中192.168.50.5192.168.60.9ふつうのデータ
インターネット上198.51.100.1198.51.100.2UDPに包まれた暗号
事務所の中192.168.50.5192.168.60.9ふつうのデータ

学生が入力するセルは、このプレビューでは空白です。

二つの拠点を見る

コマンド
wglab status

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

向こうの拠点へ届くか試す

コマンド
sudo ip netns exec a1 ping -c 2 -W 1 10.2.0.2

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

ゲートウェイの経路を読む

コマンド
sudo ip netns exec gwA ip route

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

答えが言うこと

最初の実行は、四台の機械とそのアドレスを並べます。各ゲートウェイには、インターネットを表す wan0 に、二つ目のアドレスがあります。

pingは Destination Net Unreachable で失敗します。ゲートウェイの表には、自分の拠点とインターネット側の二行だけがあり、もう一方の拠点への行がありません。

ゲートウェイごとに鍵のペア

各ゲートウェイは鍵のペアを作ります。秘密鍵と、そこから作る公開鍵です。公開鍵から秘密鍵を逆算することはできません。

秘密鍵は、そのゲートウェイから出しません。公開鍵は、相手に渡します。方法はメールでもかまいません。

各ゲートウェイは、相手を公開鍵で名指しして、ピアとして書きます。

例: 設定ファイルの部品

行セクション意味
PrivateKeyInterfaceこのゲートウェイ自身の秘密
AddressInterfaceトンネルの中での、このゲートウェイのアドレス
ListenPortInterface待ち受けるUDPのポート
PublicKeyPeer相手のゲートウェイの公開鍵
AllowedIPsPeerこの相手へ送るネットワーク
EndpointPeerインターネット上の相手の場所

学生が入力するセルは、このプレビューでは空白です。

今あるトンネルを聞く

コマンド
sudo ip netns exec gwA wg show

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

設定を置くフォルダを見る

コマンド
sudo ip netns exec gwA ls -ld /etc/wireguard

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

使い捨ての鍵の文字数を数える

コマンド
wg genkey | wc -c

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

三つの答えが言うこと

最初の実行は何も出しません。トンネルがまだ無く、鍵もありません。何も見つからないコマンドは、黙ることがよくあります。

次の実行は drwx------ で始まります。rootだけが開けるフォルダで、これが正しい姿です。秘密鍵を置くことになるからです。

三つ目の実行は、秘密鍵を作り、見せずに文字数だけを数えます。45 と出ます。鍵の44文字と、その後の改行です。

よくある間違い

注意

「公開鍵も秘密にするもの」と思う人が多いです。秘密なのは秘密鍵だけです。公開鍵は自由に渡してかまいません。秘密鍵は誰にも送らず、持ち主以外にファイルを読ませてもいけません。

AllowedIPsは経路の一覧

AllowedIPs の行は、二つの仕事をします。そのピアへ送ってよいネットワークを並べます。また、トンネルを上げる道具の wg-quick がこの行を読み、それらへの経路をトンネルの中へ足します。

ピアから届いたパケットは、送信元がこの一覧にあるときだけ受け入れられます。

店と事務所の設定の例

コード: bash
# 店のゲートウェイ。ラボとは別のアドレス。
[Interface]
PrivateKey = (店のゲートウェイの秘密鍵)
Address = 10.77.0.1/24
ListenPort = 51820

[Peer]
PublicKey = (事務所のゲートウェイの公開鍵)
AllowedIPs = 192.168.60.0/24
Endpoint = 198.51.100.2:51820

ハンドシェイクが鍵を確かめる

最初のパケットがトンネルを必要としたとき、二つのゲートウェイはハンドシェイクをします。それぞれが、相手が期待する公開鍵に合う秘密鍵を持つ、と示します。

その後はパケットが流れ、通信がある間は数分ごとにやり直します。ハンドシェイクの無いトンネルは、何も運びません。

発展: わざとハンドシェイクを壊す

トンネルが動いたら、a1からb1へpingしている間に sudo ip netns exec gwA wg show を実行し、転送量の数を書き留めましょう。

次に、gwBの wg0.conf のPublicKeyを1文字だけ変え、sudo wglab down と sudo wglab up を実行して、もう一度pingします。今度は、wg show は最新のハンドシェイクについて何と言いますか。終わったら鍵を元に戻しましょう。

このラボとソースについて: WireGuard のラボ:2つの拠点をつなぐ VPN トンネルをブラウザーで作る

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。