プライバシーを強化するためにVPNを構築したいけれど、設定がやや難しかったり、仕組みを詳しく知りたい方向けに、1年以上WireGuardを運用してきた筆者が解説します。
近年、WireGuardを採用する方も増えているのではないでしょうか。
用語解説!
VPNとは
VPN(Virtual Private Network)とは、公衆のインターネット回線などを使って、暗号化された「仮想的な専用線」(トンネル)を構築し安全にデータを送受信する技術です。
普段使用するソフトウェアVPNに関しては第3層ネットワーク層で動作します。
WireGuard とは
2020年ころに正式版がリリースされたかなり新しく、今注目されているVPN プロトコルです。
約4,000行という短いコードと最新暗号(ChaCha20-Poly1305/Curve25519)採用で、設定が簡単かつ軽量。オーバーヘッドが少なめ。
UDP単一ポートでレイヤ3トンネルを張り、NAT越えやモバイルのローミングにも強いシームレス接続。ノイズベースのカギ交換により安全性が高い。
wireguardにはクライアント版、サーバー版という概念がなく、どちらも対等に扱われ、設定次第で “サーバー役”“クライアント役” として運用できるのが特徴。
wireguardはクライアント役とサーバー役でそれぞれカギをお互いに交換を行い、そのうえで通信を開始します。
必要なもの
VPSや専用サーバーなど、外部からUDPパケット(デフォルトでは 51820/UDP)を受けられるもしくはNAT 越えが確実にできる環境
自宅で、別のポートを設定したい方はUDPをのポートを開けておいてください。
構築
1.WireGuardのインストール
wireguardはサーバーとクライアントがどちらも対等に扱われるため、サーバー用ソフト、クライアント用ソフトという区別がなく、それぞれに同じソフトをインストールし、設定でサーバ役、クライアント役を設定します。
mac・windowsの場合
上のリンクを押し、自分の環境のものをクリックしてインストールしてください。macはAppStore、Windowsはインストーラーをダウンロードできます。
Linux(Debian・Ubuntu)の場合
debianの場合はパッケージに公開されていますので、コマンド一つでインストールできます。
sudo apt -y install wireguard
クライアントもdebian(Ubuntu)の場合、あとでDNSを使用するのでopenresolveを入れておきましょう。
sudo apt -y install openresolv
2.ポート開放
まず構築準備としてポートを開放します。ポートの開放はサーバー側で行います。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]
3.設定ファイルの生成
サイトにジェネレーターなどはあるのですが、とりあえず最初はコマンドで生成してそれをファイルに書き込んでみましょう。
ここではやるべきことをサーバー側クライアント側で分けて記述します。サーバー側ですべてのファイルを作成したのちに、それをクライアントに持っていきます。
サーバー側
最初に自身のグローバル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で設定を編集できます。
# nano /etc/wireguard/wg0.conf
[Interface]
Address = 10.0.0.1/24 # サーバーの仮想インターフェース IP アドレス
ListenPort = 51820 # クライアントからの接続を待ち受けるポート
PrivateKey = <サーバーの秘密鍵をここに貼り付け(server_private.keyの中身)>
[Peer]
# クライアント公開鍵
PublicKey = <クライアントの公開鍵をここに貼り付け(client_public.keyの中身)>
AllowedIPs = 10.0.0.2/32 # クライアントに割り当てる仮想 IP アドレス
# nano /etc/wireguard/client.conf
[Interface]
PrivateKey = <クライアントの秘密鍵をここに貼り付け(client_private.key の中身)>
Address = 10.0.0.2/24 # クライアント側の仮想 IP アドレス
DNS = 1.1.1.1#DNS サーバーを指定
[Peer]
# サーバー公開鍵(server_public.key の中身)
PublicKey = <サーバーの公開鍵をここに貼り付け>
Endpoint = 先ほど取得したサーバーのGlobalIP::51820
PersistentKeepalive = 25 # NAT 越えや接続維持のため
お疲れさまでした。設定ファイルの権限を設定し、再起動しても自動で起動するようにSystemdに登録しちゃいましょう。
sudo chmod 600 /etc/wireguard/wg0.conf && sudo systemctl enable wg-quick@wg0 && sudo systemctl start wg-quick@wg0
クライアント側
先ほど作成したclient.confの中身をコピーし、設定に書き込めば完了です。
Windows or MacでWireGuardアプリを開く
→空のトンネルを追加
→名前を設定し、もともと書いてあった内容を削除し、サーバー側で作成したclient.confの中身を貼り付ける。
有効化した際に、下の画像の受信したデータ送信したデーターが増えていけば、通信成功です。
送信したデータだけ少し増えるときはうまく動いていません

余談…
余談にはなりますが、透明性の高い設定ファイルジェネレーターを作成したいと思い、WireGuardConf generatorを作成しました。
もしよかったらご使用ください…

参考資料・帰属
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氏の登録商標です。
コメント