Ubuntu Weekly Recipe

第614回 WireGuardでVPNサーバーを構築する

この記事を読むのに必要な時間:およそ 4 分

新型コロナウイルスによる感染症の広がりにより,リモートワークの必要性が急遽クローズアップされています。

とはいえ,業務に必要なシステムをクラウド上に構築し,場所を選ばずに業務を継続できる環境をすでに整備できているという企業は,まだまだ少ないのが現実ではないでしょうか。社内ネットワーク上に業務システムが構築されている場合,とにもかくにも社内ネットワークにリモートから接続できないことには始まりません。そんな理由で,急遽リモートワーク用のVPN環境を整備することになった,社内情シス担当の方も多いのではないのでしょうか(ご苦労さまです…⁠⁠。

今回は,最近Linuxカーネルにマージされたことでも話題となっているWireGuardを用いて,VPNサーバーを構築する方法を紹介します。

WireGuardとは

WireGuardとは,Linuxのカーネルモジュールとして動作するオープンソースのVPN実装です。

OpenVPNやIPSecなど,従来のVPNサーバーのセットアップは,多くの場合煩雑になりがちでした。対してWireGuardは,SSHサーバーと同程度に,簡単にセットアップが可能なことを目指して開発されています。実際,サーバーとクライアント間で公開鍵を交換し,IPアドレスを割り当てるだけで,VPN通信が可能になります(設定については後述⁠⁠。

またWireGuardは非常にシンプルながらも高速であり,OpenVPNやIPsecよりも高いパフォーマンスを謳っています。

WireGuardのインストール

今回は例として筆者の自宅内にWireGuardサーバーを用意し,インターネットから家庭内へのVPN接続できる環境を構築します※1⁠。

※1
なお家庭内に構築したサーバーにインターネットから接続するため,ルーターに静的マスカレードやファイアウォールの設定が必要となります。しかしこれは本記事の主旨から外れるため,詳細は省略します。

今回は,サーバーにはRaspberry Pi 4 4GBモデルと,Raspberry Pi向けのUbuntu Server 19.10.1(64bit版)を使用しました。OSをインストールしたら,NICに固定のIPアドレスを割り振っておくと便利です。クライアントには,ノートPCにインストールしたUbuntu 19.10を使用しました。ノートPCをスマートフォンのテザリングを利用してインターネットに接続し,そこから自宅内にVPNを張ることで検証を行いました。

Ubuntu 19.10の場合,wireguardパッケージをインストールするだけで,WireGuardを使いはじめることができます。ただし,現時点でwireguardパッケージはUniverseリポジトリにあるという点には注意してください。

wireguardパッケージのインストール

$ sudo apt install wireguard

サーバー用鍵ペアの作成

WireGuardがインストールできたら,サーバー用の鍵ペアを作成します。WireGuardに関する様々な操作はwgコマンドで行います。まずは秘密鍵を作成するためgenkeyサブコマンドを実行してください。genkeyサブコマンドは作成した秘密鍵を標準出力に出力しますので,teeコマンドでファイルに保存しておくことにしましょう※2⁠。また保存した鍵ファイルは,念の為パーミッションを落としておきましょう。

※2
鍵は後述する設定ファイルに直接記述するため,別途ファイルに保存しておく必要はありません。しかし後で再利用することと,紛失すると鍵を再生成してクライアントに配り直さないといけないため,ここでは別ファイルに保存しています。

秘密鍵の作成と保存

$ wg genkey | sudo tee /etc/wireguard/server.key
$ sudo chmod 600 /etc/wireguard/server.key

続いて,秘密鍵から公開鍵を作成します。これにはpubkeyサブコマンドを実行します。pubkeyサブコマンドは,標準入力から秘密鍵を読み込み,公開鍵を標準出力に出力するサブコマンドです。鍵は後ほどクライアントに配る必要があるため,ここでも別ファイルに保存しておくことにします。

秘密鍵から公開鍵を作成する

$ sudo cat /etc/wireguard/server.key | wg pubkey | sudo tee /etc/wireguard/server.pub
$ sudo chmod 600 /etc/wireguard/server.pub

クライアント用鍵ペアの作成

クライアント側でも,同様にWireGuardのインストールと鍵の作成を行います。クライアントのUbuntu上でも,先ほどサーバーで実行したのと同様のコマンドを実行してください。ここでも秘密鍵と公開鍵はファイルに保存しておくとよいでしょう。

クライアントPC上でも,WireGuardのインストールと鍵ペアの作成を行う

$ sudo apt install wireguard
$ wg genkey | sudo tee /etc/wireguard/client.key
$ sudo cat /etc/wireguard/client.key | wg pubkey | sudo tee /etc/wireguard/client.pub
$ sudo chmod 600 /etc/wireguard/client.key /etc/wireguard/client.pub

サーバーの設定

ここは再びサーバー上での作業となります。WireGuardの設定ファイルは,⁠/etc/wireguard/作成するインターフェイス名.conf」という名前で作成する必要があります。今回はインターフェイス名を「wg0」とするので,⁠/etc/wireguard/wg0.conf」というファイルを作成し,以下の内容を記述してください。なお今回の例ではWireGuardのネットワークに「10.0.0.0/24」のサブネットを割り当て,サーバーのインターフェイスに「10.0.0.1/32⁠⁠,クライアントのインターフェイスに「10.0.0.2/32」のIPアドレスを割り当てることにします。

サーバーの/etc/wireguard/wg0.confの内容

[Interface]
PrivateKey = 作成したサーバーの秘密鍵
Address = 10.0.0.1 (サーバーのインターフェイスに割り当てるIPアドレス)
ListenPort = 51820

[Peer]
PublicKey = 作成したクライアントの公開鍵
AllowedIPs = 10.0.0.2/32 (クライアントに割り当てたIPアドレス)

クライアントの設定

クライアント側にも設定ファイルが必要です。以下の内容で「/etc/wireguard/wg0.conf」を作成してください。インターネットから家庭内へ接続する場合,ここで設定するサーバーのIPアドレスは,ルーターに割り当てられているグローバルIPアドレスになるでしょう。なおプロバイダから固定のIPアドレスを割り当てられていない場合は,ダイナミックDNSサービスを利用するなどの工夫が必要になるかもしれません。

クライアントの/etc/wireguard/wg0.confの内容

[Interface]
PrivateKey = クライアントの秘密鍵
Address = 10.0.0.2 (クライアントのIPアドレス)

[Peer]
PublicKey = サーバーの公開鍵
EndPoint = サーバーのIPアドレス:51820
AllowedIPs = 10.0.0.0/24 (WireGuardを経由して通信する先のIPアドレス)

見ての通りWireGuardの設定は,Interfaceに自分自身の設定を記述し,Peerに接続先の情報を登録するだけという,非常にシンプルなものになっています。

著者プロフィール

水野源(みずのはじめ)

Ubuntu Japanese Teamメンバー。理想のフリーデスクトップ環境を求めて東へ西へ……のはずが,気がついたら北の大地で就職していたインフラ寄りのエンジニア。最近レンズ沼にハマる。