月額$3.5で運用できるVPNサーバを1時間もかからず作れるはずの作業記録

<!--
\#！注意！
　この記事を書いて24時間ほど運用したところ、何かしらのリソースが足りず全てのプロセス(SSHも)が正常に稼働しない状況になっています。
　Serverman@VPSは下記で選定したSoftEtherを運用するには何らかの要因で難しいことが判りましたので、この記事も書き直しを行います。Serverman@VPSのPetitプランをSoftEtherを用いたVPNサーバを運用する目的で導入することは推奨しません。
-->


#背景
　家（集合住宅）で契約しているインターネット回線が、夜(19:00-24:00ぐらい)の間、Googleサービス(gmail,youtube,maps)だけが遅くなる現象に悩まされている。
　たまたまVPNを張れるところがあったため、VPN接続してサービスを使用したところ問題無く使用できたことから、上流のプロバイダの問題である可能性が高く、管理組合などを通じて申し入れても時間がかかる上に改善の見通しも薄そうなので、自己解決のために掲題のトライを行う。

#必要なサービスの選定
## VPNソフトウェアの選定
[SoftEther VPN](https://ja.softether.org/)一択
## VPSの選定
- [さくらのVPS](https://vps.sakura.ad.jp/)
- [Web ARENA VPS Cloud](https://web.arena.ne.jp/vps-cloud/)：在庫なし
- [Amazon Lightsail](https://aws.amazon.com/jp/lightsail/)
- [Serverman @ VPS](https://dream.jp/vps/)

~~などから、サービス内容・制約事項と費用を考慮し[Serverman @ VPS](https://dream.jp/vps/)のPetitプラン（月額350円（税抜き））を選定。
2019/7/1 時点では2か月300円。ただし先払い。~~

当初選定したServerman @ VPSにSoftetherをインストールし稼働したところ発生した以下の事象により、解明の時間がもったいないので最終的にAmazon Lightsail(3.5USD/月)を選定。

- Softether VPN Serverを動かしたところ、ものの数分であらゆるコマンドを実行しようとしたら`-bash: fork: Cannot allocate memory`と表示され、何もできなくなる。
- SSHログインもできなくなる。（認証のセッションは確立するがその後音沙汰なくなる。）
- Serverman @ VPSはWebコンソールを提供していないため、再起動をかけてもサービスとして立ち上がってくるとすぐSSHログインできなくなるので、完全初期化しか方法が無い。
- 仕方なく完全初期化してサービスとして立ち上がらないようにしてcgroupで使用リソースを制限しようとしたが、libcgroup libcgroup-toolsが素直にインストールされない。
- `yum.conf`から`exclude=initscripts*`をコメントアウトしてインストールまでできる。なお、以前のinitscriptsをインストールすると再起動できなくなる不具合は現在のinitscriptsのバージョンでは解消されている。
- インストールはできたが`cgred`がサービスとして立ち上がってこない。
と、ここまでやってこれ以上このVPSを使うのは時間の無駄と判断し、次点だったAmazon Lightsailを選定する。

# VPSサービスの申し込みと基本設定
省略。以下の説明はCentOS上の手順を書いているのでインストールコマンドはyumになっているが、LightsailはOSを選択できるので自分の好みでDebianを選択したため、実際はaptを使った。まぁ適当に読み替えてください。
あと、Webの管理画面「ネットワーキング」からファイアウォールの設定はしないといけないんだけど、気が向いたら追記します。

# VPNソフトウェアの導入
## 準備
何は無くともまずは`yum update`

<!--
- 参考
 - Serverman @ VPSは管理上`yum.conf`に`exclude=initscripts*`が記述されている。
-->

## 必要なソフトウェアの導入
1. 初期状態はVPSにほとんど何も入っていないので、Softether VPN マニュアル [7.3 Linux へのインストールと初期設定](https://ja.softether.org/4-docs/1-manual/7/7.3) ＞ 7.3.3 必要なソフトウェアおよびライブラリの確認
に記載されたソフトウェアを導入。
`yum -y install gcc binutil glibc zlib openssl readline ncurses pthread`

2. [Softether ダウンロードセンター](https://www.softether-download.com/ja.aspx?product=softether)から、SoftEther VPN Serverをダウンロードする。
選択肢を選んでいくとリンクが表示されるので、そのリンクから`wget`でVPS側にダウンロード
する。
　コンポーネントを選択 ＞SoftEther VPN Server
  プラットフォームを選択 ＞ Linux
　CPUを選択 ＞ Intel x64 / AMD64(64bit)
`wget https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/releases/download/v4.29-9680-rtm/softether-vpnserver-v4.29-9680-rtm-2019.02.28-linux-x64-64bit.tar.gz`

3. Softether VPN マニュアル [7.3 Linux へのインストールと初期設定](https://ja.softether.org/4-docs/1-manual/7/7.3) ＞7.3.4 パッケージの解凍 から 7.3.9 サービスの開始と停止 までの記載に沿って実行

5. [Softether ダウンロードセンター](https://www.softether-download.com/ja.aspx?product=softether)からSoftEther VPN Manager for Windows を自分の端末にダウンロード・インストールする。

4. VPNサーバが起動したら、`vpncmd`を用いて管理パスワードを設定する。

```
[root@hostname ~]# /usr/local/vpnserver/vpncmd
vpncmd command - SoftEther VPN Command Line Management Utility
SoftEther VPN Command Line Management Utility (vpncmd command)
Version 4.29 Build 9680   (English)
Compiled 2019/02/28 19:22:54 by yagi at pc33
Copyright (c) SoftEther VPN Project. All Rights Reserved.

By using vpncmd program, the following can be achieved.

1. Management of VPN Server or VPN Bridge
2. Management of VPN Client
3. Use of VPN Tools (certificate creation and Network Traffic Speed Test Tool)

Select 1, 2 or 3: 1

Specify the host name or IP address of the computer that the destination VPN Server or VPN Bridge is operating on.
By specifying according to the format 'host name:port number', you can also specify the port number.
(When the port number is unspecified, 443 is used.)
If nothing is input and the Enter key is pressed, the connection will be made to the port number 8888 of localhost (this computer).
Hostname of IP Address of Destination: localhost

If connecting to the server by Virtual Hub Admin Mode, please input the Virtual Hub name.
If connecting by server admin mode, please press Enter without inputting anything.
Specify Virtual Hub Name:
Connection has been established with VPN Server "localhost" (port 443).

You have administrator privileges for the entire VPN Server.

VPN Server>ServerPasswordSet
ServerPasswordSet command - Set VPN Server Administrator Password
Please enter the password. To cancel press the Ctrl+D key.

Password: **********
Confirm input: **********


The command completed successfully.
```

サーバ側での作業は以上。

## SoftEther VPNの設定
 
Softether VPN マニュアル ＞ 2. SoftEther VPN 全般マニュアル ＞ [2.4 VPN サーバー管理マネージャ](https://ja.softether.org/4-docs/1-manual/2._SoftEther_VPN_%E5%85%A8%E8%88%AC%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB/2.4_VPN_%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E7%AE%A1%E7%90%86%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3)

および

SoftEther VPN マニュアル ＞ 3. SoftEther VPN Server マニュアル
＞ [3.3 VPN Server 管理](https://ja.softether.org/4-docs/1-manual/3._SoftEther_VPN_Server_%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB/3.3_VPN_Server_%E7%AE%A1%E7%90%86)

を確認しながら適切に設定する。

**参考**
「仮想NATおよび仮想DHCPサーバ機能」は有効にしないと使えないので、マニュアルをよく読んで有効化すること。




# 雑
## ツール類
##speedtest-cliのインストール
`yum -y python python-setuptools`
`easy_install speedtest-cli`
使い方は[LinuxでもSpeedtestがしたい（speedtest-cli）](https://qiita.com/CloudRemix/items/ad226ea4aa641427e682)などが詳しい。

## Systemdによるサービス化

<!--
- 起動中に`-bash: fork: Cannot allocate memory`が出ることが続いているので、Systemdによるサービス化をして様子を見る
--->

公式ドキュメントではinit.dによる起動をするようにマニュアル化されているので、モダンな作法に乗っ取りsystemdで動かすように変更する。

```
#chkconfig --del vpnserver
```

```/etc/systemd/system/vpnserver.service
[Unit]
Description=SoftEther VPN Server
After=network.target network-online.target

[Service]
ExecStart=/usr/local/vpnserver/vpnserver start
ExecStop=/usr/local/vpnserver/vpnserver stop
Type=forking
RestartSec=3s

[Install]
WantedBy=multi-user.target
```

``` 起動と確認
# systemctl start vpnserver
# systemctl status vpnserver
```

正常起動したら以下でサービス化

```
# systemctl enable vpnserver
```

**参考**

- [SystemctlでSoftEtherVPNをデーモン化する](https://cpoint-lab.co.jp/article/201809/5207/)
- [Ubuntu上でSoftEther VPN Server構築](https://qiita.com/t-ken/items/c43865973dc3dd5d047c)
- [SoftEtherによる踏み台用VPNサーバーの構築手順 on IDCFクラウド CentOS 7](https://inaba-serverdesign.jp/blog/20170817/softether_vpn_idcf_cloud_centos7.html)


<!--
\##cgroupsによるプロセス制限

```
# yum -y install libcgroup libcgroup-tools
...
\-\-\> Finished Dependency Resolution
Error: systemd conflicts with initscripts-9.49.17-1.el7_0.1.x86_64
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest
```

**参考**

- [SERVERSMAN の CentOS 7 の initscripts 障害について調べてみた](http://blog.livedoor.jp/blackwingcat/archives/1977599.html)
- [Cgroups : インストール](https://www.server-world.info/query?os=CentOS_7&p=cgroups)
- [cgroupsを利用したリソースコントロール(RHEL7)](https://qiita.com/legitwhiz/items/72ead813f5be784534e5)

-->


#気が向いたら追記
- 別の仮想HUBとカスケード接続した時にハマったポイント
- 別の仮想HUB上ののネットワークと相互接続する

<!--

https://solomon-review.net/softether-vpn-family-connection-06/
ポート443でカスケード接続したらDHCPが降ってこなかったけど
ポート992でカスケード接続したらDHCPが降ってきた
ポート443の場合は「物理通信に使用中のプロトコル」が「VPN over UDP with NAT-TとなりNG
ポート992の場合は「物理通信に使用中のプロトコル」が「Standard TCP/IP」となりOK。

-->