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

この２つがあれば問題なくつかえる。
またポートはdockerで走らせるときにマッピングしなおせるので、どちらも任意のポートを設定できるといえる。
今どき流行らないのは知っているが、自宅で立ち上がっているサーバなので、できれば一般的なポートは使いたくない。
そういった個人的な事情により、今回はどちらも変更した。

# dockerでpritunlのイメージを動かす
ポートはてきとう。
設定ファイルは永続的に残したいのでボリュームオプションで書き出すようにした。

~~privilegedオプションはなんとなく怖いので使いたくない気もするが、とりあえず今回はExampleに従った。~~
2018/07/05追記：privilegedオプションを使わなくてもNET_ADMINがあれば問題なかったのでExampleから変更した。ちょっぴり安心。
あとサーバの再起動時にも再度立ち上がるようrestartオプションはalwaysとした。
さらに永続化に使ったボリュームをデータ用コンテナに追い出した。

参考にしました -> [Docker privileged オプションについて - Qiita](https://qiita.com/muddydixon/items/d2982ab0846002bf3ea8)

```bash: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](https://qiita-image-store.s3.amazonaws.com/0/114013/aa6a8e10-a283-290f-e552-c1bb61d97436.png)

ログインするとユーザ設定ダイアログが出るのでAdminのユーザ名、パスワードの設定をする。
![スクリーンショット 2018-06-26 10.34.04.png](https://qiita-image-store.s3.amazonaws.com/0/114013/99ec2ec3-5ca6-d02f-6195-5fa686021337.png)

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


## Organizationの追加
適当につくる。
![スクリーンショット 2018-06-26 10.34.31.png](https://qiita-image-store.s3.amazonaws.com/0/114013/fb6a0a9f-5b13-d99a-659e-89b1ff7b3afc.png)

## Userの追加
適当に作る。
![スクリーンショット 2018-06-26 10.35.52.png](https://qiita-image-store.s3.amazonaws.com/0/114013/a86b851a-1523-e1d2-8075-9342128ee4a4.png)

## サーバの追加
適当につくる。
![スクリーンショット 2018-06-26 10.36.49.png](https://qiita-image-store.s3.amazonaws.com/0/114013/5c88b9a7-394a-b279-4b6a-4682abf68c44.png)

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

## サーバとOrganizationを関連付ける
![スクリーンショット 2018-06-26 10.38.35.png](https://qiita-image-store.s3.amazonaws.com/0/114013/7bb48e8d-8d03-65b7-d846-f5eb123050e0.png)

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

## User設定をダウンロードする
![スクリーンショット 2018-06-26 10.39.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114013/22aa1290-95a1-69ba-7f0c-efe3dc52f39d.png)

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

# クライアントサイドの設定をする
![スクリーンショット 2018-06-26 11.01.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114013/96f86ba4-5e5b-8ceb-2c48-92d4beb4cf70.png)

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

かんたん！

# そもそもDockerを使う理由
実はこのエントリでやろうとしていることは、すでに記事になっている。
[dockerでvpnサーバーをたてる - Qiita](https://qiita.com/to_obara/items/0622bdc5cacaa2758057)
そしてDockerを使う必要はないのでは、という話になっている。

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

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