概要
シンプルでクロスプラットフォーム、しかも構成しやすいVPNソフトウェアのWireGuardでVPN環境を作ります。WireGuardの設定ファイルはWg Gen Webを使ってWeb UIで管理します。設定ファイルはsystemdで監視し、WireGuardを自動で再起動、更新を反映します。ネットワーク設定は環境によって異なるため、環境に合わせて調整してください。
以下では、Ubuntu 20.04 LTSがインストールされたサーバにDockerとDocker Composeが利用できる環境が構築されていることを前提として進めていきます。
1. WireGuard環境の構築
WireGuard自体はaptで瞬時に入ります。そのままだと設定ファイルは手動で作成になりますが、それほど難しい作業ではないので、この時点で動作確認を行います。
sudo apt update
sudo apt install wireguard
Web UIがあってもWireGuardの設定方法は理解しておく必要があります。WireGuard自体にあまり馴染みがない場合は公式サイトのQuick Startが非常に参考になるのでおすすめです。触ってみればわかりますが、OpenVPNよりも仕組みが簡単で格段に設定しやすいです。
/etc/wireguard/wg0.conf ができたら、次のコマンドでサービスとして起動します。
sudo systemctl start wg-quick@wg0
sudo systemctl enable wg-quick@wg0
2. 管理用Web UIを用意する
管理用のWeb UIはGitHubを検索するといくつか出てきますが、少し触った感じでは、今回利用する Wg Gen Web が一番しっくり来ました。提供されている機能は設定ファイルを生成するだけとシンプルですが、必要十分です。本記事では取り扱いませんが、Keycloakとの認証連携も可能でした。SMTPサーバの設定をしておけば、クライアント用の設定ファイルを生成した後、メールの送信もできるようです。以下のスクリーンショットでは、クライアント追加したユーザ名がUnknownになっていますが、KeycloakとOpenID Connectで認証した場合はユーザの氏名が表示されました。ただし、管理者アカウント / 一般ユーザアカウントの区別はなさそうでした。
次の内容で docker-compose.yml を用意します。サーバのプライベートIPは適宜置き換えてください。また、以下は認証なしでWeb UIにログインできる構成なので、必要に応じてポート設定を 192.168.1.201:8080:8080 などプライベートIPにバインドするなど調整してください。
version: '3.6'
services:
wg-gen-web:
image: vx3r/wg-gen-web:latest
container_name: wg-gen-web
restart: unless-stopped
environment:
WG_STATS_API: http://<サーバのプライベートIP>:8182
WG_CONF_DIR: /data
WG_INTERFACE_NAME: wg0.conf
OAUTH2_PROVIDER_NAME: fake
volumes:
- /etc/wireguard:/data
ports:
- 8080:8080
wg-json-api:
image: james/wg-api:latest
container_name: wg-json-api
restart: unless-stopped
cap_add:
- NET_ADMIN
network_mode: host
command: wg-api --device wg0 --listen <サーバのプライベートIP>:8182
用意できたらコンテナを起動します。/etc/wireguard 以下にある設定ファイルは新しいものに置き換えられるため注意してください。
docker-compose up -d
http://<サーバのIPアドレス>:8080/ にアクセスするとWebUIが表示されます。ここで作業すると設定ファイルが /etc/wireguard に保存されますが、Wg-Gen-Web自体はWireGuardを操作しないため、設定反映には後述の自動反映設定が必要です。
Web UIにアクセスできてしまえば、あとは難しいところはなく設定できると思います。WireGuardをCUIで設定できる程度の前提知識は求められます。
3. 設定ファイルの自動反映設定
/etc/wireguard に設定ファイルを置いただけでは設定は反映されないので、Systemdで設定ファイルの更新を監視し、変更があれば自動で再起動するよう設定します。なお、WireGuardではreloadがないため、接続中のクライアントがいた場合は一時的に切断されます。クライアント側の設定ファイルでKeepAlive設定を短くしておけば、切断時間を短縮することができます。
[Unit]
Description=Watch /etc/wireguard for changes
[Path]
PathModified=/etc/wireguard
[Install]
WantedBy=multi-user.target
[Unit]
Description=Restart WireGuard
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl restart wg-quick@wg0.service
[Install]
WantedBy=multi-user.target
上記2つのファイルを配置したら、サービスを起動 / 有効化します。
sudo systemctl start wg-quick-wg0.path
sudo systemctl enable wg-quick-wg0.path
これ以降、Web UIで設定を変更すると /etc/wireguard/wg0.conf が更新され、それを監視しているSystemdがWireGuardが自動で再起動、設定が反映されます。
4. VPN接続のテスト
WireGuardは、Windows、Mac、Linux、FreeBSD、 iOS、Androidなど様々なプラットフォームで接続可能です。手元の環境では、以下について接続できることを確認しています。
- Windows 10 Pro (20H2)
- macOS (11.2.3 Big Sur)
- Gentoo / Linux (Kernel 5.10.27)
- FreeBSD 12.2-RELEASE
- iPhone 12 (iOS 14.4.2)
WireGuard接続用のアプリケーションが各プラットフォーム用に用意されているので、Web UIで作成した設定ファイルをダウンロードして読み込ませるだけで利用可能になります。
5. まとめ
WireGuardでVPN環境を構築しました。また、設定ファイルを管理するWeb UIを用意し、設定ファイルの更新を検知して自動でサービスが再起動するよう調整しました。その後、手元の環境で接続確認を行いました。