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

VPN(Virtual Private Network)とは、公衆のインターネット回線などを使って、暗号化された「仮想的な専用線」(トンネル)を構築し安全にデータを送受信する技術です。
普段使用するソフトウェアVPNに関しては第3層ネットワーク層で動作します。
↓の記事で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 reloadiptablesの場合
sudo iptables -A INPUT -p udp --dport 51820 -j ACCEPT[affi id=1]サーバー側でパブリックキーとプライベートキーの生成を行います。最初に自身のグローバルIP(ネット上の住所みたいなもの)を確認します。
curl inet-ip.conf #出力例 160.251.215.230ここからは実際にカギを生成します。まずはディレクトリに移動します(ubuntuの方は事前にsudo iコマンドでsudo シェルに入っておいてください。)
cd /etc/wireguardwg 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で設定を編集できます。
サーバー側で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をデーモン登録します
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氏の登録商標です。

