清水理史の「イニシャルB」

Azureを中継して社内へVPN接続! クラウド上のWireGuard VMで会社と社員宅をつなぐVPNを作ってみる

 前回紹介したIPv6を使ったVPN接続に続いて、今回はIPv4のまま、DS-LiteやMAP-Eなどでも使えるVPN接続方法を紹介したい。

 クラウド上に低価格で運用できるVPN仮想マシンを作り、各拠点から接続して通信を中継する方式だ。回線を問わず利用できる上、会社や社員宅のネットワークに穴を開ける必要がない点がメリットだ。

「会社ー社員宅」「拠点間」に利用可能

 会社のネットワークへVPN接続したいが、自宅で利用しているインターネット接続サービスがDS-LiteやMAP-Eといった方式の場合、VPN接続が難しいケースも少なくない。

 今回は、そんな環境でも問題なく利用できる上、場合によっては本店と支店、オフィスとサテライト、本部と店舗など、拠点間の接続にも応用できるVPN接続方式を紹介したい。

 DS-LiteやMAP-Eといった方式のインターネット回線では、利用できるポートの制限により、インターネット側から内部へのアクセスが困難となる。このため今回の方式では、外部→内部へのアクセスではなく、内部→外部へのアクセスによって、VPNを構成する。

 まずは、構成を見てみよう。今回の構成では、クラウド上の仮想マシンをVPNの中継地点として利用する。

今回の構成

 クラウド上のWireGuardサーバーに対して、サイト1(会社)やサイト2(社員宅や外出先)からWireGuardによる接続を開始して、VPNの内部ネットワークで、各拠点およびクラウド上のリソース(ほかのVMなど)を相互接続する。

 この方式のメリットは次の通りだ。

  • 回線環境不問(内部から外部への接続のため)
  • ポート開放不要(同じく内部→外部のため)
  • 低コスト(VPN機器や仮想マシンが低コストで済む)
  • 高速&低遅延(WireGuardを利用するため)

 低コストと言ってもクラウドを利用するため、仮想マシンの費用は掛かるが、今回はAzureのVMインスタンスで最も安価な「B1ls」(1時間あたり0.5824円)を利用した。実際には、ストレージの維持費とネットワークの料金(IPや5GB以上の転送量)が追加されるので、利用状況に応じた費用が必要だが、少人数での利用なら月額でも数千円程度で収まるのではないかと想定できる。

クラウド環境の準備(WireGuardサーバーの設定)

 それでは、実際の方法を見ていこう。まずはクラウド環境を用意する。

 今回はAzureを利用したが、Amazon EC2(無料特典対象のt2.microや低価格なt2.nanoでもOK)など、ほかのサービスでも構わない。

 OSにはUbuntu 20.04を利用した。最低限のアップデートをした後、「sudo apt install wireguard」と、一発でWireGuardをインストールできて簡単なのが理由だ。

 このほか、VMの設定としては、セキュリティグループでWireGuardのポート(標準51820だが任意でOK)を通過させておく必要がある。

外部からアクセスできるDNS名を設定
WireGuardのポートを通過させる

フォワードの有効化

 準備ができたら、サーバーの設定を行う。まずは、「/etc/sysctl.conf」を編集し、IPv4をフォワードできるようにする。

/etc/sysctl.confを編集

net.ipv4.ip_forward=1

鍵作成

 続いて、以下のように接続に利用する公開鍵と秘密鍵のペアを作成する。サーバーおよび接続する全てのクライアント(ピア)の分が必要となる。ここでは「client1」しか作成していないが、client2、client3などと繰り返して作成しておく。

mkdir wgkeys
cd wgkeys
wg genkey > server_private.key
wg pubkey > server_public.key < server_private.key
wg genkey > client1_private.key
wg pubkey > client1_public.key < client1_private.key
sudo chmod 600 *.key

 これらの鍵は、WireGuardの設定ファイルに登録する必要があるので、「cat」コマンドなどで中身を表示し、キーを控えておく(秘密鍵は厳重に管理すること)。

設定ファイルの作成

 準備ができたら、WireGuardの設定ファイル(/etc/wireguard/wg0.conf)を新規作成する。設定情報は次の通りだ。

サーバー設定
サーバーとして動作させるクラウド上VMのWireGuard設定情報

 先に作成したサーバーの秘密鍵、クライアントの公開鍵をクラウド上VMのWireGuardへ登録する。VPNの内部アドレスは今回は「192.168.99.0/24」を利用し、サーバーには「192.168.99.1/24」を割り当てた。

 ポイントとなるのは「Peer」セクションだ。今回は、Azure VM上のWireGuardが他拠点の接続を集約するかたちとなるため、拠点側に設置するWireGuardクライアントの情報をまとめて記述しておく。

 中でも重要なのが「AllowedIPs」の項目だ。この記述が間違っていると、アクセスできない宛先が発生する。

 WireGuardでは、内部でネットワーク間のルーティングを自動的に構成してくれるが、そのベースとなる情報が、この「AllowedIPs」となるのだ。

 基本的には、接続先のWireGuardに割り当てる内部アドレスを指定すればいい。上図の「#Client」などのように、PCやモバイル端末などが単独で接続する場合は、その端末にのみアクセスできればいいので、端末の内部アドレスのみで構わない。

 一方、サーバー設定の「Peer」セクションにあるSite1やSite2は、拠点間接続の設定例だ。本社と支店のようにネットワーク同士を接続する場合、背後のローカルネットワークにアクセスできるようにする必要があるため、「,(カンマ)」で区切って、接続先の内部ネットワークも追記しておく。

 このため、基本的には「つなぎたいネットワーク」をここに記述することで、WireGuardが自動的にそのルートを判断してくれると考えればいい。

自動起動

 ここまでの設定ができたら、次のコマンドで動作を確認する。

sudo wg-quick up wg0
sudo wg

 エラーがなければ、さらに次のコマンドで自動起動するようにして、サーバー側の設定は完了だ。

sudo systemctl enable wg-quick@wg0

拠点間接続

 サーバー側の用意ができたら、会社や拠点側の設定を行う。まずは、会社と拠点を接続する拠点間接続の例を見ていこう。この構成によって、拠点側のPCから会社内のNASにアクセスしたり、逆に会社側のPCから拠点内部の機器にアクセス可能になる。

拠点間接続

 ネットワーク内に、WireGuardが稼働する端末を何でもいいので1台用意する。今回は、会社側にRaspberry Pi 4(Raspberry OS)、拠点側に仮想マシン(Ubuntu 20.04)を用意した。

WireGuard設定

 WireGuardの設定は、基本的にクラウド上に配したサーバーのものと同じだ。WireGuardをインストールし、こちらも同じく「net.ipv4.ip_forward=1」でフォワードを有効化しておく。

 なお、鍵についてはサーバーで作成したものを使うので、会社側や拠点側では作成の必要はない。

 その後、次のように会社側と拠点側でWireGuardの設定ファイル(/etc/wireguard/wg0.conf)をそれぞれ作成する。

会社・拠点設定
拠点間接続の場合の拠点側WireGuard設定

 会社および拠点側の設定でのポイントも、「AllowedIPs」だ。サーバー側ではそれぞれの拠点ごとに内部のネットワークを記述するだけだったが、会社からは拠点側のネットワークにアクセスする必要があるため、拠点側の「192.168.1.0/24」を記述しておく。同様に、拠点側の設定ファイルには会社側のネットワークである「192.168.101.0/24」を記述する。ここも、「つなぎたいネットワークを記述する」と覚えておくといいだろう。

 設定完了後、サーバーと同様に「wg-quick」のコマンドで稼働を確認し、「systemctl」のコマンドで自動起動の設定をしておくことも忘れずに。

静的ルートの設定

 拠点間のネットワークというか、WireGuard経由で内部のネットワークにアクセスする場合は、内部ネットワークに接続された端末(NASやPC)が、ほかのネットワークにアクセスできるようにする必要がある。

 具体的には、WireGuardをインストールしたマシンをゲートウェイとして使うように、静的ルートを設定する。

 ルーターで静的ルートの設定ができる場合はそちらを使うのが楽(ネットワーク内の全ての端末に設定が適用される)だが、ルーターに静的ルートの設定項目がない場合は、VPN経由でのアクセスが必要なPCやNASに個別に静的ルートの設定をする。

ルーターに静的ルートを設定できれば、LAN内の全ての端末に適用されるので楽

 例えば、次のように設定する。会社側なら拠点側の、拠点側なら会社側の内部ネットワークを宛先とし、その通信を内部に設置したWireGuardマシンに転送するというものだ(必要に応じてAzure側や内部への通信も)。

  • 会社側のルーターや端末
    宛先:192.168.1.0/24 ゲートウェイ:[内部WireGuardマシンのIP]
    宛先:10.0.0.0/24 ゲートウェイ:[内部WireGuardマシンのIP]
    宛先:192.168.99.0/24 ゲートウェイ:[内部WireGuardマシンのIP]
  • 拠点側のルーターや端末
    宛先:192.168.101.0/24 ゲートウェイ:[内部WireGuardマシンのIP]
    宛先:10.0.0.0/24 ゲートウェイ:[内部WireGuardマシンのIP]
    宛先:192.168.99.0/24 ゲートウェイ:[内部WireGuardマシンのIP]
PCへ個別に静的ルートを設定する場合、Windowsではroute addコマンドを使う。再起動後も有効にしたいときは「-p」オプションを付けて実行する
QNAPのNASなどでは、静的ルートを設定画面から登録可能

テレワーク想定の構成

 続いて、もっと一般的なテレワーク向けの構成を見ていこう。社員の自宅などにあるPC、外出先のスマートフォンなどから、WireGuardのクライアントアプリを利用して接続する方法だ。

 Azure、および会社側の設定は、これまでに紹介した拠点間設定と全く同じなので割愛する。

テレワーク接続
テレワーク環境の構成

 社員宅や外出先から接続する場合は、Windows、macOS、Android、iOS向けにそれぞれ用意されているアプリを利用する。以下のサイトから、各プラットフォーム向けのアプリをダウンロードできる。

WireGuard Installation

 クライアント側では、次のようにアプリに接続設定を登録するだけで気軽に利用できる。ここでもポイントは「AllowedIPs」で、ここにアクセスしたい内部ネットワークを列記しておけばいい。

クライアントのWireGuard設定

 なお、当たり前だが、クライアント側を直結する場合、静的ルートの設定は不要だ。ただし、接続先の会社側のネットワークでは、クライアントに対して通信を返送しなければならないので、拠点間接続のときと同じく静的ルートの設定が必要となるので注意しよう。

Windowsクライアントから接続した様子

実効速度は80Mbpsほど

 それぞれの設定が完了したら、各ポイントの端末へ向けてPingなどを実行し、疎通を確認してみるといいだろう。通信できない場合は、AllowedIPsの設定か、静的ルートの設定ミスと考えられる。もしくは、WireGuardマシンで「net.ipv4.ip_forward=1」が有効になっていなかったり、公開鍵と秘密鍵が間違っているなどの可能性もある。

 Windowsなら「tracert」などのコマンドを使って、どこで通信が失敗しているかを調べてみるのも参考になる。

「tracert」のコマンドで、どこで通信が遮断されてしまうかを確認できる

 ちなみに速度は、上記の拠点間接続で、会社側のサーバーと拠点側のPCの間でiPerf3を実行した場合で80Mbpsほど、Pingは8~10msほどという結果だった。NASをVPNサーバーにして外部から接続した場合、OpenVPNでおおむね20Mbpsほどとなることが多いので、クラウド経由(しかも低スペックなVM)でも、これほどの速度で通信できるのだから、かなり実用的と言える。

iPerf3の実行結果

 WireGuardは、はじめの一歩がとっつきにくいが、使い始めると、どこでも同じような設定で使えるので比較的難易度は低い。接続先が多くなると管理が煩雑になるのが難点だが、便利なので実際に使ってみることをお勧めする。

清水 理史

製品レビューなど幅広く執筆しているが、実際に大手企業でネットワーク管理者をしていたこともあり、Windowsのネットワーク全般が得意ジャンル。最新刊「できる Windows 10 活用編」ほか多数の著書がある。