WireGuardとWg Gen Webで管理が簡単なVPN環境を作る

概要

シンプルでクロスプラットフォーム、しかも構成しやすい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を用意し、設定ファイルの更新を検知して自動でサービスが再起動するよう調整しました。その後、手元の環境で接続確認を行いました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA