VPN
docker
OpenVPN
pritunl

公衆無線LANを安全に使いたくて自宅にVPNを張った話

最近ノマドっぽいことをしていて、公衆無線LANを使いたくなってきたが、セキュリティは皆無なのでそのままは使いたくない。

そこで、pritunlをdockerで動かし、OpenVPNで自宅のネットワークに接続するようにした。


使えるようになるまでの流れ


  1. dockerでpritunlのイメージを動かす

  2. WEB UIでpritunlの設定をする

  3. クライアントサイドの設定をする

たったこれだけ。らくちん。


必要なポートについて

今回お世話になったイメージはjippi/pritunl

このイメージで使われているポートはExampleによれば

用途
ポート番号
TCP/UDP

WEB UI (HTTP)
80
TCP

WEB UI (HTTPS)
443
TCP

OpenVPN
1194
TCP&UDP

となっているのだけれども、実際必要なのは

用途
ポート番号
TCP/UDP

WEB UI (HTTPS)
443
TCP

OpenVPN
任意
UDP

この2つがあれば問題なくつかえる。

またポートはdockerで走らせるときにマッピングしなおせるので、どちらも任意のポートを設定できるといえる。

今どき流行らないのは知っているが、自宅で立ち上がっているサーバなので、できれば一般的なポートは使いたくない。

そういった個人的な事情により、今回はどちらも変更した。


dockerでpritunlのイメージを動かす

ポートはてきとう。

設定ファイルは永続的に残したいのでボリュームオプションで書き出すようにした。

privilegedオプションはなんとなく怖いので使いたくない気もするが、とりあえず今回はExampleに従った。

2018/07/05追記:privilegedオプションを使わなくてもNET_ADMINがあれば問題なかったのでExampleから変更した。ちょっぴり安心。

あとサーバの再起動時にも再度立ち上がるようrestartオプションはalwaysとした。

さらに永続化に使ったボリュームをデータ用コンテナに追い出した。

参考にしました -> Docker privileged オプションについて - Qiita


pritunl-up.sh

docker create --name pritunl-data \

-it \
-v /var/docker/pritunl_data:/var/lib/pritunl -v /var/docker/pritunl_mongodb:/var/lib/mongodb \
busybox:latest
docker run --name pritunl \
-d --cap-add NET_ADMIN --restart=always \
--volumes-from pritunl-data \
-p 15568:15568/udp -p 12321:443/tcp \
jippi/pritunl

WEB UIはhttps://サーバIP:12321でアクセスできる。


WEB UIでpritunlの設定をする

ほとんど見たままだが流れをざっくりと説明する


初期設定

初期ユーザとパスワードはどちらもpritunl

スクリーンショット 2018-06-26 10.33.27.png

ログインするとユーザ設定ダイアログが出るのでAdminのユーザ名、パスワードの設定をする。

スクリーンショット 2018-06-26 10.34.04.png

このとき、WEB UIのポートが443となっているのをDockerで指定したポートに変更するとWEB UIにアクセスできなくなってハマった。

pritunlのコンテナからするとWEB UIが立ち上がっているのは443であって、外部からみたポート番号ではない。


Organizationの追加

適当につくる。

スクリーンショット 2018-06-26 10.34.31.png


Userの追加

適当に作る。

スクリーンショット 2018-06-26 10.35.52.png


サーバの追加

適当につくる。

スクリーンショット 2018-06-26 10.36.49.png

今回はレスポンスが悪くなったり帯域が細くなってもいいのでやたらめったらビット数の多い暗号化をかけた。

ただし、DH鍵のbit数は大きいと生成に時間がかかるので2048bitに落とした。(上げたほうが安全ではある)

また、1ユーザが複数のデバイスで接続することを許可した。(しないほうが安全かもしれない)

ポートはDockerで開けたポートに合わせておく。


サーバとOrganizationを関連付ける

スクリーンショット 2018-06-26 10.38.35.png

これをしないとUserはサーバを使えない。

できたらstart serverを押して立ち上げ。


User設定をダウンロードする

スクリーンショット 2018-06-26 10.39.41.png

ここまで設定するとUserのリストのところで設定ファイルのダウンロードができるようになっているので保存しておく。


クライアントサイドの設定をする

スクリーンショット 2018-06-26 11.01.01.png

落とした設定ファイルはpritunlのクライアントアプリケーションで読み込めるようになっている。

またtarの中身は.ovpnファイルなのでOpenVPN互換のアプリケーションでも展開して読ませることができる。

後は接続すればユーザのPINを聞かれるので入力するとVPNが張れる。

かんたん!


そもそもDockerを使う理由

実はこのエントリでやろうとしていることは、すでに記事になっている。

dockerでvpnサーバーをたてる - Qiita

そしてDockerを使う必要はないのでは、という話になっている。

これについてはDocker信者というわけではないけれど、環境構築や設定がファイルとして残しておけるのは大きなメリットだと思っているので、自分はSambaやAFPなどもDockerを使っている。

コンテナで発生した設定ファイルなどもファイルが大きくない限りはすべてBitbucketに上げている。

いろいろいじって試して、一番良さそうな状態で運用する、という流れが好き。

実際1台で運用していたサーバを2台にする際に簡単に移行できた。

また、先人の環境・設定をそのままもらってこれる簡単さも良い。


ところで

pritunlってなんて読むんですかね。僕は「ぷりっとゆーえぬえる」って読んでる。