dockerで超簡単WireGuard構築!WG-Easyで簡単サーバー構築!超簡単ユーザー管理!

スポンサーリンク
proxmox 02 Proxmox
本記事はPRによる消費税込みの価格表示です

ProxmoxはLinuxのKVMを使って簡単に高機能な仮想マシン(VM)環境を構築できます。

さらに、軽量コンテナ環境であるLXC(Linuxコンテナ)も同じインターフェース上で管理することができます。

このLXCコンテナ、同じコンテナであるDockerと比較するとDockerが「アプリコンテナ」と言われているのに対し、LXCは「OSコンテナ」と言われるほど、どちらかといえば軽量な仮想マシン(VM)的な使い方ができる点が特徴です。

そしてこの「軽量な仮想マシン(VM)的な使い方」により、LXCコンテナ内にDockerを導入して(ネスティング)動かすこともできます。

本記事ではLXCコンテナのネスティング機能によりDockerを導入し、DockerコンテナとしてWireGuardおよびダイナミックDNS環境を構築していきます。

  1. ProxmoxとLXCコンテナ
    1. Proxmoxとは?
    2. LXCコンテナとは?
    3. LXCコンテナでdockerを動かす
  2. Proxmox環境でWireGuard VPN環境を構築
    1. WireGuard環境で必要なもの
    2. WireGuardのDockerコンテナ「WG-Easy」
    3. ダイナミックDNSコンテナ「DDNS-Updater」
  3. STEP⓪ Proxmoxのインストール
  4. STEP① ProxmoxのLXCコンテナへDebianをインストール
    1. LXCコンテナのインストール
    2. LXCコンテナの起動と初期設定
    3. LXCコンテナへDockerをインストール
  5. STEP② Portainer-ce(Dockerイメージ)をインストール
    1. Portainer-ceのDockerイメージをインストール
    2. Portainer-ceによるdockerコンテナ管理
  6. STEP③ DDNS-Updater(Dockerイメージ)をインストール
    1. DDNS-Updaterの機能
    2. DDNS-Updaterコンフィグファイルの作成
    3. DDNS-UpdaterのDockerイメージをインストール
    4. DDNS-Updaterの稼働状況
  7. STEP④ WG-Easy(Dockerイメージ)をインストール
    1. WG-Easyのログインパスワード・ハッシュを生成する
    2. WG-EasyのDockerイメージをインストール
    3. WG-Easy管理画面
  8. STEP⑤ ルーターの設定/ポート転送設定
    1. OpenWrtルーターでのポート転送設定
    2. バッファロールーターでのポート転送設定
  9. STEP⑥ WireGuardクライアント設定
    1. WireGuardクライアントアプリのインストール
    2. WireGuardアカウントの作成
    3. WireGuard定義ファイルの設定とVPN接続
    4. WireGuard VPN接続の終了
    5. WG-Easyの管理機能
  10. まとめ、Proxmoxでdockerコンテナを使う
    1. WireGuard環境構築の優れもの「WG-Easy」
    2. 注意点!DockerによるVPNでは拠点間VPNは構築できない

ProxmoxとLXCコンテナ

Proxmoxとは?

ProxmoxとはDebianベースの仮想システムであり、KVMによる仮想マシン(VM)の構築・管理が行えます。

2024年になってVMWare社がライセンス体系を大きく変更したことで無償版のESXiが提供されなくなりました。

ProxmoxはすでにESXiと人気を二分する仮想サーバー環境でしたが、現在はその(ESXi)代替ホームサーバーとして非常に利用者が増えているようです。

LXCコンテナとは?

ProxmoxはKVMによる仮想マシン(VM)の構築・管理ができると同時に、LXC(Linuxコンテナ)によるコンテナ機能も利用することができます。

LXCはDockerと同じでコンテナという仕組みに分類されますが、Dockerが「アプリコンテナ」と言われるのに対しLXCは「OSコンテナ」と言われます。

LXCの使い方としては「超軽量のLinuxサーバーをあっという間に構築できる」というイメージです。

仮想マシン(VM)を構築してもいいんだけど、簡単に試したい・サクッと環境構築したい、リソース(CPU/メモリ)をあまり使いたくない、という使い方の場合に最適な仕組みがLXCコンテナです。

LXCコンテナでdockerを動かす

LXCコンテナを使えばサクッとDebianなどのLinux環境を構築することができます。

LXCコンテナによるLinux環境は構築(インストール)もテンプレートベースの簡単インストールだし、リソース(CPU/メモリ)も非常に小さな環境で動作します。

そして、LXCコンテナでLinux環境を構築すればその中にDockerをインストールすることができます。

LXcコンテナにDockerがインストールできれば、(当然ながら)星の数ほど公開されているDockerイメージをインストールしてアプリケーションを簡単に利用することができるようになります。

Proxmoxの使いやすい環境を利用してDockerアプリを使いたい、という場合にはProxmoxの仮想マシン(VM)またはLXCコンテナでDockerサーバーを構築する、というのは有効な手段です。

Proxmox環境でWireGuard VPN環境を構築

本記事の目標は自宅WireGuardサーバーの構築です。

いつでも外出先(インターネット側)から自宅へWireGuardによるVPN接続ができる環境の構築です。

このWireGuardによる自宅VPN環境を「Proxmox & LXC & dockerで構築してみよう」というのが本記事の内容になります。

この目標を達成するための仕組みと構築手順について説明します。

WireGuard環境で必要なもの

WireGuardサーバー機能

本記事ではWireGuardのサーバー(待ち受け)側機能として「WG-Easy」というDockerコンテナイメージを利用します。

DockerコンテナをインストールするだけでWireGuardのサーバー(待ち受け)側環境が一発構築できます。

さらに、WireGuardでちょっと面倒なピア(接続相手)側の接続管理(IPアドレス/WireGuard秘密鍵・公開鍵)の管理もウェブUIでできる優れものです。

ダイナミックDNSの管理機能

本記事では自宅へ接続する場合の名前解決としてフリー(無料)のダイナミックDNSサービスである「DDNS Now」を利用させていただきました。

そして、「DDNS Now」への定期的な最新IPアドレスの登録・更新するためのダイナミックDNSクライアントとして「DDNS-Updater」を利用します。

「DDNS-Updater」は多くの有料・無料のダイナミックDNSサービスに対応しているので、サービスごとの定型設定を行うことで簡単にIPアドレスの登録・更新ができます。

そして、標準対応していないダイナミックDNSサービスであっても「カスタム(Custom)」機能により対応可能です。

今回利用した「DDNS Now」は「DDNS-Updater」の標準対応ダイナミックDNSではないので、この「カスタム(Custom)」機能を使って環境構築していきます。

自宅ルーターのポート転送機能

外部(インターネット側)から自宅のWireGuardサーバーへ接続するためには、自宅ルーターにポート転送機能が必要です。

本記事では自宅ルーターとしてOpenWrtルーターおよびバッファローの「WXR-6000AX12S」を前提とし、ポート転送設定を行っていきます。

なお、比較的安価な初心者向け(?)ルーターにはポート転送機能のないルーターも存在します。

このようなポート転送機能のないルーターの場合には外部(インターネット側)から自宅サーバー(WireGuardサーバー)への接続はできません。

WireGuardのDockerコンテナ「WG-Easy」

WG-Easy

WireGuardの機能をDockerイメージとして配布されているのが「WG-Easy」です。

WG-EasyをDockerコンテナとしてインストールすることでDockerのサーバー側(待ち受け側)環境が一発で構築されるのはもちろんのこと、面倒なクライアント側(接続する側)のIPアドレス管理や鍵管理を専用のウェブインターフェースで管理することができる、というパッケージになります。

WireGuardは環境構築が簡単なのですが、接続相手(ピア)が増えてくるとその接続相手ごとのIPアドレス管理や鍵管理がちょっと面倒です。

WG-Easyを使えばその面倒なIPアドレス管理・鍵管理もWG-Easyが勝手にやってくれます。

本記事ではサーバー側(待ち受け側)の環境構築およびピア(接続相手)の管理の仕組みとして「WG-Easy」を利用します。

WG-Easyの特徴

  • DockerコンテナでWireGuardサーバー環境(待ち受け側)を構築できる
  • ピア(接続相手)の定義ファイルを自動生成してくれる
  • もちろんピアのIPアドレス・鍵も管理してくれる
  • ピアの追加・削除も自由、一時停止も可能
  • TrueNASやQNAP/SynologyなどのNASシステムでも利用可能

ダイナミックDNSコンテナ「DDNS-Updater」

外部(インターネット側)から自宅のWireGuard(WG-Easy)へ接続するためには(一般的に)ダイナミックDNSによる名前解決の仕組みが必要です。

多くの市販ルーターには有料・無料のダイナミックDNSサービスが添付されています。

また、「no-IP」などのような無料で提供されているダイナミックDNSサービスもたくさんあります。

これらダイナミックDNSに対して定期的に最新の自宅IPアドレスを登録・更新してくれる仕組みがダイナミックDNSクライアントであり、この機能をDockerイメージとして提供しているのが「DDNS-Updater」です。

本記事ではダイナミックDNSサービスとして「DDNS Now」を利用させていただき、「DDNS Now」への定期的なIPアドレス更新の仕組みとして「DDNS-Updater」を利用します。

DDNS-Updaterの特徴

  • DockerコンテナでダイナミックDNSクライアント環境を構築できる
  • 非常にたくさんのダイナミックDNSサービスに対応
  • 標準対応していないDDNSサービスも「カスタム(Custom)」登録ができる
  • TrueNASやQNAP/SynologyなどのNASシステムでも利用可能

STEP⓪ Proxmoxのインストール

まず最初にProxmoxをインストールして仮想サーバー環境を構築する必要があります。

本記事ではここから(Proxmox環境構築)の手順を説明してしまうと非常に長文記事となってしまいます

当サイトでは手のひらサイズのミニPC「HUNSN RJ03」にProxmoxをインストールして仮想サーバーとする記事を公開しています。

Proxmoxのインストール手順についてはこちらの記事を参考にしてください。

STEP① ProxmoxのLXCコンテナへDebianをインストール

では、仮想サーバーProxmox環境へLXCコンテナとして「Debian-12-Standard」をインストールします。

Docerがアプリケーションコンテナと言われているのに対し、LXCコンテナはOSコンテナとも言われます。

LXCコンテナは仮想マシン(VM)とほぼ同等のOS環境を非常に軽量なコンテナとして構築できます。

そして、Debian12(Bookworm)のLXCコンテナ版が「Debian-12-Standard」テンプレートとなります。

LXCコンテナのインストール

Proxmoxサーバー環境へ「Debian-12-Standard」をインストールしていきます。

Proxmoxは標準でLXCコンテナ環境に対応しており、さまざまなLXCテンプレートからLXCコンテナを構築することができます。

コンテナテンプレートの更新

まず、Proxmoxが対応しているLXCコンテナ環境で利用可能なLXCテンプレートのリストを最新化しておきましょう。

メニュー「ノード(自分のサーバー)⇒シェル」からテンプレートのアップデートコマンドを発行しておきます。

proxmoxのLXCコンテナでtailscale環境構築

以下のような実行結果となります。

root@sbpve01:~# pveam update
update successful
root@sbpve01:~#

以上でProxmoxのLXCコンテナテンプレートリストは最新化されます。

LXCコンテナテンプレートのダウンロード

メニュー「ストレージ(local)⇒CTテンプレート」から「テンプレート」ボタンを押下します。

proxmoxのLXCコンテナでtailscale環境構築

Proxmoxで利用可能なLXCコンテナテンプレートの一覧が表示されます。

検索欄に「debian」を入力すると、一覧が絞り込まれて「Debian 12 Bookworm(standard)」が表示されます。

Proxmox LXCコンテナ

種別 パッケージ 説明
lxc Debian-12-standard Debian 12 Bookworm(standard)

上記「debian-12-standard」を選択して「ダウンロード」ボタンを押下します。

Proxmox LXCコンテナ

「TASK OK」のメッセージが出たらダウンロード処理が終了しています。

ダウンロードが終了したら画面右上の「×」をクリックしてダウンロード画面を閉じます。

Proxmox LXCコンテナ

テンプレートの一覧画面に今ダウンロードしたテンプレートが登録されています。

LXCコンテナのインストール

ダウンロードしたテンプレートを使って「debian-12-standard」をインストールしていきます。

ProxmoxでのLXCコンテナインストールはウィザード形式で行っていきます。

画面上部(右上)から「CTを作成」を押下します。

Proxmox LXCコンテナ

全般:コンテナウィザード①

コンテナ作成ウィザードの「全般」タブが表示されます。
dockerでWireGuard環境構築

以下のように入力してください。

ノード 初期値のまま
CT ID 初期値のままでよい
※またはお好きなID
ホスト名 構築するコンテナのホスト名を指定
※本記事では”v-docker”
非特権コンテナ チェック
ネスト チェック
リソースプール 未指定
パスワード コンテナへログインするときのパスワード
パスワードの確認 パスワードと同じものを入力
ssh Public Key 未指定

入力したら「次へ」。

テンプレート選択:コンテナウィザード②

「テンプレート」タブが表示されます。

Proxmox LXCコンテナ

先ほどダウンロードした「debian-12-standard」を選択してください。

ディスク:コンテナウィザード③

「ディスク」タブが表示されます。

proxmoxのLXCコンテナでtailscale環境構築

ディスクを作成するストレージを選択し、「次へ」。

CPU:コンテナウィザード④

「CPU」タブ画面が表示されます。

proxmoxのLXCコンテナでtailscale環境構築

CPUスペックを設定します。

後から変更できるので、ここでは「1 Core」として設定します。

メモリ:コンテナウィザード⑤

「メモリー」タブ画面が表示されます。

proxmoxのLXCコンテナでtailscale環境構築

メモリーも後から変更可能なので、ここでは「512 MB」と設定します。

※もっと小さく「128 MB」でもよかったです・・・

ネットワーク:コンテナウィザード⑥

「ネットワーク」タブ画面が表示されるので、LXCコンテナのネットワーク設定(IPアドレス)を行います。

dockerでWireGuard環境構築

我が家の自宅ネットワークは「192.168.11.0/24」としており、今回のdockerサーバー(debian-12-standard)のIPv4アドレスは「192.168.11.4/24」と設定しました。

また、IPv6アドレスは利用しません。

本記事では以下のように設定しました。

IPv4
アドレス
IPv4 「静的」をチェック
IPv4/CIDR LXCコンテナのIPv4アドレスを設定
※本記事では「192.168.11.4/24」
ゲートウェイ
(IPv4)
自宅ネットワークのゲートウェイを設定
※本記事では「192.168.11.1/24」
IPv6
アドレス
IPv6 「静的」をチェック
IPv6/CIDR IPv6アドレスは使用しないので空白のまま
ゲートウェイ
(IPv6)
IPv6アドレスは使用しないので空白のまま

なお、IPv4アドレス(IPv4/CIDR)をDHCPとして設定することも可能ですが、DHCPからIPv4アドレスを取得する設定の場合はLXCコンテナ起動時にかなり時間がかかります。

よって、「DHCP」を選択しない方が良いです。

DNS:コンテナウィザード⑦

「DNS」タブ画面が表示されます。

proxmoxのLXCコンテナでtailscale環境構築

初期値のままで「次へ」。

確認:コンテナウィザード⑧

「確認」タブ画面が表示されます。

Proxmox LXCコンテナ

設定した内容を確認し「完了」ボタンを押下。

Proxmox LXCコンテナ

しばらくコンテナ作成のタスクが実行されます。

「TASK OK」が表示されたらコンテナ作成完了です。

LXCコンテナの起動と初期設定

メニュー「データセンター⇒LXCコンテナ」に今作成したコンテナが一覧表示されています。

では、このコンテナを起動してみます。

サブメニュー「コンソール」を選んで画面上の「開始」ボタンを押下すると、コンソール画面上でコンテナが起動します。

proxmoxのLXCコンテナでtailscale環境構築

rootユーザーでログインします。パスワードはコンテナ作成時に「全般」タブで設定したパスワードです。

Proxmox LXCコンテナ

モジュールの最新化

ログインしたら、最初にDebianのモジュールを最新化しておきましょう。

### Debianを最新化 ###
apt update && apt -y upgrade

以上でDebian(debian-12-standard)のモジュールが最新化されます。

タイムゾーン(Asia/Tokyo)の設定

インストール直後のLXCはタイムゾーンが世界標準時となっています。

これを「Asia/Tokyo」へと変更設定しておきます。

### TimeZoneを"Asia/Tokyo"へ設定 ###
timedatectl set-timezone Asia/Tokyo

以上でタイムゾーンが「Asia/Tokyo」になります。

引き続き、作成したLXCコンテナ(Debian)へDockerモジュールをインストールしていきます。

LXCコンテナへDockerをインストール

「LXCコンテナでDockerコンテナを動かす」と言うと「1つのDockerコンテナを1つのLXCコンテナで動かす」というイメージになりますが、そうではありません。

LXCコンテナを使ってLinuxサーバーを構築、そのLinuxサーバー(LXCコンテナ)の中にDockerをインストールし、あとはお好きなDockerコンテナを使っていく、という使い方になります。

つまりDockerを動かすサーバーを仮想マシン(VM)として使うかLXCコンテナで使うか、という違いになります。

Debian(LXCコンテナ)へのDockerのインストールは超簡単です。

以下のコマンドをコピペすることで、一発インストールです。

### curlをインストール ###
apt install -y curl

### dockerインストールスクリプトを実行 ###
curl fsSL https://get.docker.com | sh

### ユーザー属性の変更
usermod -aG docker root

### ユーザー属性を変更しているのでいったんログアウト
exit

以上でLXCコンテナを使ってのDockerサーバーが構築完了です。

STEP② Portainer-ce(Dockerイメージ)をインストール

Portainer-ceはオプション(任意)です

Dockerコンテナの起動状態を確認したり停止・再起動などの操作を行うためにPortainer-ceをインストールしておきます。

Dockerコンテナの各種操作をコマンドでできる人は不要ですが、ブラウザで確認・操作したい、という場合にはインストールしておくと便利です。

Simple Docker Management System | Portainer

Portainer-ceのDockerイメージをインストール

Portainer-ceはDockerイメージとして配布されているので、簡単にインストールすることができます。

以下の「docker run」コマンドをコピペするだけで、portainer-ceのDockerイメージをインストールすることができます。

### Portainerをインストール ###
docker run -d \
--name portainer \
-p 9000:9000 \
-p 9443:9443 \
--restart unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce

インストール後は「http://IPアドレス:9000」または「https://ipアドレス:9443」でPortainer-ce管理画面へアクセスすることができます。

インストール後に初めてアクセスする場合には管理者「admin」に対するパスワード設定が必要ですが、初期値ではパスワードは「12桁以上の英数字」となっています。
※パスワードポリシーは変更可能です。

Portainer-ceによるdockerコンテナ管理

Portainer-ceのインストールが完了すると、「http://dockerサーバーIP:ポート番号」または「https://dockerサーバーIP:ポート番号」により、Portainer-ceの画面へログインすることができます。

本記事ではdockerサーバーのIPアドレスは「192.168.1.4」であり、また「http(非SSL)」の場合のポート番号は「9000」、「https(ssl)」の場合のポート番号は「9443」です。

よってブラウザで「http://192.168.1.4:9000」でportainer-ceへ接続します。

WireGuardクライアントアプリ

上記のような画面によりグラフィカルにdockerコンテナを管理することができるようになります。

STEP③ DDNS-Updater(Dockerイメージ)をインストール

DDNS-Updaterはオプション(任意)です

外出先(インターネット側)から自宅への接続はIPv4アドレスではなくドメイン名で接続できると便利です。

すでにダイナミックDNS環境が構築されている場合はそのダイナミックDNSで提供されるドメイン名で良いです。

ダイナミックDNS環境が構築されていない場合には、DDNS-Updater(Dockerイメージ)を使ってダイナミックDNS環境を構築していきます。

Lightweight universal DDNS Updater program | Github

DDNS-Updaterの機能

DDNS-Updaterはそれ自体がダイナミックDNSの機能を提供するものではなく、各種ダイナミックDNSを提供するサービスに対して定期的なWAN側IPアドレスを通知してくれるDockerコンテナとなります。

そのためDDNS-Updaterの構築以前にダイナミックDNSの利用登録が必要です。

本記事ではフリーのダイナミックDNSサービスである「DDNS Now」を利用させていただき「〇〇〇.f5.si」というドメイン名を取得しています。

無料ダイナミックDNSサービス | DDNS Now

そして、「DDNS Now」のサービスに対して定期的にWAN側IPアドレスを通知する仕組みをDDNS-Updaterにより実現していきます。

DDNS-Updaterコンフィグファイルの作成

本記事では「/root/updater/data/config.json」として定義ファイル(config.json)を作成していきます。

## カレントディレクトリへ移動と確認
root@v-docker:~# cd
root@v-docker:~# pwd
/root
## DATAディレクトリの作成
root@v-docker:~# mkdir updater
root@v-docker:~# cd updater
root@v-docker:~# mkdir data
root@v-docker:~# chown 1000 data
root@v-docker:~# chmod u+r+w+x data
## config.jsonの作成
root@v-docker:~# touch data/config.json
root@v-docker:~# vi data/config.json

上記手順で作成したコンフィグファイル「config.json」にダイナミックDNSクライアントとしての機能を定義していきます。

標準対応のダイナミックDNS設定

DDNS-Updaterは標準で非常にたくさんのダイナミックDNSサービスに対応しています。

標準対応のダイナミックDNSサービスは以下のリンクから確認することができます。

DDNS-Updater Configuration | Github

そして、標準対応のダイナミックDNSサービスについては、個別に「config.json」の定義内容が具体的に説明されています。

標準対応のダイナミックDNSサービスをご利用の場合には、上記を参考に「config.json」を定義してください。

非標準対応のダイナミックDNS設定(DDNS Now)

DDNS-Updaterは標準対応以外のダイナミックDNSサービスを利用することもできます。

この場合、”Provider”として”custom”を選択指定することで、任意のダイナミックDNSサービスの利用定義を行います。

Custom Provider | Github

本記事で利用するダイナミックDNSサービス「DDNS Now」はその利用方法について以下の記載があります。

IPv4アドレスのアクセス元アドレスでAレコードを更新
“https://f5.si/update.php?domain=ユーザ名&password=パスワードもしくはAPIトークン”

つまり、上記のブラウザインターフェースアクセスにより、アクセス元回線のIPアドレスが登録・更新される、という仕組みです。

また、IPアドレスの登録・更新の結果として、正常に登録・更新された場合には以下のテキストレスポンスが返る、ということです。

レスポンス(テキスト)
OK:SUCCESS
正常に処理完了

この情報をもとに「DDNS Now」の”custom”設定は以下のようになります。

{
  "settings": [
    {
      "provider":      "custom",
      "domain":        "mydomain.f5.si",
      "url":           "https://f5.si/update.php?domain=mydomain&password=mypassword",
      "ipv4key":       "ipv4",
      "ipv6key":       "ipv6",
      "success_regex": "OK:SUCCESS",
      "ip_version":    "ipv4",
      "ipv6_suffix":   ""
    }
  ]
}

これをコンフィグファイル「/root/updater/data/config.json」へ登録します。

provider 個別定義の”custom”と定義
domain ご利用のドメイン名を定義
※”mydomain”部分が登録部分です
url “DDNS Now”へのIPアドレス更新URLを定義
※”mydomain”と”mypassword”をご利用のものに変更
ipv4key “ipv4″と定義
ipv6key “ipv6″と定義
success_regex IPアドレス更新成功時のレスポンステキストを定義
ip_version IPアドレス更新するIPバージョンを定義
※我が家はIPv4のみなので”ipv4″と定義
ipv6_suffix IPv6Suffixを定義
※IPv6使用しないので””(空文字)定義

以上で「DDNS Now」対応のコンフィグファイル作成が完了です。

DDNS-UpdaterのDockerイメージをインストール

では、DDNS-UpdaterのDockerイメージをインストールします。

DDNS-UpdaterのDockerイメージは以下のコマンドのコピペでインストールすることができます。

### DDNS-Updaterをインストール ###
docker run -d \
--name=ddns-updater \
-e PERIOD=5m \
-p 8000:8000/tcp \
-v /root/updater/data:/updater/data \
--restart unless-stopped \
qmcgaw/ddns-updater

注意点は「-v /root/updater/data:/updater/data」部分であり、コンフィグファイル「config.json」を配置しているディレクトリを正しく指定してください。

DDNS-Updaterはdockerコンテナ起動時および定間隔でWAN側IPアドレスをチェックし、前回チェック時と異なれば(IPアドレスが変更されていれば)ダイナミックDNSサーバーへ最新のIPアドレスを通知します。

この「定間隔」は以下のパラメーターで指定します。

PERIOD WAN側IPアドレスをチェックする間隔
※初期値”5m”(5分間隔)

DDNS-Updaterの稼働状況

DDNS-Updaterはブラウザより「http://サーバーIP:ポート番号」で稼働状況を確認できます。

本記事ではdockerサーバーは「192.168.11.4」、DDNS-Updaterポート番号は「8000」なので「http://192.168.11.4:8000」でDDNS-Updater管理画面を開くことができます。

WireGuardクライアントアプリ

DDNS-Updaterは定期的にWAN側IPアドレスをチェックし、変更があればダイナミックDNSサービスへIPアドレスを通知してくれるだけの仕組みなので、特に管理・設定などやることはありません。

上図のように現在の(最新の)WAN側IPアドレスをはじめとして稼働状況が表示されます。

STEP④ WG-Easy(Dockerイメージ)をインストール

WireGuardのサーバー(待ち受け)側機能をDockerイメージでインストールしていきます。

利用するDockerイメージは「WG-Easy」です。

WG-EasyはWireGuardサーバー機能の一発構築だけでなく、ピア(接続相手)の管理もウェブ管理画面でできる機能もあり、非常に便利なDockerイメージです。

WG-Easy | Github

WG-Easyのログインパスワード・ハッシュを生成する

WG-Easyの管理画面へログインする際のパスワードが必要です。
※パスワードなしの運用も可能です。

WG-EasyのDockerコンテナ本体のインストールに先立ち、このパスワード・ハッシュを生成しておく必要があります。

このパスワード・ハッシュの生成方法は以下のページで説明してあります。

How_to_generate_an_bcrypt_hash.md | wg-easy

docker run --rm -it ghcr.io/wg-easy/wg-easy wgpw 'YOUR_PASSWORD'

生成したいパスワードは「’」(シングルクォーテーション)でくくります。

つまり、ログインパスワードを「mypass」としたい場合には以下のコマンドとなります。

root@v-sadoc01:~# docker run --rm -it ghcr.io/wg-easy/wg-easy wgpw 'mypass'
Unable to find image 'ghcr.io/wg-easy/wg-easy:latest' locally
latest: Pulling from wg-easy/wg-easy
c6a83fedfae6: Pull complete 
731f5f878c76: Pull complete 
17ea4cb95273: Pull complete 
2ba186860f73: Pull complete 
258f39275178: Pull complete 
3700239fd420: Pull complete 
360ff0804f5e: Pull complete 
4f4fb700ef54: Pull complete 
856d3d0ce412: Pull complete 
b6e71ca6d913: Pull complete 
Digest: sha256:66352ccb4b5095992550aa567df5118a5152b6ed31be34b0a8e118a3c3a35bf5
Status: Downloaded newer image for ghcr.io/wg-easy/wg-easy:latest
PASSWORD_HASH='$2a$12$Oh8jAx89xuK.KMaUB1dqc.*************************'
root@v-sadoc01:~# 

これで生成された「PASSWORD_HASH=’$2a**********’」がパスワード・ハッシュとなるのでコピーしておきましょう。

なお、WG-Easyの管理画面でのログインパスワードが不要という場合にはパスワード・ハッシュを生成する必要はありません

WG-EasyのDockerイメージをインストール

WG-EasyはDockerイメージとしてのみ提供されています。

WG-EasyのDockerイメージは以下のコマンドを変更してインストールします。

### WG-Easyをインストール ###
docker run -d \
--name=wg-easy \
-e LANG=en \
-e PORT=51821 \
-e PASSWORD_HASH='$2a$12*******' \
-e WG_HOST=YOUR_DOMAIN \
-e WG_PORT=51820 \
-e WG_PERSISTENT_KEEPALIVE=25 \
-e WG_DEFAULT_ADDRESS=10.8.0.x \
-v ~/.wg-easy:/etc/wireguard \
-p 51820:51820/udp \
-p 51821:51821/tcp \
--cap-add=NET_ADMIN \
--cap-add=SYS_MODULE \
--sysctl="net.ipv4.conf.all.src_valid_mark=1" \
--sysctl="net.ipv4.ip_forward=1" \
--restart unless-stopped \
ghcr.io/wg-easy/wg-easy

代表的なパラメーターは以下を参考にして環境に合わせて変更してください。
※初期値で良い場合はパラメーター不要

LANG 管理画面(WebUI)の言語を指定します。
※初期値は”en”(英語)
PORT 管理画面(WebUI)のポート番号を指定します。
※初期値は”51821″
PASSWORD_HASH 生成したパスワード・ハッシュを指定する
※パスワード不要の場合は本パラメータは不要
WG_HOST ダイナミックDNSによるドメイン名を指定します。
※本記事では〇〇〇.f5.si
WG_PORT WireGuardの待ち受けポートを指定します。
※WireGuard推奨値=51820
WG_DEFAULT_ADDRESS WireGuardネットワークのIPアドレス範囲を指定します。
※初期値は10.8.0.x
WG_PERSISTENT_KEEPALIVE WireGuard(クライアント側)のKEEP_ALIVE時間(秒)を指定します。
※初期値は0(秒)ですがWireGuardの推奨値は25(秒)

なお、WG-Easyの全パラメーターについての説明は以下のリンクにて確認することができます。

WG-Easy | Github

WG-Easy管理画面

WG-Easyのインストールは以上で完了です。

ブラウザから「http://dockerサーバーIPアドレス:WG-Easyポート番号」へアクセスするとWG-Easyの管理画面が表示されます。

本記事ではdockerサーバーIPアドレスは「192.168.11.4」であり、WG-EasyのWebUIポート番号は51821なので「http://192.168.11.4:51821」でアクセスします。

WireGuardクライアントアプリ

パスワード・ハッシュを設定している場合にはログイン画面が表示されるのでパスワードを入力しログインします。

パスワード・ハッシュを設定していない場合にはログイン画面は表示されません。

WireGuardクライアントアプリ

上記のようなWG-Easy管理画面の初期状態が表示されると、WG-Easyのインストールは完了です。

WG-Easy管理画面の操作

WG-EasyによるWireGuard環境の操作方法を簡単に説明しておきます。

管理画面は非常にシンプルで以下の画面構成となっています。

WG-EASY管理画面

「+ New Client」ボタンを押下することで利用者(クライアント)を登録することができます。

利用者名を登録するだけで、WireGuard設定でちょっと面倒な鍵管理も自動的にやってくれます。

「Backup」ボタンを押下すると、登録されている利用者情報や各利用者のカギ情報がJSONファイルとしてダウンロード(バックアップ)できます。

「Restore」ボタンを押下すると、バックアップしたJSONファイルから利用者情報/カギ情報を復元することができます。

障害が起こっても、WG-Easy自体やdocker動作環境などは簡単に復元(再インストール)することができますが利用者情報(データ)の復元にはバックアップが必要です。

できれば新しい利用者を登録したタイミングで「Backup」を取得・保管しておくと良いでしょう。

WG-Easy利用者の管理

WG-EASY管理画面

利用者を登録すると利用者ごとに機能ボタンが表示されます。

利用一時停止 利用者のWireGuard接続をオン/オフ(接続不可)することができます。
※オフ(左へスライド)で一時的に接続不可
設定ファイル(QRコード) WireGuard接続情報のQRコードが表示されます。
※スマホ利用の場合に利用
設定ファイル(ダウンロード) WireGuard接続情報ファイルをダウンロードします。
※PC利用の場合に利用
利用者削除 利用者の登録を削除します。

STEP⑤ ルーターの設定/ポート転送設定

外部(インターネット側)から自宅ネットワークへVPN接続する場合、自宅ルーターにポート転送の設定が必要です。

これは、外部から自宅ルーターへWireGuardによる接続要求(※1)があった場合にはその通信を今回構築したWG-EasyのDockerコンテナ(※2)へ転送するための設定になります。

※1)本記事ではWG-EasyによるWireGuard待ち受けポートは「UDP:51820」です。
※2)本記事ではWG-EasyのdockerサーバーIPアドレスは「192.168.11.4」です。

つまり「外部から自宅ルーターへの”UDP:51820″の接続要求をIPアドレス192.168.11.4のdockerサーバ(WG-Easy)へ転送する」という設定です。

この設定は自宅ルーターに対して行います。

OpenWrtルーターでのポート転送設定

我が家で使っているルーター「OpenWrtルーター」でのポート転送設定を行います。

管理メニュー「ネットワーク > ファイアウォール」画面から「ポートフォワーディング」タブ画面を開きます。

dockerでWireGuard環境構築

「追加」ボタンから新規のポート転送(ポートフォワーディング)設定を行っていきます。

dockerでWireGuard環境構築

以下の内容で設定します。

名前 ご自由に
※本記事では”UDP51820″と設定
プロトコル “UDP”を選択設定
※”TCP”のチェックを外す
外部ポート “51820”を設定
※WG-Easyに設定したWireGuardの待ち受けポート
内部IPアドレス “192.168.11.4/24″を選択設定
※v-docker(LXCコンテナ)のIPアドレスを設定
内部ポート “51820”を設定
※WG-Easyに設定したWireGuardの待ち受けポート

設定後、「保存」ボタンで設定を保存します。

dockerでWireGuard環境構築

一覧画面で内容を確認し「保存&適用」ボタンを押下してシステム反映します。

以上でOpenWrtルーターでのポート転送(ポートフォアーディング)設定は完了です。

バッファロールーターでのポート転送設定

市販ルーターでのポート転送設定として、バッファロールーター(WXR-6000AX12S)でのポート転送設定を説明します。

なお、市販ルーターの比較的低価格帯のものにはポート転送機能のない機種も多いですが、この場合はポート転送できない(つまり、WireGuardによるVPNが利用できない)ということになります。

ここからはバッファロー「WXR-6000AX12S」の管理画面を例に説明していきます。

メニュー「ルーターセキュリティ > ポート変換」画面を開きます。

WireGuardクライアントアプリ

「ポート返還の新規追加」画面より以下の設定を行います。

プロトコル TCP/UDP 任意のUDPポート:51820
LAN側IPアドレス 192.168.11.4
※WG-EasyのdockerサーバーIPアドレス
LAN側ポート 51820
※WG-EasyのWireGuardポート番号

上記設定し「新規追加」ボタンを押下します。

WireGuardクライアントアプリ

上記の設定により「自宅ルーターでのUDP:51820の着信(WireGuard)は192.168.11.4(WG-Easyサーバー)のポート番号51820へ転送」という設定になります。

以上がバッファロールーターでのポート転送設定となりますが、機種によりメニューや手順が異なるので詳細はお手持ちのマニュアルを参考にしてください。

STEP⑥ WireGuardクライアント設定

STEP①~⑤までの手順にて、WG-Easy(WireGuard)によるVPNサーバー環境(自宅ネットワーク環境)が構築完了となります。

次にクライアント側のWindowsパソコンの環境を構築します。

WireGuardクライアントアプリのインストール

WireGuardのクライアントアプリをインストールし、自宅ネットワークへWireGuardによるVPN接続を行ってみましょう。

WireGuardのクライアントアプリは以下のWireGuard公式サイトのリンクよりダウンロード・インストールします。

WireGuard Installation | WireGuardプロジェクト

ご自分の環境に合わせてクライアントアプリをダウンロードし、インストールしてください。
※本記事ではWindows11を前提とします。

WireGuardクライアントアプリのインストールが完了すると、タスクトレイにアプリが常駐します。

WireGuardクライアントアプリ

WireGuardアカウントの作成

まずはWireGuard(WG-Easy)での利用者登録(アカウント登録)を行います。

ブラウザからWG-Easy管理画面「http://サーバーIPアドレス:WEB-UIポート」へアクセスします。
※本記事ではサーバーIPアドレス:192.168.11.4/ポート番号51821なので「http://192.168.11.4:51821」となります。

WireGuardクライアントアプリ

パスワード入力画面が表示されるのでパスワード・ハッシュ生成時のパスワードを入力します。

WireGuardクライアントアプリ

WG-Easyの管理画面が初期表示されるので「+ New Client」ボタンを押下します。

WireGuardクライアントアプリ

クライアント名(本記事では”Windows11″)を入力し「Create」ボタンを押下し、アカウントを登録します。

WireGuardクライアントアプリ

以上で”Windows11″という名前のクライアント(アカウント)が登録されました。

WireGuardクライアントアプリ

アカウントのダウンロードアイコンをクリックすると、アカウントのWireGuard定義ファイルがダウンロードされます。

WireGuard定義ファイルの設定とVPN接続

ダウンロードしたWireGuard定義ファイルをクライアント(Windows11)のWireGuardクライアントアプリに設定します。

タスクトレイに常駐しているWireGuardアイコンをクリックするとWireGuardクライアントアプリが起動します。

WireGuardクライアントアプリ

WireGuardクライアントアプリを起動したら、「ファイルからトンネルをインポート」をクリックして、先ほどダウンロードしたWireGuard定義ファイルを読み込み(インポート)します。

ファイル(WireGuard定義ファイル)をインポートすることで、クライアント(Windows11 PC)は自宅のWireGuardサーバー(WG-Easy)へ接続可能な状態となります。

WireGuardクライアントアプリ

「有効化」ボタンを押下するとクライアント(Windows PC)と自宅のWireGuardサーバー(WG-Easy)がWireGuardによってVPN接続されます。

WireGuard VPN接続の終了

WireGuardクライアントアプリから「無効化」ボタン押下することで、クライアントとサーバー(WG-Easy)のVPN接続が終了します。

WireGuardクライアントアプリ

WG-Easyの管理機能

WG-Easyではクライアントごとに簡単にアカウントを作成し、管理することができます。

WG-Easyを利用することで、WireGuardではアカウントごとに必要なちょっと面倒な鍵管理から解放されます!

さらに、アカウントに対する便利な機能も提供されます。

WireGuardクライアントアプリ

WG-Easyの4つの管理アイコンは左から以下の機能を提供してくれます。

アイコン 管理機能
Disable Client クライアントの接続を拒否することができる
※左スライドで一時的に接続無効
Show QR Code 接続定義用QRコードを表示
※スマホアプリで使う
Download Configuration WireGuard定義ファイルをダウンロード
Delete Client クライアント定義(アカウント)を削除する

このように、WG-Easyを利用することでWireGuard単体で構築するよりも簡単に利用者を管理できる仕組みが構築できます。

まとめ、Proxmoxでdockerコンテナを使う

本記事では外出先からいつでも自宅ネットワークへ接続できるVPN環境を構築してきました。

VPN環境構築に必要となる「WireGuard(VPN)」「DDNS-Updater(DDNSクライアント)」「Portainer-ce(Docker管理)」の環境をすべてDockerコンテナで構築してみました。

アプリコンテナと言われるDockerを使えば必要な機能を簡単に一発インストールすることができ、その機能の組み合わせにより目的とする環境構築がとても簡単にできてしまいます。

WireGuard環境構築の優れもの「WG-Easy」

WireGuardはインストールも簡単だし接続も簡単で、まさに次世代VPNと呼ぶにふさわしいプロトコルです。

ただ、ピア(接続先)が増えてくると接続ごとに必要となるWireGuardネットワーク(IPアドレス)の管理や秘密鍵・公開鍵の管理などが面倒になってきます。

WG-EasyはDockerコンテナを導入するだけでWireGuardサーバー(接続待ち)側の環境が構築できるだけでなく、ピアごとの鍵管理などもやってくれる仕組みまでが含まれるDockerアプリです。

WireGuardを使って自宅ネットワークへの接続環境を構築するならWG-Easyは非常におすすめのアプリコンテナと言えます。

注意点!DockerによるVPNでは拠点間VPNは構築できない

WG-Easyを使うことでピア(接続相手)の管理もやってくれるWireGuard環境が構築できてとても便利です。

ただし、WG-EasyはDockerコンテナとしての提供のみであることからちょっと注意も必要です。

WG-Easyを使ってのWireGuard環境ではネットワークとネットワークを接続する拠点間VPNは構築できません。

拠点間VPNの場合には相手ネットワークへの静的ルーティングをデフォルトゲートウェイへ登録する必要があります。

これがDockerアプリ利用の場合には「IPアドレスとポート番号でルーティング」という必要があり、これは一般的な静的ルーティングでは実現できません。

よって、一般的にはDockerを使ってのVPN環境(WireGuard含む)では拠点間VPNの環境構築はできません。

タイトルとURLをコピーしました