Oracle Always Free枠でVPNサーバー(pritunl)

# はじめに
タダと言われるとワクワクが止まらずにとってしまった
Oracle Cloud の Always Freeインスタンス。
ただ、確保はしたものの使い道はない。
…出先の喫茶店やホテルの怪しげな公衆WifiのためにVPNでも…
　⇒結構VPN構築って面倒なんだよな…コンテナでサクッと建ったりしないかしら？
　　⇒[dockerでvpnサーバーをたてる](https://qiita.com/to_obara/items/0622bdc5cacaa2758057)

pritunlは見たことがないが、WebUIが結構リッチっぽい。
SSH抜きで管理しやすいのはいいことだ。

相分かった、それなら私はコンテナ無しで、泥臭く立ててみよう。
という作業ログです。

# 環境
- Oracle Cloud Always Free(VM.Standard.E2.1.Micro)
- 18.04.3 LTS (Bionic Beaver)
- インスタンスに到達可能なグローバルIP割り当て済み
- ↑に紐づいたAレコードが存在(example.com)
- pritunl v1.29.2232.32
- MongoDB 1:3.6.3-0ubuntu1.1

[公式インストールガイド](https://docs.pritunl.com/docs/installation)が丁寧に作ってある。
正直、これだけで足りる。

# 下準備
## SELinuxの確認
pritunlはメインプロセスとWeb管理インターフェース用の2つのプロセスが走る。
どちらもSELinuxに対応しているらしい。
が、なにかと引っ掛かりがちなので状態くらいは確認しておく。
Oracle Cloudが用意しているUbuntu18.04にはgetenforceコマンドが入ってないので追加。

```
$ sudo apt install policycoreutils
$ getenforce
```

出力はDisabled。ひとまず問題にはならなさそう。そのまま進める。

## ポート開放

- Oracle Cloud側のFW（セキュリティリスト）
- OS側のFW(iptables)

と、2つのFWが存在する。

pritunlは初期セットアップにいきなりWeb UIを利用するため、
以下の記事に沿って両方のFWで80,443を開けておく。
[Oracle Cloud で Compute にWebサーバーを立てたメモ](https://qiita.com/yakumo/items/8ac195337414aabd39c0)

なお、pritunl-webプロセスは賢い子で、
適切に準備しておけば、セットアップ処理の途中から
自動的に証明書を取得しTLS対応してくれる。

なお、疎通確認にわざわざnginx等Webサーバを入れるのは面倒な場合、
python3のhttp.serverを使うと楽。
```python3 -m http.server 80```

# インストール
## レポジトリ追加 , apt install
[公式ガイド](https://docs.pritunl.com/docs/installation)の対応するOS枠に記載されたコマンド群を実行。
今回は**Ubuntu Bionic**。
実は、Debian Stretchで作業していると思い込んでいてここで時間をロスした。
```cat /etc/*release*```あたりで作業OSの確認しておくとミスしない。

```bash:Bionic
sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list << EOF
deb https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.0 multiverse
EOF

sudo tee /etc/apt/sources.list.d/pritunl.list << EOF
deb http://repo.pritunl.com/stable/apt bionic main
EOF

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com --recv 9DA31620334BD75D9DCB49F368818C72E52529D4
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com --recv 7568D9BB55FF9E5287D586017AE645C0CF8E292A
sudo apt-get update
sudo apt-get --assume-yes install pritunl mongodb-server
sudo systemctl start pritunl mongodb
sudo systemctl enable pritunl mongodb
```

最終的に、pritunlとmongodbサービスが動いている(active)か確認しておく。

```
sudo systemctl status pritunl
sudo systemctl status mongodb
```

また、pritunl-webがTCP80番、mongodbがTCP27017番でLISTENしているか
```sudo ss -tanp```でチェックしておく。
…つまり、逆に言うとデフォルトでは80,443はpritunl-webがLISTENする。
そのため、nginxやapacheと共存するにはポート変更が必要。
私の環境では面倒だったので、nginxを停止し、80,443を明け渡すことに。

## オープン可能なファイル数制限の変更
高負荷時、接続問題を起こす原因になるとのことで、
オープン可能なファイル数制限を増やす。

```bash:shell
sudo sh -c 'echo "* hard nofile 64000" >> /etc/security/limits.conf'
sudo sh -c 'echo "* soft nofile 64000" >> /etc/security/limits.conf'
sudo sh -c 'echo "root hard nofile 64000" >> /etc/security/limits.conf'
sudo sh -c 'echo "root soft nofile 64000" >> /etc/security/limits.conf'
```

変更結果が反映されたか、```less /etc/security/limits.conf```で軽く見ておくと望ましい。

## データベース初期設定
ここからはブラウザ上での作業とコンソール作業が並行する。
http://example.com （自分のサーバに到達できるAレコード）にアクセスすると、
Database setup画面が表示される。

サーバ側で```pritunl setup-key```を実行し、結果を"Enter Setup Key"枠に入力する。
MongoDBへのアクセスURIはデフォルトから変更していない場合、そのままでよい。

## 初期設定
データベース初期設定が完了すると、ユーザーログイン画面へ遷移する。
初期ユーザ名＝初期PW＝pritunl　となっている。

ログイン後、Initial Setup画面で十分な強度を持つPWへ変更しておく。
この際、LetsEncryptDomainにexample.comを入力しておくと、設定保存後から
自動的にTLS通信が可能となる。いい世の中になったものだ。


# pritunl上での接続準備
これで準備は完了…と言いたいところだが、WebUI上で組織・サーバー・ユーザーの追加が必要。
と言っても、[公式ガイド](https://docs.pritunl.com/docs/connecting)に沿ってWebUIをぽちぽちするだけ。
##  組織の作成
WebUI画面上部のUsers > Add Organizationから組織を追加。
適当な組織名を付けておく。

##  ユーザーの追加
同様にWebUI画面上部のUsers > Add Userからユーザーを追加。
PINは空白で良い。（2FA等で使える？）

## サーバーの追加
試していないので不明だが、単一マシン上で複数のVPNサーバーを構成出来る模様。
そのため、pritunl内部での単位となる「サーバー」を一つ作成する。
WebUI画面上部のServers > Add Serverからサーバーを追加。

名前は任意、ポートはランダムに選択される。お好みがあれば記入する。
実際の接続時には、ここで**選択したポートの解放**が必要となる。
Oracle Cloud側、OS側でポートを解放しておこう。
(再掲)[Oracle Cloud で Compute にWebサーバーを立てたメモ](https://qiita.com/yakumo/items/8ac195337414aabd39c0)

ちなみに、UDPポートの疎通確認はncがオススメ。
一旦pritunlサービスを止め、サーバ側でncを使い目的のポートでLISTENしておき、
手元の端末からncでUDPを投げ、メッセージが到達するか確認する。
⇒[UDPの疎通確認はtracerouteよりncが便利](https://qiita.com/aki-takano/items/f6e4c0ff626103ebf324)

Addを選択してサーバーを追加すると、自動的に暗号化に必要な
証明書等のファイルがバックグラウンドで生成される。
マシンパワーが貧弱なのか、CPU使用率が99%まで跳ね、完了まで数分掛かった。

## 組織へのアタッチ
作成したサーバーを組織に紐づけることで、ようやくVPN接続が可能となる。
WebUI画面上部のServers > Attach Organizationからサーバーを組織に紐づけ。
その後、Start Serverをクリックすれば準備完了だ。

# 接続！
実際のVPN接続にはOpenVPNのプロファイル(.opvn)を利用できる。
当然のように、ユーザー毎に適切なOpenVPNプロファイルが自動生成される。
また、そのダウンロード用一次リンクも自動的に生成される。
至れり尽くせりである。

[公式ガイド](https://docs.pritunl.com/docs/connecting)のDownloading User Profileに記載されているように、
WebUI画面上部のUsers > Get Temporary Profile Link(鎖マーク）からリンクを取得できる。

ZipかTar形式でプロファイルをダウンロードし、Androidに配置してもよいし、
view profile linkにアクセスし、ovpnファイルを直接ダウンロードすることも可能だ。
あとは、ovpnファイルをAndroid側のOpenVPNアプリに食わせてやれば接続完了だ。
[Android端末にOpenVPNクライアントの設定をする](https://www7390uo.sakura.ne.jp/wordpress/archives/318)

# さいごに
VPNといえば何かと面倒なイメージがありますが、強力な管理WebUIを備えているのはpritunlの強みの一つでしょう。
大規模なVPNであったり、マルチクラウドの環境間を繋ぐ用途も意識しているらしく、
幅広いニーズに応えられそうです。

利用者が私一人なので完全にオーバースペックな感じもしますが、
負荷状況など気になることがあったら追記しておきます。