RTX1200 で L2TP/IPsec の VPN を構築する

# 公式のサポートについて
Android や iOS クライアントとの L2TP/IPsec VPN の接続設定については公式に説明がありサポート対象らしいです。
リンク先の説明は古いので適宜読み替える必要はありますが、困るほどでは無いでしょう。
参考: [iOSからリモートアクセスする](https://network.yamaha.com/setting/router_firewall/vpn/vpn_client/ios)
参考: [Androidからリモートアクセスする](https://network.yamaha.com/setting/router_firewall/vpn/vpn_client/android)

Windows での接続はサポート対象外で、ヤマハ公式のクライアントソフトウェアを使えという感じっぽいです。
参考: [YMS-VPN8ソフトウェアライセンス版](https://network.yamaha.com/products/software_service/yms-vpn8-license/index)
たくさん情報があるように当然 OS 標準の機能でVPN接続できますので、 OS 標準の機能でやっていきたいと思います。

Mac については専用クライアントソフト含め、特に記述が見つからないですね。。
こちらも同様に OS 標準の機能を使って設定していきます。

# ネットボランチについて
ヤマハのルーターではグローバルIPアドレスを割り当てられている場合、
ネットボランチDNSサービスというものを利用できます。
参考: [FAQ / ネットボランチDNSサービス](http://www.rtpro.yamaha.co.jp/RT/FAQ/NetVolanteDNS/index.html)
要するにヤマハルーターを使っていれば無料で利用できるDDNSサービスです。
申し訳ないことに私はこのサービスをちゃんと理解していないのですが、ヤマハルーターのWANポートにグローバルIPアドレスが付与されていないとダメという事でしょうか。
私の環境ではグローバルIPアドレスは付与されているものの、ヤマハルーターがNAPT配下にいるためかアドレスを取得できませんでした。
こちらのサービスを利用できる環境の方はこちらのサービスを使うと良いでしょう。
静的グローバルIPアドレスを取得可能な方はそれをそのまま使えば問題無いでしょう。
どちらもダメな場合は別のDDNSサービスを利用しましょう。
この記事上ではサンプルのアドレスとして `.netvolante.jp` と書きますが、私も別のDDNSサービスを利用しています。
DDNSに関しましては別途調べてください。

# ルーター側の設定
慣れている人は始めからコマンドで、不慣れな人ではまずGUIで設定してから部分的にコマンドで変更したり詳細設定していくのが良いと思います。
今回は簡単のため、証明書による認証では無く事前共有鍵による認証で設定します。

## GUIでの設定
参考: [L2TP/IPsecを使用したリモートアクセス : RTX1200 Web GUI設定](https://network.yamaha.com/setting/router_firewall/vpn/vpn_client/vpn-smartphone-setup_rtx1200_gui)
インターネット接続設定ができている場合、「インターネット接続設定」は無視して次に進んで良いでしょう。
ネットボランチを利用する場合、その設定もこちらに書いてあります。
このページはGUIで分かりやすいのでおおよそそのまま従うと良いでしょう。
ただ、「認証鍵(pre-shared key)」は画像では「yamaha」とシンプルなものになっていますが、もうちょっと複雑なものにしておくと良いでしょう。
PPP認証方法は画像で示されている「CHAP-PAP」に設定でも、クライアント側で指定すれば問題ないでしょうが、 `PAP` はクリアテキストで認証を行うので使わないのが吉でしょう。
`CHAP` か `MS-CHAP v2` を選択すると良いでしょう。
参考: [PPP / PPPoE の認証(PAP/CHAP)、MS-CHAPv2について](https://milestone-of-se.nesuke.com/nw-basic/ppppppoe/pap-chap/)

## コマンドラインでの設定
参考: [ヤマハネットワーク機器の技術資料 - L2TP/IPsec](http://www.rtpro.yamaha.co.jp/RT/docs/l2tp_ipsec/)
特に [設定例3: NATトラバーサルを利用したL2TPクライアントの接続を受け付ける場合](http://www.rtpro.yamaha.co.jp/RT/docs/l2tp_ipsec/#setting3) を引用します。
インターネット接続設定は [こちら](https://qiita.com/mizutoki79/items/e28aed4aa3f162ed08f1) で済ませているので「
【経路設定】」「【LAN設定】」「【プロバイダとの接続設定】」は無視します。

```
pp select anonymous
 pp name L2TP
 pp bind tunnel1
 pp auth request (認証方式)
 pp auth username (ユーザーネーム1) (パスワード1)
 ppp ipcp ipaddress on
 ppp ipcp msext on
 ip pp remote address pool 192.168.100.10-192.168.100.20
 ip pp mtu 1258
 pp enable anonymous

tunnel select 1
 tunnel encapsulation l2tp
 ipsec tunnel 101
  ipsec sa policy 101 1 esp (暗号アルゴリズム) (認証アルゴリズム)
  ipsec ike keepalive use 1 off
  ipsec ike local address 1 192.168.100.1
  ipsec ike nat-traversal 1 on
  ipsec ike pre-shared-key 1 text (事前共有鍵)
  ipsec ike remote address 1 any
 l2tp tunnel disconnect time off
 l2tp keepalive use on 10 3
 l2tp keepalive log on
 l2tp syslog on
 ip tunnel tcp mss limit auto
 tunnel enable 1

nat descriptor type 1 masquerade
nat descriptor address outer 1 ipcp
nat descriptor address inner 1 auto
nat descriptor masquerade static 1 1 192.168.100.1 esp
nat descriptor masquerade static 1 2 192.168.100.1 udp 500
nat descriptor masquerade static 1 3 192.168.100.1 udp 4500

ipsec transport 1 101 udp 1701
ipsec auto refresh on

l2tp service on
```

`pp auth request` で指定するのが上のGUIで指摘したPPP認証方法です。
こちらでも `chap` か `mschap-v2` を指定すると良いでしょう。
参考: [14.3 要求する認証タイプの設定](http://www.rtpro.yamaha.co.jp/RT/manual/rt-common/ppp/ppp_pp_auth_request.html)

`ipsec sa policy` で選択する暗号アルゴリズムと認証アルゴリズムは強固に超したことはないですが、始めは
暗号アルゴリズムは `aes-cbc` 、
認証アルゴリズムは `sha-hmac` を選択することをおすすめします。
少なくともWindowsでは追加の設定が必要になりますのでまず、 `aes-cbc` / `sha-hmac` を選択して、VPNに一通り接続できることを確認してから、 `aes256-cbc` / `sha256-hmac` に変更すると良いと思います。
参考: [Windows10やスマホから、L2TP/IPSecによるリモートアクセスVPNを行うためのヤマハRTXルーターのCUI設定方法 - 認証アルゴリズムにHMAC-SHA2-256を使用したい場合の設定例](https://www.haruru29.net/blog/how-to-set-l2tp-ipsec-vpn-on-yamaha-router/#HMAC-SHA2-256)

コマンドのインデントされている部分は上のコマンドを実行してから実行します。
つまり、例えば SA ポリシーを変更したい場合、

```
# tunnel select 1
tunnel1# ipsec tunnel 101
tunnel1# ipsec sa policy 101 1 esp aes-cbc sha-hmac
tunnel1# save
```

というように変更します。

# クライアント側の設定

## Windows クライアントの設定

前述の通り、ヤマハ公式としてはWindowsビルトインのVPNはサポート対象外のようで、公式のクライアントアプリケーション(有料)での使用を推奨しています。
ですが、標準の機能でも接続できます。

### NATトラバーサルについて
Windows 10 においてNATトラバーサルの機能はデフォルトでオフになっており、レジストリを変更して使える様にする必要があります。
`AssumeUDPEncapsulationContextOnSendRule` というキーを設定します。
`AssumeUDPEncapsulationContextOnSendRule` は次のような値を取ります。

|値 |説明                                                             |
|:-:|:----------------------------------------------------------------|
| 0 |NAT トラバーサル無効、初期値                                       |
| 1 |NAT トラバーサル有効、サーバーが NAPT 配下の場合                  |
| 2 |NAT トラバーサル有効、クライアント・サーバーの両方が NAPT 配下の場合|

自身の環境に合った値を設定してください。
環境によってはこれを設定する必要ない場合もあります。
私の環境ではサーバー側クライアント側共にNAPT配下だったので `2` を設定します。
参考: [Windows Vista および Windows Server 2008 で NAT-T デバイスの背後に L2TP/IPsec サーバーを構成する方法](https://support.microsoft.com/ja-jp/help/926179/how-to-configure-an-l2tp-ipsec-server-behind-a-nat-t-device-in-windows)

[Windowsボタン + X] -> [A] で PowerShell を起動します。
以下のコマンドを実行し、再起動します。

```powershell
New-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Services\PolicyAgent AssumeUDPEncapsulationContextOnSendRule -T Dword -V 2; Restart-Computer -con
```

### VPN の設定
[設定] -> [ネットワークとインターネット] -> [VPN] から「VPN 構成を追加する」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/100313/81be33fb-0f20-0ea4-b0df-72f98e24c8fb.png)

VPN 接続設定で以下の設定を入力します。

|設定項目名             |設定値                                                            |
|:---------------------|:----------------------------------------------------------------|
|VPN プロバイダー       |Windows (ビルトイン)                                              |
|接続名                |(任意の名前)                                                      |
|サーバー名またはアドレス|(グローバルIPアドレス or DDNS から取得したホスト名                  |
|VPNの種類             |事前共有キーを使った L2TP/IPsec                                    |
|事前共有キー           | `ipsec ike pre-shared-key 1 text XXXXX` で設定した `XXXXX` の部分|
|サインイン情報の種類    |ユーザー名とパスワード                                             |
|ユーザー名             | `pp auth username USERNAME PASSWORD` で設定した `USERNAME` の部分|
|パスワード             | `pp auth username USERNAME PASSWORD` で設定した `PASSWORD` の部分|

で保存ボタンをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/100313/34b8937a-4bda-fd4a-56cf-aaab3b29e9b9.png)

関連項目にある「アダプターのオプションを変更する」をクリックします。
「ネットワーク接続」の画面に先ほど「接続名」で設定した名称のアダプターがあるはずなのでそれを右クリックしプロパティをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/100313/7b755565-260c-12b8-da26-41bcb5102ce5.png)

「全般」タブでホスト名が正しく入力されていることを確認します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/100313/38533ae3-423b-e74e-f156-62147aa0c7d2.png)

セキュリティタブで L2TP/IPsec になっていることを確認します。
「データの暗号化」は「暗号化が必要(サーバーが拒否する場合は切断します)」を選択、
「認証」で、自分が `pp auth request xxxx` で指定した設定に合わせて、
「チャレンジハンドシェイク認証プロトコル (CHAP)」「Microsoft CHAP Version 2 (MS-CHAP v2)」のチェックボックスにチェックを入れます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/100313/3cb29912-c41e-6c36-9841-bc0998c82429.png)

また、「VPN の種類」のすぐ右下の「詳細設定」先で事前共有鍵あるいは証明書の再設定を行えます。
接続に失敗する場合はこれの再入力を試すのも良いと思います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/100313/bed356c7-fcf2-b635-8406-2def709cdf8c.png)

### 接続する
タスクバー右のネットワークアイコンをクリックすると接続されているネットワークの他に VPN が表示されるようになっています。
そこで、接続する VPN をクリックして「接続」ボタンをクリックすれば、 VPN に接続できます。

## Mac クライアントの設定
### 設定
[システム環境設定]の[ネットワーク]を開きます。
左下の「＋」を押して以下の設定を追加し「作成」を押します。
「メニューバーにVPNの状況を表示」にはチェックを入れておきましょう。

|設定項目名   |設定値          |
|:----------|:--------------|
|インターフェース|VPN            |
|VPNタイプ    |L2TP over IPsec|
|サービス名    |（任意の名前）     |

![image.png](https://qiita-image-store.s3.amazonaws.com/0/100313/c194d7ad-c084-9433-9c99-a124e73f35b9.png)

|設定項目名   |設定値          |
|:-----------|:--------------|
|構成         |デフォルト            |
|サーバアドレス|(グローバルIPアドレス or DDNS から取得したホスト名)|
|アカウント名  | `pp auth username USERNAME PASSWORD` で設定した `USERNAME` の部分|

![image.png](https://qiita-image-store.s3.amazonaws.com/0/100313/2159c43c-cd55-73b2-50e0-104960a3cac5.png)

「認証設定…」を押して以下を入力。

|設定項目名   |設定値          |
|:-----------|:--------------|
|パスワード   | `pp auth username USERNAME PASSWORD` で設定した `PASSWORD` の部分|
|共有シークレット| `ipsec ike pre-shared-key 1 text XXXXX` で設定した `XXXXX` の部分|

![image.png](https://qiita-image-store.s3.amazonaws.com/0/100313/4b6b10bb-652c-479b-c4e7-b4edb2a05a5f.png)

VPNサーバーをデフォルトゲートウエイに設定したい場合は「詳細…」をクリックして、「すべてのトラフィックをVPN接続経由で送信」にチェックを入れれば良い。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/100313/fc1a3450-343c-c739-58ea-a22e2367fa39.png)

### 接続
メニューバーのVPNアイコンをクリックして、対象のVPNの接続をクリックすれば接続できます。

<img width="229" alt="スクリーンショット 2018-08-15 23.17.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/100313/3789146f-6d37-405c-e276-f9a776fd5b8e.png">

# Windowsで接続に失敗する
Windows での接続が少し不安定に感じます。
一度接続しても頻繁に切れるということではなく、設定を全く変更していなくても、
接続できるときもあれば失敗するときもあります。
失敗する場合、時間を置いて再度試すと接続できるようになることが多いです。
iOS や Mac からでは Windows で失敗しているときに試しても安定して接続できるので、
ルーター側では無く Windows 側の問題のように思いますが、原因が分かりません。

# 参考
[Yamaha ルーターシリーズ コマンドリファレンス](http://www.rtpro.yamaha.co.jp/RT/manual/rt-common/)