大阪の店と東京のファイル
ある会社は、大阪に店、東京に事務所を持ち、それぞれに社内のネットワークがあります。店は、事務所のファイルサーバーを使いたいのです。
二つをつなぐのは、誰にでも開かれたインターネットだけです。トンネルは、社内の通信を包んでそこを渡し、途中の誰にも読ませません。
このレッスンのゴール
メモ
トンネルが二つの拠点をつなぐ仕組みを説明できる。
重要な言葉
| ことば | いみ | れい |
|---|---|---|
| トンネル | 社内の通信を、別の通信で包んで運ぶ仕組み | |
| 鍵のペア | 自分だけが持つ秘密鍵と、渡してよい公開鍵の組 | |
| ピア | トンネルの反対側にいる機器 | |
| エンドポイント | ピアに届くための、公開アドレスとポート | 203.0.113.2:51820 |
| AllowedIPs | そのピアに使えるネットワーク。トンネルへの経路にもなる | |
| ハンドシェイク | 両端が正しい鍵を持つと確かめ合うやり取り |
学生が入力するセルは、このプレビューでは空白です。
社内の網は渡れない
どの拠点も、プライベートアドレスを使っています。インターネットには、それらへの経路がありません。一方の拠点から他方へ送るパケットは、途中で捨てられます。
トンネルがこれを解きます。拠点のゲートウェイは、社内のパケットを丸ごと、相手のゲートウェイ宛ての新しいパケットの中に入れます。
インターネットから見えるのは、二つのゲートウェイの間の通信だけです。
例: 一つのパケットを二か所から見る
| 場所 | 送信元 | 宛先 | 見えるもの |
|---|---|---|---|
| 店の中 | 192.168.50.5 | 192.168.60.9 | ふつうのデータ |
| インターネット上 | 198.51.100.1 | 198.51.100.2 | UDPに包まれた暗号 |
| 事務所の中 | 192.168.50.5 | 192.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 で失敗します。ゲートウェイの表には、自分の拠点とインターネット側の二行だけがあり、もう一方の拠点への行がありません。
ゲートウェイごとに鍵のペア
各ゲートウェイは鍵のペアを作ります。秘密鍵と、そこから作る公開鍵です。公開鍵から秘密鍵を逆算することはできません。
秘密鍵は、そのゲートウェイから出しません。公開鍵は、相手に渡します。方法はメールでもかまいません。
各ゲートウェイは、相手を公開鍵で名指しして、ピアとして書きます。
例: 設定ファイルの部品
| 行 | セクション | 意味 |
|---|---|---|
| PrivateKey | Interface | このゲートウェイ自身の秘密 |
| Address | Interface | トンネルの中での、このゲートウェイのアドレス |
| ListenPort | Interface | 待ち受けるUDPのポート |
| PublicKey | Peer | 相手のゲートウェイの公開鍵 |
| AllowedIPs | Peer | この相手へ送るネットワーク |
| Endpoint | Peer | インターネット上の相手の場所 |
学生が入力するセルは、このプレビューでは空白です。
今あるトンネルを聞く
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 がこの行を読み、それらへの経路をトンネルの中へ足します。
ピアから届いたパケットは、送信元がこの一覧にあるときだけ受け入れられます。
店と事務所の設定の例
# 店のゲートウェイ。ラボとは別のアドレス。
[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 は最新のハンドシェイクについて何と言いますか。終わったら鍵を元に戻しましょう。