SynologyNASにVPN（WireGuard）を構築した手順

## 経緯
今まではraspiをVPNとして稼働させて、外出先から自宅環境にアクセスしていた。
raspiはそれ以外には使用していなかったので稼働を止めたい。
常に稼働させているsynologyのNASがあり、せっかくなのでVPNとしても使いたい。

パッケージマネージャーには「VPNサーバー」というまさにそれ！っていうパッケージがあったが、自身が使用しているAndroid 14で使える良いものがなかった。

> L2TP および PPTP は Android 12 以降ではサポートされません。クライアントは、代わりに OpenVPN を使用して接続する必要があります。

https://kb.synology.com/ja-jp/DSM/tutorial/How_to_connect_VPN_server_from_Android

なので今回はsynologyNAS上にWireguardのコンテナを立ち上げ、VPN環境を構築する。

## 環境
製品名: SynologyNAS DS223j
DSMバージョン: DSM 7.2.1-69057 Update 5

## 1. Container Managerのインストール
ざっくりいうとNAS上で動かせるDocker。

1. パッケージセンターを立ち上げる
1. すべてのパッケージを押下
1. Container Managerを探し出し、インストールを押下
1. 完了！

![nas-con-install.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320196/6dde42a2-c9fe-3f1e-6739-23bab1a6a205.jpeg)

## 2. DDNSの取得
後々、WireGuard-Easyの設定で使用。
わざわざ外部サイトでドメイン取得してこなくてよいので楽ちん。

1. コントロールパネルを開く
1. 外部アクセス → DDNS → 追加を押下
1. 以下の通りに設定

|key|val|
|---|---|
|サービスプロバイダー|Synology|
|ホスト名|自分が使いたい名前を適当に入力|

4.「テスト接続」を押下し、接続できるかチェック
5.「OK」を押下
6. 完了！

![nas-set-ddns.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320196/4f281ffe-438b-fe15-a88c-8c2508655615.jpeg)

## 3. WireGuardのspk（Synology Package）を取得
この工程がないとWireGuard（WireGuard-Easy）のコンテナ立ち上げに失敗する。

1. 以下のURLから自身が使っているNASにあうPackage Archを確認する
https://kb.synology.com/en-me/DSM/tutorial/What_kind_of_CPU_does_my_NAS_have
筆者の場合はDS223jなので「rtd1619b」が該当する
![spk-install.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320196/b67f9354-87f4-97ea-3816-fb912c4efd41.jpeg)

1. 以下のgoogleドライブから該当したPackage Archに対応するspkファイルをダウンロードする
https://drive.google.com/drive/folders/1bY1u32nXS0Sj6tKfdZmuYon0sqFGoJpw
![spk-install2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320196/2af9a70d-5c91-dd3b-0704-b6dd6e0271b2.jpeg)

1. パッケージセンターを開き、「手動インストール」で先ほどダウンロードしたspkファイルを選択する![spk-install3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320196/e0f481c1-8550-9dde-0a28-d4e32eb14a91.jpeg)

1. 「次へ」を押下
1. 警告が出るので確認後、「次へ」を押下
1. 「インストール後に実行する」のチェックを外し、「次へ」を押下
1. パッケージセンターに「WireGuard」のパッケージが追加されていれば成功！

### 4. 追加したWireGuardを実行させる
少し面倒だが以下の手順で実行。

1. コントロールパネルを開く
1. 端末とSNMP → 端末 → 「SSHサービスを有効化する」にチェック
1. 念のためポートを22以外に設定して「適用」を押下
![active-ssh.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320196/e1d4706a-c0d1-125a-fce5-9b084a677d40.jpeg)

1. 外部端末からNASにssh接続する
```bash
$ ssh NASにログインする際の名前@NASのローカルIPアドレス -p ポート番号

（例）
$ ssh bokeNAS@192.168.0.100 -p 50022
```

5.以下のコマンドを実行
```bash
$ sudo /var/packages/WireGuard/scripts/start
```

6.パスワードを入力し、「successfully started」が出力されれば成功！

※PC以外からSSH接続する際の個人的おすすめアプリ
|外部端末|アプリ|
|---|---|
|iPhone/iPad|WebSSH|
|Android|ConnectBot|

## 5. WireGuard-Easyの立ち上げ
NAS的にはこれがラストの工程。

1. NASの画面でContainer Managerを立ち上げる
1. メニューから「プロジェクト」を選択し、画像の通りに設定する
![wg-con-set.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320196/2ad60b6c-edcc-23aa-1ee3-2b61791b7b39.jpeg)
1. ソースの箇所に以下のymlを張り付ける
```yml
version: "3.8"
services:
  wg-easy:
    image: ghcr.io/wg-easy/wg-easy
    container_name: wg-easy
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    environment:
      PASSWORD: password # WireGuardの管理画面に入る際に使用したいパスワードを書く
      WG_HOST: bokeNAS.synology.me # 「2. DDNSの取得」で設定したホスト名を書く
    ports:
      - 51820:51820/udp
      - 51821:51821/tcp
    restart: unless-stopped
    sysctls:
      - net.ipv4.ip_forward=1
      - net.ipv4.conf.all.src_valid_mark=1
    volumes:
      - ./etc_wireguard:/etc/wireguard
```
4.「次へ」を押下
5.「ウェブポータルをWebStation経由でセットアップ」のチェックを外し、「次へ」を押下
6.「完了」を押下。プロジェクトが正常に立ち上がった状態で追加されれば成功！
![wg-con-set2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320196/ebaddf3f-ad82-9902-7a44-d5da6bff9a95.jpeg)

## 6. ルーターの穴あけ
ルーターの管理画面を開き、「ポートマッピング（ポートフォワーディング）」の設定をする。
設定するポート番号は51820で、プロトコルはUDP（yml参照）。
![port-mapping.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320196/aa64b52d-b4be-4973-4bd9-53cd6d0f97a4.jpeg)

※同一ルーター内で既に使いたいポートがポートフォワーディングで使用されている場合は既にあるものを削除、もしくはymlの51820を別の番号にし、マッピングさせる必要がある。

> Q. ポートフォワーディングとは？
>
> A. 「ポートフォワーディング」は、「ポートマッピング」や「ファイアウォールに穴をあける」とも呼ばれ、インターネットから届いたネットワークパケット（トラフィック）を最終的な正しい機器に届ける方法を指定します。これは主に、特定のネットワークデータを正しい IP アドレスとその IP アドレスの正しいポートに転送する方法をネットワークファイアウォールまたはルーターに指示することによって行われます。

https://support.claris.com/s/article/Port-forwarding-information-1503692986266?language=ja

## 7. VPN接続確認
1. http://NASのローカルIPアドレス:51821 にアクセスし、管理画面が表示されるか確認
![wg-site.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320196/f70dd58a-9b67-9b6b-9968-ad74cd34f346.jpeg)
1. 「New」を押下し、作成されたclientのQRコードをVPN接続したい端末のWireGuardアプリで読み込ませる
1. 読み取った端末でVPNをONにし、適当なサイトにアクセスできれば成功！

## まとめ
٩( ᐖ )و < SynologyNASにWireGuardは乗せられる！

手順が多いように感じますが、実際にやってみると30分かからないくらいで設定できるので興味のある方はぜひやってみてください！

## 参考
https://www.youtube.com/watch?v=v0Z1m658Xe8

https://kb.synology.com/ja-jp/DSM/help/ContainerManager/docker_project?version=7