WireGuard 完全ガイド インストール・設定・運用の全ステップ

プライバシーを強化するためにVPNを構築したいけれど、設定がやや難しかったり、仕組みを詳しく知りたい方向けに、1年以上WireGuardを運用してきた筆者が解説します。
近年、WireGuardを採用する方も増えているのではないでしょうか。

用語解説!

VPNとは

VPN(Virtual Private Network)とは、公衆のインターネット回線などを使って、暗号化された「仮想的な専用線」(トンネル)を構築し安全にデータを送受信する技術です。

普段使用するソフトウェアVPNに関しては第3層ネットワーク層で動作します。

↓の記事でVPNについて詳しくまとめてみました。合わせてご覧ください。

VPNとは?仕組みと使い道を図解で解説

WireGuard とは

2020年ころに正式版がリリースされたかなり新しく、今注目されているVPN プロトコルです。

約4,000行という短いコードと最新暗号(ChaCha20-Poly1305/Curve25519)採用で、設定が簡単かつ軽量。オーバーヘッドが少なめ。

UDP単一ポートでレイヤ3トンネルを張り、NAT越えやモバイルのローミングにも強いシームレス接続。ノイズベースのカギ交換により安全性が高い。

wireguardにはクライアント版、サーバー版という概念がなく、どちらも対等に扱われ、設定次第で “サーバー役”“クライアント役” として運用できるのが特徴。

wireguardはクライアント役とサーバー役でそれぞれカギをお互いに交換を行い、そのうえで通信を開始します。

ちなみに複数のサーバー同士が互いに通信をしあい、1つのサーバーにトラフィックを集中させないメッシュ構築もできます。

いざ構築!

構築は想定としてクライアントはmac or windows サーバー側はLinux(debian or ubuntu)とします

VPSや専用サーバーなど、外部からUDPパケットを受けられる環境(ポート解放、転送できる環境)がどちらか片方に必要です。

WireGuardのインストール

wireguardはサーバーとクライアントがどちらも対等に扱われるため、サーバー用ソフト、クライアント用ソフトという区別がなく、それぞれに同じソフトをインストールし、設定でサーバ役、クライアント役を設定します。

https://www.wireguard.com/install

上のリンクを押し、自分の環境のものをクリックしてインストールしてください。macはAppStore、Windowsはインストーラーをダウンロードできます。

debianの場合はパッケージに公開されていますので、コマンド一つでインストールできます。

sudo apt -y install wireguard

クライアントもdebian(Ubuntu)の場合、あとでDNSを使用するので基本入っていると思いますが一応openresolveを入れておきましょう。

sudo apt -y install openresolv

設定ファイルの作成と起動

ポート開放

サーバー側で行います。まず構築準備としてポートを開放します。ポートの開放はサーバー側で行います。UDP 51820を開けてください。WireGuardはTCPに対応していないので、必ずUDPポートを開けてください。

UFWの場合

sudo ufw allow 51820/udp && sudo ufw reload

iptablesの場合

sudo iptables -A INPUT -p udp --dport 51820 -j ACCEPT[affi id=1]
keyの生成

サーバー側でパブリックキーとプライベートキーの生成を行います。最初に自身のグローバルIP(ネット上の住所みたいなもの)を確認します。

curl inet-ip.conf #出力例 160.251.215.230

ここからは実際にカギを生成します。まずはディレクトリに移動します(ubuntuの方は事前にsudo iコマンドでsudo シェルに入っておいてください。)

cd /etc/wireguard
wg genkey | tee server_private.key | wg pubkey > server_public.key && wg genkey | tee client_private.key | wg pubkey > client_public.key

実行結果
server_private.key(サーバー秘密鍵)
server_public.key(サーバー公開鍵)
client_private.key(クライアント秘密鍵)
client_public.key(クライアント公開鍵)

上の四つが生成されます。下のフォーマットに従って記入を行ってください。nano /etc/wireguard/wg0.confで設定を編集できます。

Wireguard用の設定ファイルを作成

サーバー側でSTEP.2で生成したkeyを書き込んだ設定ファイルを作成します

ファイルを編集し、

nano /etc/wireguard/server.conf

下の内容を書き込みます。

[Interface]
# サーバーの仮想インターフェース IP アドレス
Address = 10.0.0.1/24
# クライアントからの接続を待ち受けるポート
ListenPort = 51820
PrivateKey = <サーバーの秘密鍵をここに貼り付け(server_private.keyの中身)>
# wireguardのサーバーに接続した状態で外部サイトに接続できるよう設定
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
# クライアント側の設定
PublicKey = <クライアントの公開鍵をここに貼り付け(client_public.keyの中身)>
AllowedIPs = 10.0.0.2/32 # クライアントに割り当てる仮想 IP アドレス
サーバー側のWireguardを起動

サーバー側で作った設定をもとに権限設定し、wireguardをデーモン登録します

sudo chmod 600 /etc/wireguard/server.conf && sudo systemctl enable wg-quick@server
&& sudo systemctl start wg-quick@server
クライアントファイルの作成

サーバー側でサーバー側の設定作成と同じように、クライアント側の設定ファイルを作成します。

nano /etc/wireguard/client.conf
[Interface]
PrivateKey = <クライアントの秘密鍵をここに貼り付け(client_private.key の中身)>
# クライアント側の仮想 IP アドレス
Address = 10.0.0.2/24
#DNS サーバーを指定(ここではCloudFlare)
DNS = 1.1.1.1
[Peer]
PublicKey = <サーバーの公開鍵をここに貼り付け># サーバー公開鍵(server_public.key の中身)
Endpoint = 先ほど取得したサーバーのGlobalIP::51820
# NAT 越えや接続維持のため
PersistentKeepalive = 25
クライアント側に適用

クライアント側でStep5で作成したclient.confの中身をコピーし、設定に書き込めば完了です。

Windows or MacでWireGuardアプリを開く
→空のトンネルを追加
→名前を設定し、もともと書いてあった内容を削除し、サーバー側で作成したclient.confの中身を貼り付ける。

有効化した際に、下の画像の受信したデータ送信したデーターが増えていけば、通信成功です。
送信したデータだけ少し増えるときはうまく動いていません。下は成功している時の写真です

実測

自宅(関東)とサーバー(東京)間でVPNを繋いでpingで実測をしてみました。

計測地点遅延(ms)
家-サーバー(直接)31.897ms
家-サーバー(VPN経由)27.816ms

ルートが最適化されているからか遅延はなぜかVPN経由でサーバーにpingを投げた方が短くなりました。wireguard恐るべし…

まとめ

お疲れ様でした。手動でやるとこんな感じです。
仕組みがわかるので、とりあえず手動で構築してみることをお勧めします。

一度成功したらジェネレーターなるものを利用して構築してみてください。すごく楽に構築できます。下のサイトはサーバーに情報が行かないのでお勧めです。

参考資料・帰属

WireGuardhttps://www.wireguard.com

WireGuardを使って爆速でVPNトンネルを構築する https://qiita.com/tama_ham/items/52d45d618edccbb914ca

“WireGuard” is a registered trademark of Jason A. Donenfeld.
“WireGuard”およびWireGuardのロゴは、Jason A. Donenfeld氏の登録商標です。