PritunlでVPNサーバを構築する方法

IT

海外に来まして、公衆無線LANを使うこともあり、盗聴されたりすることを考えるとあったほうが良いかなと思い、VPNサーバを自分で立てることにしました。

VPNとは

VPNとはVirtual Private Networkの略で、暗号化の技術を用いてセキュアなプライベートネットワークを構築する技術のことです。

VPNの種類

VPNの種類にもいろいろあるので備忘も兼ね、調べたことを以下にまとめておきます。

IPsec-VPN

その名の通り、IPsecを用いたVPN。IPsecとはIP Security Architecture、もしくはSecurity Architecture for IPの略で、OSIのネットワーク層で動作するプロトコル。

SSL-VPN

SSLを用いたVPN。SSLとはSecure Socket Layerの略でこちらはOSIのセッション層で動作するプロトコル。

L2TP/IPsec

L2TPとIPsecを併用したVPN。L2TPとはLayer 2 Tunneling Protocolの略で、OSIの第2層のデータリンク層で動く、トンネリングのためのプロトコル。暗号化自体は行わないのでそこをIPsecが補う形でVPNを実現する。

PPTP

Point to Point Tunneling Protocolの略でMicrosoftで開発された、第2層のデータリンク層で動くプロトコル。現在はセキュリティ上は安全でないとされており、使用は推奨されていない。

IKEv2

Internet Key Exchange version 2の略で、IPsecを基にCiscoとMicrosoftが開発したプロトコルで、こちらはネットワーク層で動作するプロトコル。Mobility and Multihoming Protocolという、通信を追従(ネットワークの切り替わりに対応)してくれるプロトコルでモバイル機器での利用に適しているという特徴がある。

OpenVPN

Openソースで開発されているVPNプロトコル。OpenSSLやSSLv3/TSLv1をベースにしたプロトコルで、最近では安全で速度もそこそこ速いということでよく使われている。

今回はセキュアなものにしたいというのと、OpenVPNを使用しているVPNでPritunl(http://pritunl.com/)というOSSがあり、Dockerのイメージも公開されているという情報を見つけたので、Docker環境でPritunlを立ち上げてVPNを実現しようと思います。

Pritunlのインストール

前提条件

自分はVPSでDocker環境を持っているのでそこで立ち上げることにします。Docker環境等については立ち上がっている前提とします。また、リバースプロキシ経由で各サーバをコントロールしているのでリバースプロキシ経由でアクセスする設定にします。

docker-compose.ymlの作成

docker-compose.ymlを作成します。PritunlはMongoDBを使うようなのでMongoDBのイメージは公式イメージを、Pritunlのイメージはgoofball222/pritunlを使用しました。

dockerコンテナの立ち上げ

上記のdocker-compose.ymlを格納したディレクトリで以下を実行します。

 $ docker-compose up -d 

Pritunlサーバの設定

上記のコンテナ立ち上げが問題なく終わった後、ブラウザで以下にアクセスします。

https://インストールしたサーバのIPアドレス:WEB_PORT

#ここのWEB_PORTは前述のdocker_compose.ymlのWEB_PORTのこと。

ブラウザで以下の画面が表示されるので、順番に登録していきます。


ユーザネームとパスワードを聞かれますので、コンテナ内に入って画面に記載のコマンドを打つと出てくるデフォルトのユーザ、パスワードを入力します。

コンテナ内に入る。
$ docker exec -it pritunl /bin/bash

コンテナ内で以下を実行し、デフォルトユーザとパスワードを得る。
# pritunl default-password

次に基本情報セットアプします。ユーザ名は最初はおそらくpritunlとなっていると思いますので変更しましょう。Public Addressは環境に合わせて入れてください。


初期設定が終わったら、上部のUsersをクリックしてこの画面にきます。そしてAdd Organizationボタンをクリックして好きな名前でOrganizationを登録します。

Organization作成後はAdd User ボタンがアクティブになると思うのでAdd Userボタンを押下してユーザを登録します。PINは最低6桁です。

次は上部のServersをクリックしてServersの画面に移動します。この画面の上のAdd Serverボタンをクリックして、サーバを追加します。

任意のサーバ名を入力します。ポートは、ここでは19826となっていますが、任意のポートに変更してください。後ほどここで決めたポート番号をdocker-compose.ymlのYOUR_PORTの部分に反映して再度立ち上げし直します。

サーバが作成されると上記の画面になるので右上のAttach OrganizationボタンをクリックしてOrganizationとサーバの紐づけをします。

この画面でAttachボタンを押下します。
ここまで来たら、一旦Pritunlからログアウトし、先ほど決めたポートを開けるために、docker-compose.ymlを変更して再度コンテナを立ち上げます。

#コンテナを立ち下げ
$ docker-compose down

#docker-compose.yml のYOUR_PORT部分を自分の決めたポートに変更
$ vi docker-compose.yml

#コンテナの再立ち上げ
$ docker-compose up -d

次はクライアント側の設定です。

クライアントの設定

今回はiOSデバイスで接続することします。
App StoreでOpenVPNのアプリをダウンロードします(無料)。

pritnulのwebコンソールから再度ログインし、OpenVPNの設定ファイルをダウンロードします。

該当ユーザの右の丸の中にした矢印のマーク、ちょうどClick to download profileの吹き出しが出ているマークをクリックしてファイルをダウンロードします。ダウンロードファイルは.tar形式なので解凍して.ovpn形式のファイルを取り出します。このファイルをiOSデバイスに送ります。

iOSデバイスで.ovpn形式のファイルを先ほどインストールしたOpenVPNアプリで開きます。すると上記のインポートされたファイルの一覧が表示されますのでADDをタップします。

インポートが完了すると上記の画面に遷移しますので、ここでUsernameにVPNサーバに登録したユーザ、パスワードにPINを入力します。

上記の画面に遷移しますのでプロファイルのスイッチをタップするとVPN接続します。DISCONNECTEDのところがオレンジ色のCONNECTEDになったら完了です。

最後に。。。

Webコンソールのデフォルトポートは443なのですが、いろいろ調べていた時に9700という情報が結構あったので勝手にデフォルト9700と思い込んで設定してしまい、少しハマってしまいました。ここにちゃんと書いてありました。。。

これで外出時の公衆無線LANを使う場合でもセキュアな通信ができます。速度もYoutubeも問題なく見れるくらいはあるので、大丈夫そうです。
海外に来て出張も多く、公衆無線LANを使う機会も増えたので大活躍しています。

コメント