WireGuardでVPNサーバーを構築してスマホやPCから接続する手順

はじめに
WireGuardはOpenVPNよりもシンプルで高速、より安全なVPNとして開発が進められており、OpenVPNに代わるVPNとして期待されています。端末間だけでなく拠点間のVPN接続にも対応しています。この記事ではWireGuardを使ってVPNサーバーを構築し、そのVPNサーバーにUbuntuやiPhoneから実際に接続してみるまでの手順をまとめます。 だいぶ前ですがOpenVPNサーバーを構築してUbuntuから接続しようとしたこともありましたが、設定が面倒だったり接続速度が遅かったりで結局使用しませんでした。ただ、WireGuardはまず設定がOpenVPNに比べて間違いなく簡単で、速度も十分です。さらにWireGuard公式のクライアントアプリがWindows、macOSに加えてiOS、Anrdoid用も配布されているので簡単に接続できます。
WireGuard® is an extremely simple yet fast and modern VPN that utilizes state-of-the-art cryptography.
できるようになること
構築するシステムイメージ図が以下です。
WireGuardを使用してクライアント(PC、スマホ)とサーバー間をVPN接続します。クライアントは全てのトラフィックをサーバー経由にしてインターネットに接続することができます。カフェや空港などの公衆WiFiを使用する場合にも役立ちます。 以降ではWireGuardのクライアントを単にクライアント、WireGuardのサーバーを単にサーバーと呼びます。 WireGuardのざっくりした仕組みとしては、サーバー側とクライアント側それぞれにWireGuardによるVPN接続用にネットワークインターフェースを追加し、それらを使ってVPN接続します。 そしてこれらは設定ファイルを作成すれば後はWireGuardがよしなにやってくれます。 なお、WireGuardはサーバーで生成した公開鍵をクライアント側で使用し、クライアント側で使用した公開鍵をサーバー側で使用します。そのためサーバー側とクライアント側で並列して作業が必要になります。以降で説明します。
前提と環境
以下の環境でWireGuardによるVPN接続を構築しました。
- WireGuardサーバーOS : Ubuntu 18.04
- WireGuardクライアントOS : Ubuntu 18.04、iOS(Windows、macOS、Android用の公式クライアントアプリも配布されています。)
WireGuardはまだ正式リリースに至っておらず、潜在的なバグを持っている可能性もあります。使用は自己責任でお願い致します。 ちなみに、WireGuardの公式ドキュメントでは、設定ファイルの作成をコマンドで順番に行っていく方法が説明されていますが、ここでは最初から設定ファイルを作成してそこに設定内容を記述していく方法を説明しています。やっていること自体は同じになります。
You'll first want to make sure you have a decent grasp of the conceptual overview, and then install WireGuard. After that, read onwards here.
サーバー側での作業
ここではWireGuardのサーバーとしてUbuntu 18.04を使用します。
WireGuardをUbuntuにインストールする
以下でWireGuardをインストールします。
以上でWireGuardのインストールが完了です。
秘密鍵と公開鍵を作成する
WireGuardが使用する秘密鍵と公開鍵を以下のコマンドで同時に生成します。
上記を実行すると、実行時のディレクトリにprivatekeyとpublickeyの2つが生成されます。
秘密鍵privatekeyは決して誰とも共有してはいけないので、以下で権限を変更しておきます。
なお、秘密鍵の中身を確認すると以下のようになっています。この値を次の設定ファイルの中で使用します。
公開鍵は以下です。この値を次の設定ファイルの中で使用します。
サーバー用のWireGuardの設定ファイルを作成する
以降の作業は全てroot権限が必要です。
続いて、/etc/wireguardにwg0.confという設定ファイルを作成します。
/etc/wireguard/wg0.confの中身を以下のようにします。
上記のうち[Interface]はサーバーの設定、Peerはサーバーに接続するクライアントに関する設定になります。[Interface]の設定項目は以下です。
| 項目 | 内容 |
|---|---|
| PrivateKey | サーバー側の秘密鍵。この記事ではweohtowetu08230j2083j09203k9dALijF3h2KPA=が該当。 |
| Address | VPN用のIPアドレス。WireGuardで構成するVPNにて、サーバー用に使用したい適当なアドレスを設定します。192.168.0.1/24などでもOK。ここでは10.0.0.1/24。 |
| ListenPort | WireGuardがListenするポート番号。デフォルトが51820。他のポート番号でもOKですが、後ほどファイアウォールの設定で許可する必要があります。 |
| SaveConfig | trueにすることでWireGuardの起動時、停止時にこの設定ファイルの内容を保存します。 |
| PostUp, PostDown | WireGuardの起動直前(PostUp)、停止直前(PostDown)に実行する処理を記述します。ここでは、WireGuardの起動、停止それぞれの直前にiptablesのフォワーディング用の設定を追加しています。上記のiptablesルール内にあるeth0は私のサーバーの外部IP(WAN側IP)を持つインターフェースです。各自置換してください。 |
[Peer]の設定項目は以下です。
| 項目 | 内容 |
|---|---|
| PublicKey | サーバーに接続するクライアント側で生成した公開鍵。ここではslwtj2o39jAofo428jAPJD8f038j20f=が該当。これはクライアント側で生成するものになります。 |
| AllowedIPs | サーバーへの接続を許可するクライアントのVPN用のIPアドレス。これも次節で説明します。 |
上記を保存して最後に設定ファイルの権限も変更して完了です。
iptablesもしくはufwでポート番号を許可する
iptablesやufw等のファイアウォールを使用している場合は、それらにてWireGuardが使用するポート(UDP)を許可する必要があります。WireGuardのデフォルトのポート番号51820をiptablesで許可する場合は、以下のルールを追加してください。
ufwの場合は以下でルールを追加できると思います。
フォワーディングを許可する
WireGuardのサーバー側でクライアント側のトラフィックを受けてインターネットに流すには、サーバー側でフォワーディングを有効化しておく必要があります。
Ubuntuの場合は、/etc/sysctl.confを編集することでフォワーディングを有効化できます。具体的には/etc/sysctl.confの以下の部分を非コメント化します。
上記を上書きした後、以下で変更を反映させます。
これでフォワーディングが許可されました。
WireGuardサーバーを起動、停止する
WireGuardサーバーを起動するには、wgコマンドを使用して以下のようにします。
以降は以下でも起動できます。
上記を実行すると、ネットワークインターフェースとしてwg0が作成され、クライアントからの接続を待機する状態になります。ipコマンドを使用して確認すると、wgが追加されていることを確認できます。
停止する場合はwg-quick downを使用します。
クライアント側での作業
Ubuntuをクライアントとして使用する場合の作業
ここでは、Ubuntu 18.04をクライアントとして使用します。iOSをクライアントとして使用する場合の方法は後述します。 サーバー側で行った作業と同じように以下でWireGuardをインストール、秘密鍵と公開鍵の生成、権限の設定を行います。
秘密鍵の中身を確認します。
公開鍵の中身を確認します。
この値は前節で説明したサーバー側の設定ファイル/etc/wireguard/wg0.conf内の[Peer]のPublicKeyで指定します。
クライアント用の設定ファイルを作成する
サーバー側と同様にクライアント側でも設定ファイルを作成します。
クライアント側の設定ファイルはサーバー側よりも少ない内容です。以下が[Interface]部分の設定項目です。
| 項目 | 内容 |
|---|---|
| PrivateKey | クライアント側の秘密鍵。ここではSk9joFowprh80DSoehg98Ahgeiywg=が該当。 |
| Address | VPN用のIPアドレス。WireGuardで構成するVPNにて、クライアント用に使用したい適当なアドレスを設定します。ここでは10.0.0.2/24。 |
[Peer]部分の設定項目は以下です。
| 項目 | 内容 |
|---|---|
| PublicKey | サーバー側で生成した公開鍵。ここではgeIEmgepi0123noige93jpt482jfALiei=が該当。 |
| Endpoint | 接続先となるWireGuardサーバーの外部IP(WAN側IP)。ポート番号も指定する。 |
| AllowedIPs | WireGuard経由にするIPアドレスの範囲。0.0.0.0/0(IP6では::/0)を指定すると、クライアント側の全てのトラフィックをWireGuard宛にします。すなわちサーバーを経由させます。もしここで10.0.0.0/24のように特定のIPアドレス範囲を指定すれば、そのIPアドレス範囲に含まれる宛先トラフィックのみWireGuardサーバーに転送します。 |
クライアントからサーバーに接続する
WireGuardサーバーを起動した時と同じで、wgコマンドを使用して以下のようにします。
上記を実行してWireGuardのネットワークインターフェースwg0が作成された時点でサーバーと接続します。
試しにサーバー側のVPN用IP10.0.0.1にpingを打てば応答が返ってきます。
また、試しにIPアドレスを表示しくれるWebサイト等にアクセスしてみると、クライアントのIPではなくサーバーのIPが表示されると思います。
停止する場合はwg-quick downを使用します。
なお、WireGuardのサーバーとしてVPS等を使用している場合は、必ずVPSに対するトラフィック制限や規約等を確認してください。上記の設定はクライアントのトラフィックを全てサーバー経由にするため、クライアント側で大量にネットワークを使用すると、当然ながらサーバー側でも同じだけネットワークを消費します。公衆WiFiに接続している時だけ使用するようにするなど各自の状況に合わせて使用してください。
iPhoneからWireGuardサーバーに接続する
iOSとAndroidそれぞれでWireGuardの公式クライアントアプリが用意されています。iOSの場合はApp Storeで検索すると以下のような感じです。
これをインストールして起動すると以下のような画面が開きます。「Add a tunnel」をクリックして新しいVPN接続を追加します。
「Add a tunnel」をクリックすると、以下のように設定方法のメニューが表示されます。
設定ファイル、QRコード、手動での設定がそれぞれ可能です。
| 項目 | 内容 |
|---|---|
| Create from file or archive | 設定ファイルから作成 |
| Create from QR code | QRコードから作成 |
| Create from Scratch | ゼロから手動で各項目を入力して作成 |
1番簡単なのは「Create from QR code」です。もしクライアントとしてUbuntuを使っていれば、qrencodeを使用して作成済の設定ファイルをQRコード化し、それを「Create from QR code」を選択して開いたカメラで読み取ればOKです。
Ubuntuの場合qrencodeはaptでインストールできます。
後は以下で設定ファイルからQRコードを生成します。
その他のOS用のクライアントアプリについては以下の公式ドキュメントを見てみてください。
WireGuardの状態を確認する
wgコマンドで以下を使用することで追加したWireGuardのネットワークインターフェースのステータスを確認できます。
WireGuard経由でインターネットに接続できない場合
2020/2/16 追記
上記までに記載した方法でWireGuardでインターネットに接続できていたものの、誤ってクライアント側のWireGuardの設定ファイルを削除してしまいました。そして全く同じ手順で設定し、WireGuardサーバーに接続できたもののWebサイトを表示できない状態になりました。調べてみるとPingは外部にも届いていましたが、DNSサーバーが分からずに名前解決できない状態になっていました。対策としては、クライアント側の設定ファイルに以下のようにDNSを指定する記述を追記しました。
以下でWireGuard用のインターフェースを再起動します。
なお、もし再起動した際に以下のようにresolvconf: command not foundというエラーが出る場合があります。
これは、WireGuardが内部で使用しようとしたresolvconfコマンドが見つからないことが原因なので、以下でインストールすれば解決します。
これについては、トラブルシューティング - ArchLinux wikiに記載れており参考になりました。
DNSについての設定がWireGuardの設定ファイルになくても、元々パブリックなDNSサーバーを使っていたり、DNSサーバーについてルーティング設定を行っていればこの状態にはなりませんが念の為メモしておきます。
参考文献
以下の記事が大変参考になりました。
Learn how to setup your own Wireguard server, the new fast and modern VPN protocol!
まとめ
WireGuardを使ったVPNサーバーの構築手順と実際にクライアントから接続するまでの手順をまとめました。OpenVPN等に比べて遥かに簡単に構築できます。
関連記事
公開日:2020/02/16 更新日:2020/02/16圧縮、暗号化、リモート対応の差分バックアップを作成できる「Borg Backup」の使い方
圧縮、暗号化に対応し差分バックアップを作成できるソフトウェアである「Borg Backup」をUbuntuにインストールして使ってみたのでその手順をまとめます。「Borg Backup」はLinux、macOSに対応しています。
公開日:2020/02/14 更新日:2020/02/14自分専用の後で読むサービスを構築できる「Wallabag」をUbuntu + Nginxで構築する手順
後で読むサービスのPocketにかなり近く、機能豊富なオープンソースのWallabagをUbuntuにインストールしたのでその手順をまとめます。
公開日:2020/02/12 更新日:2020/02/12ファイル単位で暗号化して保存できるCryptomatorをインストールして使う手順
Cryptomatorは、ファイル単位での暗号化が可能なソフトウェアです。この記事では、UbuntuにCryptomatorをインストールする手順と使い方をまとめます。
公開日:2020/01/17 更新日:2020/01/17ディレクトリ表示や移動をインタラクティブに実行できるコマンドツール「Broot」
Linuxで端末を使っている時にディレクトリ構造をざっくり確認したり各ディレクトリにどのようなファイルが入っているかを確認したりしたい場合があると思います。Brootはディレクトリ構造を表示しつつさらにそこから各ディレクトリに移動したりファイルを検索したりできるコマンドラインツールです。



