iPhoneのL2TP/IPsec接続でセキュアなwebサイトを作る on SoftLayer

本エントリは[2枚目 SoftLayer Advent Calendar 2014](http://qiita.com/advent-calendar/2014/softlayer2)の15日目向けに書いてみました！
※本当はvSphere on SoftLayerをやりたかったんですが、ベアメタルサーバを使う必要があるため、課金が厳しい的判断で今回は諦めました……。

#やりたいこと#
スマホ（iPhone）で特定のユーザしか見えないサイトを作りたい！
しかも、ユーザー以外にはサイトの存在さえ知られたくない！

#前提#
IP-VPNでつなげた状態でないと閲覧できないWebサーバを作成します。
VPNで使用するのは、お手軽に出来そうなL2TP/IPSec。
※iPhoneで使用可能なVPNプロトコルについては、下記のアップルの資料を参照しています。
[iOS：サポートしている VPN プロトコル](http://support.apple.com/ja-jp/HT201533)

#構成イメージ#
![kousei.png](https://qiita-image-store.s3.amazonaws.com/0/61030/a659c682-fd4f-a96f-3af8-08ecd72a5503.png)


iPhoneユーザはまずVPN接続を張った上で、Webサーバのアドレス（ローカルアドレス）を叩くことでサイトを閲覧できます。

####VPN-GW####
タイプ：VirtualServer,Vyatta
OS：Vyatta Community Edition for VSI6.6.0
スペック：1CPU/1GBmemory

####Webサーバ####
タイプ：VirtualServer
OS：CentOS6.0-64 LAMP for VSI
スペック：1CPU/1GBmemory

#設定#
##SoftLayer側設定##
####VPN-GW####

eth0がPrivateネットワーク側インターフェース
eth1がPublicネットワーク側インターフェース

#####NAT設定#####
```
vyatta@VPN-GW01# show nat
    source {
        rule 1 {
         outbound-interface eth0
         source {
             address 0.0.0.0/0
         }
         translation {
             address [VPN-GWのPrivate IP]
         }
     }
 }
```

#####VPN設定#####
```
vyatta@VPN-GW01# show vpn 
 ipsec {
     ipsec-interfaces {
         interface eth1
     }
     nat-networks {
         allowed-network 0.0.0.0/0 {
         }
     }
     nat-traversal enable
 }
 l2tp {
     remote-access {
         authentication {
             local-users {
                 username test {
                     password [パスワード]
                 }
             }
             mode local
         }
         client-ip-pool {
             start [プライベート側ネットワークの割り当てIPの開始アドレス]
             stop [プライベート側ネットワークの割り当てIPの終了アドレス]
         }
         ipsec-settings {
             authentication {
                 mode pre-shared-secret
                 pre-shared-secret [プリシェアードキー]
             }
         }
         outside-address [VPN-GWのPublic IP]
 }
 }
```


####Webサーバ####
ドキュメントルールに接続確認用のページを作るだけです（その他は、SoftLayerでデプロイされるLAMP構成はデフォルト）

※ドキュメントルートは

```
#more /etc/httpd/conf/httpd.conf
```

で確認すると

```
DocumentRoot "/var/www/html"
```

という記載があったので、/var/www/htmlの配下にindex.htmlというファイルを作成しました。

##iPhone側設定##
今回はiPhone6
iOS:8.1.2
を使用しています。

* * *
1.[設定]>[一般]に移動します。
![IMG_4173.PNG](https://qiita-image-store.s3.amazonaws.com/0/61030/d1fff8f2-f8f7-868f-1492-db2bd82ea528.png)

* * *
2.[一般]>[VPN]に移動します。
![IMG_4174.PNG](https://qiita-image-store.s3.amazonaws.com/0/61030/c72fc371-efd9-4d9a-5f56-a94a152dc33b.png)
* * *
3.[VPN]で[VPN構成を追加]を選択します。
![IMG_4175.PNG](https://qiita-image-store.s3.amazonaws.com/0/61030/1d602c84-cf7e-7cb7-4abf-b9214dc4362e.png)
* * *
4.下記のように設定します。
タイプ：L2TP
説明：任意
サーバ：VPN-GWのIPアドレス（またはDNS名）
アカウント：VPN-GW側で作った接続ユーザ名
パスワード：VPN-GW側で作った接続ユーザ用のパスワード
シークレット：VPN-GW側で設定したプリシェアードキー
![IMG_4172.PNG](https://qiita-image-store.s3.amazonaws.com/0/61030/6d6cc63a-1979-5382-7ab9-d11c98e0ddfd.png)
* * *
5.[VPN設定を保存]して完了！


#接続テスト#
##iPhoneで接続確認##

上記で作ったVPN設定を選択して（※）、接続ボタンをONにします。
※複数設定がある場合は明示的に選択する必要があります。選択された設定にはチェックマークが付いてます。
![IMG_4177.PNG](https://qiita-image-store.s3.amazonaws.com/0/61030/c9ffd568-b99b-4f6f-9afc-099493babcc8.png)

Webサーバのローカルアドレスに接続してみます。
私が作ったハイセンスなページが見えているので接続成功です！
画面左上でVPN接続が成功していることもわかります。
![IMG_4179.PNG](https://qiita-image-store.s3.amazonaws.com/0/61030/ffca79b4-12f0-25a2-a15b-25f346b9d200.png)



##VPN-GW側で確認##
VPN-GW側で接続されているか確認します。

```
vyatta@VPN-GW01:~$ show vpn ipsec state
src [VPN-GWのPublic IP] dst [iPhoneのグローバルIP]
        proto esp spi 0x02dacb1b reqid 16504 mode transport
        〜中略〜
src [iPhoneのグローバルIP] dst [VPN-GWのPublic IP]
        proto esp spi 0xced962b6 reqid 16504 mode transport
        replay-window 32 
        〜中略〜
```

アクセス中であることがわかります。

#本構成のメリット#
* VPN-GWをVitualServerで作っているのでお安い！
* iPhoneに余計なアプリを入れる必要がない！
* わかりやすいようにWebにしたけど、他のアプリケーション通信もたぶん可能だよ！

#課題#
vyattaがSPOFになっているので冗長化をするにはどうすればよいか？
　vyattaをVRRPで冗長化？
　別DCに同じ構成を作る？