Docker + CentOS7 SoftEther VPN構築メモ

# 概要
自分用にSoftEther VPNをDocker環境で立てたメモ
モバイルエンジニアなのでインフラ周りの知識はあまりないです

## 立てた目的
- VPNの勉強の為 + 公共Wifiから安心して繋げられるようなVPN環境が欲しかった
- 普段カフェで勉強していてwifiのセキュリティが前から不安だった(Wifiって誰でもキャプチャしてhttp通信とか覗けそうだよね、とか)

## VPNサーバーを立てると安全？
- VPNサーバーを立てて、全ての通信をそこを通して暗号化しつつ外部と通信するので、仮にwifiアクセスポイントでパケットをモニタリングしている第三者がいてhttp通信を見ようとしても暗号化がかかる
- そもそもVPNサーバーにもVPNプロトコルにも脆弱性は起こり得るけど、よりセキュアにはなる

## 試した環境
- 自身のPC環境
    - Mac OS Mojave 10.14
    - Docker for Mac 18.0.1-ce
    - docker-compose version 1.22.0, build f46880f
- VPNサーバー
    - SoftEther VPN v4.28-9669 linux-x64-64bit.tar.gz(2018.09.11)
    - Dockerイメージの `centos:7.5.1804` の上に構築
- 使用したVPNプロトコル
    - L2TP/IPSec
- 実際にVPN立てたのは某VPSサーバー


## 動かす手順

Docker for MacとDocker Composeがインストールされていれば、docker-composeするだけでとりあえずVPNサーバーの起動はできる。
適当なディレクトリに

```docker-compose.yml
version: '2'
services:
  vpn-test:
    build: .
    ports:
      - '5555:5555'
      - '500:500/udp'
      - '4500:4500/udp'
```

```Dockerfile
FROM centos:7.5.1804
ENV APP_ROOT=${APP_ROOT:-/usr/local}
WORKDIR $APP_ROOT
RUN yum -y install gcc make which net-tools
RUN curl -L https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/releases/download/v4.28-9669-beta/softether-vpnserver-v4.28-9669-beta-2018.09.11-linux-x64-64bit.tar.gz > softether-vpnserver-v4.28-9669-beta-2018.09.11-linux-x64-64bit.tar.gz
RUN tar -xvf softether-vpnserver-v4.28-9669-beta-2018.09.11-linux-x64-64bit.tar.gz
RUN cd vpnserver && make i_read_and_agree_the_license_agreement
RUN cd vpnserver && chmod 600 * && chmod 700 vpncmd && chmod 700 vpnserver
CMD ["/usr/local/vpnserver/vpnserver", "execsvc"]
```

を用意して `docker-compose up` 叩く

今回はlinuxを選択したけど、SoftEther自体は Windows / Mac / Linuxそれぞれに対応していて、Windowsがもっとも安定して稼働するらしい
ここら辺を参照 https://ja.softether.org/4-docs/1-manual/7/7.3

## 起動したVPNサーバーに接続
docker-compose upしたあと、
Dockerコンテナーに接続 

```
$ docker-compose exec vpn-test bash
```

Dockerコンテナー内からVPNサーバーに接続

```
$ docker-compose exec vpn-test bash

[root@24ca9b305597 vpnserver]# cd vpnserver
[root@24ca9b305597 vpnserver]# ./vpncmd /SERVER localhost:443
vpncmd command - SoftEther VPN Command Line Management Utility
SoftEther VPN Command Line Management Utility (vpncmd command)
Version 4.28 Build 9669   (English)
Compiled 2018/09/11 12:23:27 by yagi at pc33
Copyright (c) SoftEther VPN Project. All Rights Reserved.

Connection has been established with VPN Server "localhost" (port 443).

You have administrator privileges for the entire VPN Server.

VPN Server>HELP
```

VPNサーバーに接続後は `HELP` `?` でコマンド一覧がでる

## 初期設定

今回はただのメモなので省略
VPNサーバー管理パスワード設定、VPNで接続する側のアカウントの設定、仮想HUBの作成などが必要なのでここら辺を参考に
https://qiita.com/showwin/items/92861057a8b62611444d#3%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%81%AE%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E4%BD%9C%E6%88%90

一度作るとvpn_server.configというファイルに全て情報が書き出されて、次回のVPNサーバー起動時にこれを食わせれば設定は不要でした

#### クライアント側の接続設定
クライアントからVPNに接続するにはここら辺を参考に(Macの場合。他のデバイスは `L2TP 設定 windows` とかでググれば出てきます)
https://ja.softether.org/4-docs/2-howto/L2TP%2F%2FIPsec_Setup_Guide_for_SoftEther_VPN_Server/5.Mac_OS_X_L2TP_Client_Setup

### ハマったとこメモ
#### ローカルで構築したVPNサーバーに繋がらない

>11.1.2 ローカルブリッジを使用する際に VPN 内部からローカルブリッジに使用している仮想 LAN カードの IP アドレスと通信できない場合

- https://ja.softether.org/4-docs/1-manual/B/11.1
- ここら辺によるとLinuxサーバーはローカルマシンに構築したVPNサーバーには通信できない？あまりよくわかってないけど外部に立てたら通信はできた

#### クライアント側のログ
繋がらない時は「認証できませんでした」とか「L2TP/IPSecサーバーに接続できませんでした」くらいしか言われない。
VPNの詳細オプションから詳細ログを作成すると `/var/log/ppp.log` にログが出るようになる。
うまくサーバーからレスポンスが来てれば

```
Sun Oct 28 19:45:17 2018 : IPSec connection started
Sun Oct 28 19:45:17 2018 : IPSec phase 1 client started
Sun Oct 28 19:45:17 2018 : IPSec phase 1 server replied
```

のような感じでrepliedが返ってくる

#### ログがでない
- security_log、server_log、packet_logなどみても特に何も出力されない。SoftEtherはパケットロギングはもともと無効だったりするのでサーバー側のログで接続確認しようとしてもできなかった。
- Dockerじゃなければ/var/log/messageとかにはなにか出るのかも？systemctlのサービス何も動いてないのでそんなファイル自体なかった