Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
2
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

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

はじめに

タダと言われるとワクワクが止まらずにとってしまった
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の確認しておくとミスしない。

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を明け渡すことに。

オープン可能なファイル数制限の変更

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

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上で組織・サーバー・ユーザーの追加が必要。
と言っても、公式ガイドに沿って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であったり、マルチクラウドの環境間を繋ぐ用途も意識しているらしく、
幅広いニーズに応えられそうです。

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
2
Help us understand the problem. What are the problem?