SoftLayer上にL2TP/IPsecを用いたVPNを構築

#事前に用意するもの

SoftLayerアカウント → 未取得の場合は[30日トライアル](http://www.ibm.com/cloud-computing/jp/ja/softlayer_freecloud.html)を利用
Windows 7搭載PC → SSH接続でSoftLayer上の仮想サーバーを操作 & VPNサーバー設定用
PuTTYごった煮版 → Windows PCからSSH接続に使用
参考資料①：[ソフトレイヤー活用技術資料 コンフィグレーション・ガイド](https://gg-web.jp/document/ConfigGuide/)
参考資料②：ITpro Linuxコマンド集 [【 vi 】テキスト・ファイルを編集する](http://itpro.nikkeibp.co.jp/article/COLUMN/20060228/230985/)
参考資料③：[SoftEther VPN プロジェクト](https://ja.softether.org/)


#環境構築用のサーバーを用意
SoftLayerにて、下記の構成の仮想サーバーを用意します。
お手持ちのアカウントで、[SoftLayer カスタマーポータル](https://control.softlayer.com/)にログインし、下記の構成の仮想サーバーを1台用意します。仮想サーバーが利用可能なったら、[PuTTy](http://ja.wikipedia.org/wiki/PuTTY)でSSHにて接続します。パフォーマンス最優先の場合はベアメタルなのですが、今回は手軽にやりたいので仮想サーバーでやります。

今回の構成：$0.06 / 時間

* CentOS 7.x minimal (64bit)
* メモリ 2GB
* CPU 1コア × 2.0GHz
* ストレージ 25GB(SAN)
* ネットワーク Public/Private 100Mbps
* Public IPアドレス ×1 / Private IPアドレス ×1
* データセンター：米国サンノゼ
* ファイアウォール：APFを追加

#APF設定とタイムゾーン変更
APFは、SoftLayerでLinuxを使用するときにお馴染みのソフトウェア型ファイアウォールです。APFの役割については、ソフトレイヤー活用技術資料のセキュリティ対策編に記載されています。


`# vi /etc/apf/conf.apf`
iキーを押し、入力モードへ
IG_TCP_CPORTS= "22,443,992,1194,5555"
IG_UDP_CPORTS=  "53,500,1701,4500"
Escキーを押し、コマンド(移動)モードへ
:(コロン)wqで保存
`# /etc/init.d/apf start` でAPFを起動。APF再起動には、startをrestartに変更。
`# chkconfig apf on` でサーバーのブート時にAPFを自動起動。
`# timedatectl set-timezone Asia/Tokyo` でタイムゾーンを日本時間に合わせます。

#SoftEther VPN サーバーのインストール
基本的には公式の[「Linuxへのインストールと初期設定」](https://ja.softether.org/4-docs/1-manual/7/7.3)ドキュメントに従って操作します。
SoftLayerで提供されているVPNとは別に独自にVPNサーバーを立てるため、SoftEther VPN サーバーを使用します。先ずは、SoftEther VPN サーバーのインストールに必要なツールをインストールします。

`# yum install gcc` もし、tar と wget が入っていない場合は、yum install で追加します。
`# yum install epel-release`
`# yum update`

###SoftEther VPN サーバーをインストールします。

`# wget http://jp.softether-download.com/files/softether/v4.08-9449-rtm-2014.06.08-tree/Linux/SoftEther%20VPN%20Server/64bit%20-%20Intel%20x64%20or%20AMD64/softether-vpnserver-v4.08-9449-rtm-2014.06.08-linux-x64-64bit.tar.gz`
`# tar zxvf softether-vpnserver-v4.08-9449-rtm-2014.06.08-linux-x64-64bit.tar.gz`
`# cd vpnserver`
`# make`
makeを行うと使用許諾への同意が表示されますので、1 を入力します。
その後も繰り返し1を入力します。


vpnserver ディレクトリを、/usr/local下に移動します。
`# cd ../`
`# mv vpnserver/ /usr/local`
`# cd /usr/local/vpnserver/`

権限を変更し、「root」権限を持たないユーザーに変更されないように設定。
`# chmod 600 *`
`# chmod 700 vpncmd`
`# chmod 700 vpnserver`

`# ./vpncmd` を実行します。実行すると無事にインストールできたか動作チェックを行うことができます。1～3の選択肢が表示されますので、「3. Use of VPN Tools (certificate creation and Network Traffic Speed Test Tool)」を選びます(3を入力)。
`VPN Tools>`が表示されますから、`check` と入力し、Enterキーを押します。
再度`VPN Tools>`が表示されます。ここでは`exit` と入力し、Enterキーを押します。

###スタートアップスクリプトの登録
デーモンとしてVPNサーバーをバックグラウンドで動かすためスクリプトを用意します。

`# vi /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

`# cat /etc/init.d/vpnserver` を実行し、スクリプトがきちんと入っているか確認します。

権限を変更し、「root」権限を持たないユーザーに変更されないように設定。
`# chmod 755 /etc/init.d/vpnserver`


サーバーのブート時にVPNサーバーが自動起動するように設定
`# /sbin/chkconfig --add vpnserver`

vpnserverを起動
`# service vpnserver start`


#Windows PCからのVPNサーバー設定

SoftEther VPN プロジェクトのページからSoftEther VPN 管理マネージャー(SoftEther VPN Server Manager for Windows)を[ダウンロード](http://www.softether-download.com/ja.aspx?product=softether)、お手元のPCにインストールします。インストール後、起動しておきます。今回は、バージョン 4.08を使用しました。

####新しい接続設定の作成と管理者パスワードの登録
1.SoftEther VPN サーバー 管理マネージャーの画面にて、[新しい接続設定]をクリック
2.新しい接続設定の画面が表示されるので、[接続設定名]を入力
3.[ホスト名]にSoftLayer上の仮想サーバーのPublic IPを入力し、[OK]ボタンをクリック
4.SoftEther VPN サーバー 管理マネージャーの画面に戻る
5.[接続]ボタンをクリック
6.画面指示に従い、管理者パスワードを登録
7.[SoftEther VPN Server / Bridge 簡易セットアップ]画面が表示されるので、画面を閉じる

![softether_vpn_server_newconnet.png](https://qiita-image-store.s3.amazonaws.com/0/41414/ca26bb2e-0de5-7128-0257-530850a79e78.png)

####L2TP/IPsec機能の有効化
1.IPsecの設定を行うか確認する画面が表示されますので、[はい]をクリック
2.[L2TPサーバー機能を有効にする(L2TP over IPsec)]にチェックを入れる
3.[IPsec事前共有鍵]として、9文字以内でシークレットキーを考え、入力

*  10文字以上でも可能ですが、その場合はAndroidの一部のバージョンに影響ありという警告画面が表示されます。接続する端末に問題なければ10文字以上でも大丈夫です。

4.[OK]ボタンをクリック

![softether_vpn_server_l2tp_settings_1.png](https://qiita-image-store.s3.amazonaws.com/0/41414/c4336f7e-a096-a333-17bd-0ee79a443e62.png)

#VPN Server "xxxx.xxxx.xxxx.xxxx"の管理
"xxxx.xxxx.xxxx.xxxx"には、先ほど[ホスト名]で入力したSoftLayer上で稼働中の仮想サーバーのPublic IPアドレスが入ります。

1.[VPN Server "xxxx.xxxx.xxxx.xxxx"の管理]画面が表示されます。
2.[仮想HUBの管理]ボタンをクリック
3.[仮想HUBの管理]画面が表示されますので、[ユーザーの管理]ボタンをクリック
4.VPNに接続するユーザーの新規作成を行います。

* ユーザー作成画面では、ユーザー名や本名などの入力を行い、認証方法には「パスワード認証」を選択します。勿論有効期限やセキュリティポリシー等も設定する画面があります。公式のマニュアルは[こちら](https://ja.softether.org/4-docs/1-manual)から。

5.[仮想HUBの管理]に戻り、[仮想NATおよび仮想DHCPサーバー機能]ボタンをクリック
6.[SecureNAT機能を有効にする]ボタンをクリック

* SecureNATを有効にしない状態で、iPadから構築したVPNサーバーに接続しようとしても、「PPPサーバへの接続を確立できませんでした～」というエラーメッセージが表示されます。

![softether_vpn_server_l2tp_settings_2.png](https://qiita-image-store.s3.amazonaws.com/0/41414/2a24958d-b2cd-1f70-9e87-61f220a07683.png)

![softether_vpn_server_user_settings_1.png](https://qiita-image-store.s3.amazonaws.com/0/41414/71e1fbdc-cc92-de77-695b-1cd19f4e8224.png)

![softether_vpn_server_l2tp_SecureNAT.png](https://qiita-image-store.s3.amazonaws.com/0/41414/9d5d28fd-9b5b-caaf-9cac-929a85f2f10a.png)

#iPadからVPNサーバーに接続

1.iPadの[設定]→[一般]→[VPN]→[VPN]→[VPN構成を追加]を選択します。
2.「L2TP」「PPTP」「IPSec」の中から、「L2TP」を選択します。
3.下記の各項目に値を入力し、保存します。

* [説明]：わかりやすい名称などを入力
* [サーバ]：構築したSoftEther VPN サーバーのホスト名を入力
* [アカウント]：登録したVPN接続ユーザー@仮想HUB名(標準ではdefault) を入力
* [パスワード]：登録したVPN接続ユーザーの個別のパスワードを入力
* [シークレット]：構築したSoftEther VPN サーバーのIPsec事前共有鍵を入力
* [すべての信号を送信]：オンにしておく

![ipad_vpn_settings.png](https://qiita-image-store.s3.amazonaws.com/0/41414/40bb9604-e1ef-d980-1043-568eb284d286.png)

4.iPadの[設定]→[一般]→[VPN]→[VPN]の画面で、VPN接続をオン
5.VPN接続が無事に完了すると下記のように表示されます。

![ipad_vpn_status.png](https://qiita-image-store.s3.amazonaws.com/0/41414/3e6cc95d-311b-89d6-43a3-7bfd8dea1018.png)

#他にもやってみると面白そうなこと

SoftEther VPN プロジェクトの公式のドキュメントを読んでいくと、チュートリアルに「クラウドにおけるVPN」という項目があります。
チュートリアルの「複数クラウド間のVPNブリッジ接続」や「クラウドVMを企業内LANに参加させる方法」といったものをSoftLayer上で実施すると面白そうです。