ルーターを変更せずにVPNを構築する

# 概要

ルーターを変更せずにVPNを構築する。
対応していないなどルーターでポート解放などが出来ないネットワークにインターネットからアクセス出来るようにngrokを経由してネットワーク内のRaspberry PiのVPNに繋げ、ネットワーク内のPCなどに接続する環境を構築する。

# 環境

* Raspbian GNU/Linux 11 (bullseye) 2023-05-03
* ngrok version 3.2.2
* PiVPN 4.2.0 (Open VPN 2.4)

# 手順

## PiVPNをRaspberry Piにインストール

```
$ curl -L https://install.pivpn.io | bash
```

* インストーラの説明   
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101760/b52578b0-37b8-2904-0122-378f63d6f2f4.png)
* 固定IPアドレスが必要ですよと書いてますが、DHCPでも大丈夫です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101760/507b00d1-5c86-378f-d55d-6b93bc1246d3.png)
* DHCPを選択するために **\<YES>** 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101760/c3fedb76-f157-545c-335a-4e5d981b273c.png)
* ユーザーを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101760/62455bff-26e2-7dd3-4a6c-08150b7fa994.png)
* VPNを選択 **OpenVPN** に変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101760/e27e5749-78a3-4c68-8a0c-330987e7a2fa.png)
* **\<YES>** に変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101760/fde0f5cc-1193-9127-7fbf-b1632d98c23d.png)
* **TCP** に変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101760/1bb73c00-9fa9-bf26-d492-d4653b28033c.png)
* ポート設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101760/648ca756-2c32-fe00-8f95-4c4e9f791c52.png)
* ポートの確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101760/bdc0a636-7ad1-d215-db63-5b3808102935.png)
* DNSはGoogleを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101760/d81a0823-3056-f837-db8a-97dd0588a565.png)
* 追加のドメインは不要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101760/891f1800-e870-5e12-918c-556f106467aa.png)
* IPアドレスはngrokに変更するのでそのままで良い
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101760/e3131341-5785-6715-649e-427abda5494b.png)
* クライアントが古い場合にはNoに変えたほうが良い
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101760/349a295e-bf52-8740-002c-fc45542bbd31.png)
* デフォルトのままで十分
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101760/bef69d52-26d8-f7aa-0c0a-e1cd6d218549.png)
* 鍵を生成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101760/1af106c0-28a0-f266-be30-c455387f46e9.png)
* 自動更新の勧め
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101760/91a4229d-44a2-bd01-7661-4d64d88494a2.png)
* 自分で何とか出来ない場合は自動更新しないうように **No**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101760/e57ed0ce-a626-ef35-b5fa-765a54b53834.png)
* 感謝
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101760/7bc551c8-b15c-9e67-6943-32babd6449a3.png)
* 再起動を勧められますが、アカウントを追加してから
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101760/b2b79ce9-5971-d938-e227-69d07ad5e67d.png)
* 10年間有効なアカウントを追加
```
pivpn add --name *ユーザー名* --password *パスワード* --days 3650
```
* ~/ovpns/*ユーザー名*.ovpnを接続するPCにコピーしておく
* 再起動
```
$ sudo reboot
```

## ngrok

   * [https://ngrok.com](https://ngrok.com)でアカウントを作成
   * [ここ](https://dashboard.ngrok.com/get-started/setup)からダウンロード
   * 解凍
```
unzip /path/to/ngrok.zip
```
* [Your Authtoken](https://dashboard.ngrok.com/get-started/your-authtoken)で自分のトークンをコピーしておく
* サービスを設定　${Your_Authtoken}には上記でコピーした文字列と入れ替え

```/etc/systemd/system/ngrok-ssh.service
    [Unit]
    Description = ngrok SSH tunnel
    After=network.target

    [Service]
    ExecStart=/usr/local/bin/ngrok --log stdout tcp 443 --authtoken ${Your_Authtoken}

    User=pi
    Group=pi
    Restart=always
    RestartSec=60

    [Install]
    WantedBy=multi-user.target
```
* サービスの更新、有効化、再起動
```
$ sudo systemctl daemon-reload
$ sudo systemctl enable ngrok-ssh.service
$ sudo systemctl restart ngrok-ssh.service
```

## OpenVPN

* [OpenVPN Client](https://openvpn.net/client/)をダウンロード、インストール
* [Endpoints](https://dashboard.ngrok.com/cloud-edge/endpoints)のポート番号をコピー
:::note warn
ngrok-ssh.serviceを再起動するたびに変わります
:::

* *ユーザー名*.ovpnを修正  
${Endpoints}には上記ポート番号を入れる
```diff
- remote xxx.xxx.xxx.xxx 443
+ remote 0.tcp.jp.ngrok.io ${Endpoints}
```
* 修正した.ovpnファイルをOpenVPN Connectにドラッグ

# 参考

* [PiVPN](https://www.pivpn.io)
* [ngrok](https://ngrok.com)
* [OpenVPN](https://openvpn.net)