WireGuard VPN を、管理画面（ wg-easy ）付きで建てる

# はじめに

この記事を読む前に下記を確認した方がいいかもしれません。
なお OCI だと無料で試せるので OCI を使用しています。

### Docker を使わずに WireGuard だけを建てるには（フロントエンドなし）

https://qiita.com/dxa/items/046d6e78d1e1ca16d72c

### OCI で IPv6 対応インスタンスを建てるには

https://qiita.com/dxa/items/39dd813c6c159a8e8eae


# フロントエンド wg-easy Ver.15

WireGuard VPN サーバーを、フロントエンド付きで建てる方法です。
wg-easy の特徴
* 設定ファイルを簡単に量産できる
* QRコードを発行できる
    * Android / iOS 用の WireGuard も簡単に設定できる
* その他の設定もすべて GUI 上で変更できる

使用した環境
* Enterprise Linux （ RHEL, CentOS, Rocky Linux, Alma Linux, Oracle Linux ） 9.5
* Docker Compose
* wg-easy Ver.15
  * WireGuard を含む
  * Ver.15 ではUIや内部構造が刷新
      * IPv6 完全対応
      * 過去のバージョンとの互換性はない
      * 過去のバージョンが良い人は Ver.13 を使うといいです




# 導入

## 1. Docker コンテナを建てる

<details>
<summary>Docker が入っていない場合はコチラ（クリック）</summary>

### 1-0. Docker をインストール

```
# dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# systemctl enable --now docker
```
</details>

### 1-1. ディレクトリを作る


```
# mkdir -p /etc/docker/containers/wg-easy_wg0
```
複数建てることを考慮して"_wg0"を付けています。付けなくてもいいです。

### 1-2. ディレクトリへ移動する
```
# cd /etc/docker/containers/wg-easy_wg0
```

### 1-3. Docker Compose ファイルをダウンロードする
```
# curl -OL https://raw.githubusercontent.com/wg-easy/wg-easy/master/docker-compose.yml
```

### 1-4. docker-compose.yml を確認＆編集する

```diff_conf:docker-compose.yml
volumes:
  wg-easy_wg0: # ボリューム名（※）（★）

services:
  wg-easy:
+   environment:
+     - INSECURE=ture # httpでのアクセスを許可（公式はHTTPSリバースプロキシを推奨）
    image: ghcr.io/wg-easy/wg-easy:15
    container_name: wg-easy_wg0 # コンテナ名（※）
    networks:
      wg:
        ipv4_address: 10.42.42.42 # Docker コンテナのネットワーク（※）（＊）
        ipv6_address: fdcc:ad94:bacf:61a3::2a # Docker コンテナのネットワーク（※）（＊）
    volumes:
      - wg-easy_wg0:/etc/wireguard # マッピングするボリューム名（※）左辺を★と合わせる
      - /lib/modules:/lib/modules:ro
    ports:
      - "51820:51820/udp" # VPN ポートのマッピング（※）
      - "51821:51821/tcp" # GUI 管理画面ポートのマッピング（※）
    restart: unless-stopped
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      - net.ipv4.ip_forward=1
      - net.ipv4.conf.all.src_valid_mark=1
      - net.ipv6.conf.all.disable_ipv6=0
      - net.ipv6.conf.all.forwarding=1
      - net.ipv6.conf.default.forwarding=1

networks:
  wg:
+   external: true # 既存の（自分で作った）ネットワークを使うことを明示
+   name: wg0 # ネットワーク名（※）
    driver: bridge
    enable_ipv6: true
-   ipam:
-     driver: default
-     config:
-       - subnet: 10.42.42.0/24
-       - subnet: fdcc:ad94:bacf:61a3::/64
```

IPAMに任せて Docker ネットワークを作るとネットワーク名が起動する度にランダムに変わるので、この表記を消して自分で作ります。一つのホストマシンで2つ以上建てる場合は（※）項目が重複しないように変更します。

### 1-5. Docker ネットワークを作る（名前を固定するために必要）
```
# docker network create \
  --driver=bridge \
  --subnet=10.42.42.0/24 \
  --ipv6 \
  --subnet=fdcc:ad94:bacf:61a3::/64 \
  --opt com.docker.network.bridge.name=wg0 \
  wg0
```

ここではネットワーク名を wg0 としています。
docker-compose.yml の（＊）項目と一致するように作ります。

<details>
<summary>既に同名のネットワークが存在していて削除する場合はコチラ（クリック）</summary>

#### 1-5-1. ネットワークを確認する

```
# docker network ls
```

#### 1-5-2. ネットワークを削除する

```
# docker network rm wg0
```
</details>


### 1-6. 起動する
```
# docker compose up -d
```

Docker Compose は docker-compose.yml がある場所でこのコマンドを使って起動します。

<details>
<summary>停止コマンドと再起動コマンドはコチラ（クリック）</summary>

#### 1-6-1. その他のコマンド

停止
```
# docker compose down
```
再起動
```
# docker compose restart
```
</details>

## 2. ネットワークの設定

### 2-1. 概要

```
[WireGuard クライアント]        [WireGuard サーバー (wg-easy)]        [外部ネットワーク]
        10.8.0.x  <---->     10.8.0.1 (仮想) | 10.42.42.42 (実IP) ----> Internet
                             ↑仮想IF wg0       ↑Dockerブリッジネットワーク
```

ネットワークはこの様になっています。仮想 IF の CIDR のデフォルトは 10.8.0.0/10 ですが、管理画面で変更できます。

### 2-2. WAF

環境に応じてポートを開放します。

* 51820/UDP
    * VPN 通信用
* 51821/TPC
    * wg-easy フロントエンド用（GUI設定画面用）
        * 見知らぬ人がアクセスできないよう、適切に設定してください

### 2-3. フォワーディングを有効にする

```/etc/sysctl.d/99-sysctl.conf
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.default.forwarding=1
```

### 2-4. 設定を反映させる

```
# sysctl -p /etc/sysctl.d/
```

### 2-5. Firewalld を設定する

```
# firewall-cmd --permanent --add-port=51820/udp
# firewall-cmd --permanent --zone=public --add-masquerade
# firewall-cmd --permanent --zone=trusted --add-interface=wg0
# firewall-cmd --permanent --zone=trusted --add-forward
```

上から
* ポート開放
* NAT（IPマスカレード）を有効にする
* wg0 を trusted ゾーンに（IF名は自信で設定したものに読み替えてください）
* trusted ゾーンからの forward を許可



<details>
<summary>firewall-cmd command not found （見つからない）と言われた場合はコチラ（クリック）</summary>

#### 2-5-1. Firewalld をインストール

```
# dnf install firewalld -y
# systemctl enable --now firewalld
```
最小構成の Enterprise Linux（Rocky Linux など）だと入っていない場合があるので導入して立ち上げます。
</details>


### 2-6. firewalld を再読み込み

```
# firewall-cmd --reload
```





# 使ってみる

ブラウザから http://IPアドレス:51821/ へアクセスして管理者登録を済ませます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21236/b1b39704-7896-4fb0-9d3b-c812e1ccda65.png)

##### VPN （仮想 IF ）の CIDR を変更したい

* 管理画面の右上メニュー -> Admin Panel -> Interface -> Change CIDR ボタン
    * Hooks の中に Firewall の設定が含まれるため、変更後は必ず Restert Instance をクリックすること
    * 昔は yml ファイルの中で指定していたが、 Ver.15 では無効


##### Client の AllowedIPs を変更したい

* 管理画面の右上メニュー -> Admin Panel -> Config

その他の設定も、だいたい Admin Panel の中にあります。

#### Docker コンテナの初期化

docker-compose.yml に大きな変更を加えるなどしてやり直す場合は、次の手順で一度コンテナを削除します。

##### ボリューム名の確認
```
# docker volume ls
```

##### ボリューム削除
```
# docker volume rm ボリューム名
```

docker-compose.yml を再編集して建て直すときには、このコマンドで既存のコンテナを削除します。



# 参考

[wg-easy Ver.15 公式マニュアル](https://wg-easy.github.io/wg-easy/v15.0/examples/tutorials/basic-installation/)