公衆無線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

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

このとき、WEB UIのポートが443となっているのをDockerで指定したポートに変更するとWEB UIにアクセスできなくなってハマった。
pritunlのコンテナからするとWEB UIが立ち上がっているのは443であって、外部からみたポート番号ではない。

Organizationの追加

適当につくる。

Userの追加

適当に作る。

サーバの追加

適当につくる。

今回はレスポンスが悪くなったり帯域が細くなってもいいのでやたらめったらビット数の多い暗号化をかけた。
ただし、DH鍵のbit数は大きいと生成に時間がかかるので2048bitに落とした。(上げたほうが安全ではある)
また、1ユーザが複数のデバイスで接続することを許可した。(しないほうが安全かもしれない)
ポートはDockerで開けたポートに合わせておく。

サーバとOrganizationを関連付ける

これをしないとUserはサーバを使えない。
できたらstart serverを押して立ち上げ。

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

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

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

落とした設定ファイルはpritunlのクライアントアプリケーションで読み込めるようになっている。
またtarの中身は.ovpnファイルなのでOpenVPN互換のアプリケーションでも展開して読ませることができる。
後は接続すればユーザのPINを聞かれるので入力するとVPNが張れる。

かんたん!

そもそもDockerを使う理由

実はこのエントリでやろうとしていることは、すでに記事になっている。
dockerでvpnサーバーをたてる - Qiita
そしてDockerを使う必要はないのでは、という話になっている。

これについてはDocker信者というわけではないけれど、環境構築や設定がファイルとして残しておけるのは大きなメリットだと思っているので、自分はSambaやAFPなどもDockerを使っている。
コンテナで発生した設定ファイルなどもファイルが大きくない限りはすべてBitbucketに上げている。
いろいろいじって試して、一番良さそうな状態で運用する、という流れが好き。
実際1台で運用していたサーバを2台にする際に簡単に移行できた。
また、先人の環境・設定をそのままもらってこれる簡単さも良い。

ところで

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