はじめに
タダと言われるとワクワクが止まらずにとってしまった
Oracle Cloud の Always Freeインスタンス。
ただ、確保はしたものの使い道はない。
…出先の喫茶店やホテルの怪しげな公衆WifiのためにVPNでも…
⇒結構VPN構築って面倒なんだよな…コンテナでサクッと建ったりしないかしら?
⇒dockerでvpnサーバーをたてる
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
公式インストールガイドが丁寧に作ってある。
正直、これだけで足りる。
下準備
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サーバーを立てたメモ
なお、pritunl-webプロセスは賢い子で、
適切に準備しておけば、セットアップ処理の途中から
自動的に証明書を取得しTLS対応してくれる。
なお、疎通確認にわざわざnginx等Webサーバを入れるのは面倒な場合、
python3のhttp.serverを使うと楽。
python3 -m http.server 80
インストール
レポジトリ追加 , apt install
公式ガイドの対応するOS枠に記載されたコマンド群を実行。
今回はUbuntu Bionic。
実は、Debian Stretchで作業していると思い込んでいてここで時間をロスした。
cat /etc/*release*
あたりで作業OSの確認しておくとミスしない。
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を明け渡すことに。
オープン可能なファイル数制限の変更
高負荷時、接続問題を起こす原因になるとのことで、
オープン可能なファイル数制限を増やす。
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上で組織・サーバー・ユーザーの追加が必要。
と言っても、公式ガイドに沿ってWebUIをぽちぽちするだけ。
組織の作成
WebUI画面上部のUsers > Add Organizationから組織を追加。
適当な組織名を付けておく。
ユーザーの追加
同様にWebUI画面上部のUsers > Add Userからユーザーを追加。
PINは空白で良い。(2FA等で使える?)
サーバーの追加
試していないので不明だが、単一マシン上で複数のVPNサーバーを構成出来る模様。
そのため、pritunl内部での単位となる「サーバー」を一つ作成する。
WebUI画面上部のServers > Add Serverからサーバーを追加。
名前は任意、ポートはランダムに選択される。お好みがあれば記入する。
実際の接続時には、ここで選択したポートの解放が必要となる。
Oracle Cloud側、OS側でポートを解放しておこう。
(再掲)Oracle Cloud で Compute にWebサーバーを立てたメモ
ちなみに、UDPポートの疎通確認はncがオススメ。
一旦pritunlサービスを止め、サーバ側でncを使い目的のポートでLISTENしておき、
手元の端末からncでUDPを投げ、メッセージが到達するか確認する。
⇒UDPの疎通確認はtracerouteよりncが便利
Addを選択してサーバーを追加すると、自動的に暗号化に必要な
証明書等のファイルがバックグラウンドで生成される。
マシンパワーが貧弱なのか、CPU使用率が99%まで跳ね、完了まで数分掛かった。
組織へのアタッチ
作成したサーバーを組織に紐づけることで、ようやくVPN接続が可能となる。
WebUI画面上部のServers > Attach Organizationからサーバーを組織に紐づけ。
その後、Start Serverをクリックすれば準備完了だ。
接続!
実際のVPN接続にはOpenVPNのプロファイル(.opvn)を利用できる。
当然のように、ユーザー毎に適切なOpenVPNプロファイルが自動生成される。
また、そのダウンロード用一次リンクも自動的に生成される。
至れり尽くせりである。
公式ガイドのDownloading User Profileに記載されているように、
WebUI画面上部のUsers > Get Temporary Profile Link(鎖マーク)からリンクを取得できる。
ZipかTar形式でプロファイルをダウンロードし、Androidに配置してもよいし、
view profile linkにアクセスし、ovpnファイルを直接ダウンロードすることも可能だ。
あとは、ovpnファイルをAndroid側のOpenVPNアプリに食わせてやれば接続完了だ。
Android端末にOpenVPNクライアントの設定をする
さいごに
VPNといえば何かと面倒なイメージがありますが、強力な管理WebUIを備えているのはpritunlの強みの一つでしょう。
大規模なVPNであったり、マルチクラウドの環境間を繋ぐ用途も意識しているらしく、
幅広いニーズに応えられそうです。
利用者が私一人なので完全にオーバースペックな感じもしますが、
負荷状況など気になることがあったら追記しておきます。