AWS(EC2)でSoftEtherを使ってL2TP/IPsecなVPNを構築する (Mac)

[SoftEther](http://ja.softether.org/)のVPNソフトがすごい！ らしいので、EC2のAmazon Linuxで環境構築をしてみた。
2014年の頭にOSSになって、無償でつかえるようになったらしい。

[追記]
2022/05/27 最新版RTMの v4.38-9760-rtm の情報に更新
~~2020/04/08 最新版の v4.29-9680-rtm の情報に更新~~
~~2016/04/17 最新版の v4.20-9608-rtm の情報に更新~~
~~2015/11/16 最新版の v4.18-9570-rtm の情報に更新~~


# 環境
### サーバー側
* EC2 t2.micro Amazon Linux
* SoftEther VPN

### クライアント側
* Mac OS X (10.9.5 or higher)
* iOS (8.1 or higher)
* Android, PC (動作未確認ですが、普通に動くはずです)
* Macしか手元に無く、SoftEtherのWindows向けGUIソフトが使えない前提です。

# その他の記事
* L2TP/IPsecではなくて、SoftEther標準のクライアントで接続する場合はここを見るといいかもしれません。
  * http://qiita.com/ask/items/9ff1529d228ec093aa07
* クライアントがLinuxの人はここを見るといいかもしれません。 
  * http://blog.memolib.com/memo/736
* クライアントがWindowsの人は、Windows向けのGUIツールを使った導入記事がたくさんあります。
  * 自分でググれ！
* 公式のドキュメント
  * http://ja.softether.org/4-docs

# 1. サーバー(EC2)にSoftEtherをインストール
基本的には公式ドキュメントの[ここ](http://ja.softether.org/4-docs/1-manual/7/7.3)に沿って行えば良いです。

```bash

 # 以下すべてrootで行います
$ sudo su root

 # make で必要
$ yum install -y gcc

 # ソースコードを落としてきます。
$ wget https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/releases/download/v4.38-9760-rtm/softether-vpnserver-v4.38-9760-rtm-2021.08.17-linux-x64-64bit.tar.gz

 # 解凍する
$ tar -zxvf softether-vpnserver-v4.38-9760-rtm-2021.08.17-linux-x64-64bit.tar.gz

$ cd vpnserver

 # ビルド
$ make

```

作成したvpnserverを`/usr/local`に置く。

```bash
$ mv /home/ec2-user/vpnserver /usr/local
```

ファイルの権限を変更する。

```bash

$ cd /usr/local/vpnserver/
$ chmod 600 *
$ chmod 700 vpncmd
$ chmod 700 vpnserver
```

SoftEtherのコマンドラインを使って、正しく設定ができているか確認する。

```bash

$ ./vpncmd
```

どのモードを使うか聞いてくるので、`3`を入力して

```bash

VPN Tools> check
```
とコマンドを入力する。
6つぐらいのテストをパスすれば、とりあえずここまではOK。

```bash

VPN Tools> exit
```
一旦終了。

# 2. スタートアップスクリプトへの登録
バックグラウンドで常に実行させるために、デーモンプロセスとして登録する。
`/etc/init.d/vpnserver`に以下を書き込む。

```
#!/bin/sh
# chkconfig: 2345 99 01
# description: SoftEther VPN Server
DAEMON=/usr/local/vpnserver/vpnserver
LOCK=/var/lock/subsys/vpnserver
test -x $DAEMON || exit 0
case "$1" in
start)
$DAEMON start
touch $LOCK
;;
stop)
$DAEMON stop
rm $LOCK
;;
restart)
$DAEMON stop
sleep 3
$DAEMON start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
exit 0
```

root以外のユーザが変更できないように、ファイルの権限を変更する。

```bash

$ chmod 755 /etc/init.d/vpnserver
```

サーバーを再起動した時にも自動的にVPNサーバーが起動するように設定

```bash

$ /sbin/chkconfig --add vpnserver 
```

動くかどうか試してみる

```bash
$ service vpnserver start
> The SoftEther VPN Server service has been started.
```

となればOK。

# 3.クライアントのアカウント作成
既存の記事はここからWindowsのGUIソフトを使うものばかりだったので、サーバー側でCUIで設定する方法を書く。

コマンドラインを起動する。

```bash

$ cd /usr/local/vpnserver/
$ ./vpncmd
```

今回はサーバーの設定をするので、`1`のモードを選択。
接続先のホスト名 と 仮想HUB名 を聞かれるけど、空白のままEnterを2回押せば良い。

ここのコマンドラインで使えるコマンドは`HELP`と入力すると、全部見れる。全部で205個のコマンドがあるらしい。
(ちなみに、コマンドの大文字小文字は関係なく、コマンドのスペルを少し間違えても推測して訂正してくれてすごい。)

### 仮想HUBの作成
仮想HUBが何なのかよく理解できていないけど、感覚的には、ユーザは仮想HUBに属していて、VPNを繋ぐ時の認証などはそこに所属する仮想HUBが担当するものらしい。
学校のクラスみたいなものを想像すればよいのかな。

とりあえず

```
VPN Server> HubList
```
という仮想Hubの一覧を見るコマンドを打ってみると、`DEFAULT`という仮想HUBが既に作られているのが分かる。
でも、やっぱり自分で作ったものがあると嬉しいので、`example`という名前の仮想HUBを作ってみる。

```
VPN Server> HubCreate
HubCreate コマンド - 新しい仮想 HUB の作成
作成する仮想 HUB の名前: example

パスワードを入力してください。キャンセルするには Ctrl+D キーを押してください。

パスワード:********
確認入力  :********

コマンドは正常に終了しました。 
```
となればOK。

### ユーザの作成
既存のユーザがいるのかなと調べてみる

```
VPN Server> UserList
```
とすると

```
UserList コマンド - ユーザー一覧の取得
このコマンドを実行する前に、Hub コマンドで管理対象の仮想 HUB を選択してください。
```
と怒られてしまう。
管理対象の仮想HUBを指定しないといけないようなので

```
VPN Server> HUB example
```
として、仮想HUB`example`を指定する。

```
VPN Server/example> UserList
```
とすると、まだだれもユーザがいないようなので、新しく`hoge`さんを作成する。

```
VPN Server/example> UserCreate
UserCreate コマンド - ユーザーの作成
ユーザー名: hoge

参加するグループ名: #option 空白EnterでOK

ユーザーの本名: #option 空白EnterでOK

ユーザーの説明: #option 空白EnterでOK

コマンドは正常に終了しました。
```
となればOK。
認証方法は5種類ぐらい用意されているらしいけど、今回はパスワード認証を選ぶことにする。

```
VPN Server/example> UserPasswordSet
UserPasswordSet コマンド - ユーザーの認証方法をパスワード認証に設定しパスワードを設定
ユーザー名: hoge

パスワードを入力してください。キャンセルするには Ctrl+D キーを押してください。

パスワード: ********
確認入力  : ********


コマンドは正常に終了しました。
```
となればOK。

これでユーザ作成は完成。
簡単！！！

# 4. L2TP/IPsecなVPNにする
MacやiOSなど(PC,Androidも含めて)では標準でL2TP/IPsecでVPN接続できるので、それに対応できるようにする。
公式ドキュメントでは以下の辺りを参考にすると良いと思う。

* [VPN Server 側での L2TP/IPsec 機能の有効化方法](http://ja.softether.org/4-docs/2-howto/L2TP_IPsec_Setup_Guide/1)
* [6.3.69 "IPsecEnable": IPsec VPN サーバー機能の有効化 / 無効化](http://ja.softether.org/4-docs/1-manual/6/6.3#6.3.69_.22IPsecEnable.22:_IPsec_VPN_.E3.82.B5.E3.83.BC.E3.83.90.E3.83.BC.E6.A9.9F.E8.83.BD.E3.81.AE.E6.9C.89.E5.8A.B9.E5.8C.96_.2F_.E7.84.A1.E5.8A.B9.E5.8C.96)

引き続き、コマンドラインで作業を続ける。
`IPsecEnable`とコマンドを入力すると、いくつか設定の値を聞かれるので、以下のように答える。

```
VPN Server/example> IPsecEnable
IPsecEnable コマンド - IPsec VPN サーバー機能の有効化 / 無効化
L2TP over IPsec サーバー機能を有効 (yes / no): yes

Raw L2TP サーバー機能を有効 (yes / no): no

EtherIP / L2TPv3 over IPsec サーバー機能を有効 (yes / no): no

IPsec 事前共有鍵の文字列 (9 文字以下を推奨): ********

VPN 接続時に仮想 HUB 名が省略された場合のデフォルト仮想 HUB 名: example

コマンドは正常に終了しました。
```
これだけで、L2TP/IPsec で接続できるようになる。すごい。

L2TP/IPsec で繋ぐには、UDPのポートをいくつか開けないといけないので、AWSのセキュリティグループで以下のものを開けておく

* UDP 500
* UDP 4500
* ~~UDP 1701~~ ←不要です

【追記】
UDP 1701 は開放不要との[コメント](http://qiita.com/showwin/items/92861057a8b62611444d#comment-a4efdae3a6c09f3da8a2)を頂きました。ありがとうございます！

# 5. ぼくがめちゃくちゃハマったところ
「仮想 NAT および DHCP サーバー機能 (SecureNAT 機能) の有効化」をする必要があった。
だけど、実はこれが何なのかよく分かっていない。勉強不足。。。

これもコマンドラインで有効化する。

```
VPN Server/example> SecureNatEnable
```

これを有効化しないと、クライアントから接続した時に「PPPサーバーとの接続が確立ができません」みたいなエラーが出る。
SoftEtherのログインログを見てみると、ちゃんとログイン回数は増えていたので、認証は通るけど、そのあとVPNが正しく構築されないという状況らしい。

これで5時間ぐらいハマった。

# 6. めでたくMacからVPN接続する
いつものシステム環境設定からVPN繋ぐやつ。
よくわからない人は公式ドキュメントの[ここ](http://ja.softether.org/4-docs/2-howto/L2TP_IPsec_Setup_Guide/5)を見てください。
iOSの場合は[こっち](http://ja.softether.org/4-docs/2-howto/L2TP_IPsec_Setup_Guide/2)。

ちょっと注意すべきなのはアカウント名が [ユーザ名]@[仮想HUB名] になること。

```
VPN Server/example> IPsecEnable
 (略)
VPN 接続時に仮想 HUB 名が省略された場合のデフォルト仮想 HUB 名: example
``` 

に指定した仮想HUB(上の例では `example`)に所属する場合はアカウント名から @[仮想HUB名] を除いた [ユーザ名] だけでもログインできます。

# 7. ついでに宣伝
回線状況が悪いところでネットをしていて、プツプツVPNが切れると何回も繋ぎ直したりしてイライラしますよね。
そんなあなたのために、自動でVPNを繋ぎ直してくれるMac向けのアプリケーションを作ってたりするので、興味ある人はどうぞ。
ダウンロード: https://github.com/showwin/FeVPN/releases
ソースコード: https://github.com/showwin/FeVPN