YAMAHA RTX1210でリモートアクセスVPN (IKEv2)環境を作る（Mac/iPhone対応）

## この文書の目的

YAMAHA が 2024年7月に RTX1210 で動作する IKEv2 ファームウェアを出した事を「[YAMAHAルータでリモートアクセスVPN(IKEv2)に対応する](https://qiita.com/kosuge/items/59edc482c035073684d6)」で知りました。ところが私のMac/iPhone環境ではうまく動作させられず、かなり時間を使ってしまいました。

この文書は以下のような人向けに設定手順などを説明する事が目的です。

* 手元に使っていない RTX1210 がある（重要）
* IKEv2 が必要（Android 12 以降は L2TP/IPSec 非対応だから、等）
* クライアントに Mac / iPhone がある
（Android では標準的な設定で動くと思います。Mac/iOS機器対応が不要な方はこの文書ではなく [こちら](https://www.rtpro.yamaha.co.jp/RT/docs/ipsec/ikev2_ras/index.html) をどうぞ。）
* クライアント（Mac/iPhone など）に専用 VPN アプリを入れたくない（各 OS の標準的な手続きで動作させたい）

## 時間を最小限にしたい慣れた方への極端な要約

* macOS / iOS の VPN クライアント設定は DH group 14 (MODP 2048 bit) を使うように設定する必要あり
* その設定はmacOS標準の VPN クライアント設定画面からはできず、Apple Configurator を使って Profile を作り、Mac/iPhoneにインストールして使う
* RTX1210 の IKEv2 では同一ユーザが複数の VPN セッションを張ることができないので、もし複数機器から同時に使う場合は（remote name を user01, user02 などと違えた）複数のトンネル設定を RTX 側に設定し、それに対応する Profile を個別に作って使う
（RTXのファームウェアは事前共有鍵しか対応していない。MacではVPN操作画面で user01 などと出ている部分を書き換えて接続操作できるように見えるが、不思議なことにそれでは機能しない。iOSでは書き換え操作がそもそもできない。）

## 実現する構成

やりたいことはこんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132859/de50b316-237c-447f-b5bf-e328c3d059a4.png)

* 職場に固定グローバル IP アドレスでインターネット接続された gateway router がある
* そのルータ以下のネットワーク（グローバルアドレス）に、本番用サーバと NAT BOX がある（正確には NAPT だが以下 NAT と表記）
* NAT 以下のプライベート・ネットワークに開発用サーバがある
* 自宅（など）からインターネットごしに開発用サーバにアクセスしたい
* そのために RTX1210 をリモートアクセスゲートウェイとして設置し、外部から IKEv2 でプライベートネットワークを手元の機器に延長する

### 資料

* [ファームウェア配布ページ](https://www.rtpro.yamaha.co.jp/RT/firmware/index.php) (YAMAHA)
（RTX1210は特定のロットで「RTX1210 不具合対策のご案内 - RTX1210におきまして、ファームウェア更新後に起動しなくなるなどの不具合が発生することが判明いたしました」というすごいアナウンスが出ています。ご注意下さい。）
* [リモートアクセスVPN(IKEv2)の設定手順](https://www.rtpro.yamaha.co.jp/RT/docs/ipsec/ikev2_ras/index.html) (YAMAHA)
* [製品ページの設定例](https://network.yamaha.com/products/routers/rtx1210/setting#tab) (YAMAHA)
* [YAMAHAルータでリモートアクセスVPN(IKEv2)に対応する](https://qiita.com/kosuge/items/59edc482c035073684d6) (@kosuge, Qiita)


## ゲートウェイ（RTX 1210）側

### config 例

私がいま動かしている config 情報を出しておきます。

```
# show config 
# RTX1210 Rev.14.01.42 (Fri Jul  5 11:17:45 2024)
（login timer などネットワーク設定と関係ない前半部分は省略）
ip route default gateway 192.168.12.1
ip local forward filter 200
ip lan1 address 192.168.12.151/24
ip lan1 proxyarp on
ip lan2 address 60.xxx.xxx.19/29
tunnel select 1
 tunnel template 2-3
 description tunnel ylb01
 tunnel encapsulation ipsec
 ipsec tunnel 1
  ipsec sa policy 1 1 esp
  ipsec ike version 1 2
  ipsec ike keepalive log 1 off
  ipsec ike keepalive use 1 on rfc4306 10 3
  ipsec ike local id 1 60.xxx.xxx.19
  ipsec ike log 1 payload-info
  ipsec ike local name 1 ylbvpn fqdn
  ipsec ike nat-traversal 1 on
  ipsec ike pre-shared-key 1 text xxxxxx
  ipsec ike remote name 1 ylb01 fqdn
  ipsec ike mode-cfg address 1 1
  ipsec auto refresh 1 off
 tunnel enable 1
tunnel select 2
 description tunnel ylb02
tunnel select 3
 description tunnel ylb03
ip filter 100 pass-log 60.xxx.xxx.19 * icmp * *
ip filter 101 pass-log 60.xxx.xxx.19 * udp 500 *
ip filter 102 pass-log 60.xxx.xxx.19 * udp 4500 *
ip filter 103 pass-log 60.xxx.xxx.19 * tcp 22 *
ip forward filter 200 1 gateway 60.32.109.17 filter 100 101 102 103
nat descriptor type 1 masquerade
nat descriptor masquerade static 1 1 192.168.12.151 esp
nat descriptor masquerade static 1 2 192.168.12.151 udp 500
nat descriptor masquerade static 1 3 192.168.12.151 udp 4500
ipsec ike remote name 2 ylb02 fqdn
ipsec ike remote name 3 ylb03 fqdn
ipsec ike mode-cfg address pool 1 192.168.12.152-192.168.12.159/24
syslog debug on
dns server 192.168.12.1
#    
```

これ以降、少し説明しておきます。

#### 接続ポートとアドレス

* RTX の LAN1 ポートがプライベートネットワークにつながっている
* RTX 自身のプライベートネットワーク側アドレスは 192.168.12.151
* RTX の LAN2 ポートがグローバルネットワークにつながっている
* RTX 自身のグローバルネットワーク側アドレスは 60.xxx.xxx.19

#### プライベートネットワークとVPNとのすり合わせ

* NAT以下のプライベートネットワークは 192.168.12.0/24
* デフォルトゲートウェイは 192.168.12.1
（VPN クライアント(Mac/iPhone)の全てのトラフィックが VPN 経由となるため、出口はこのようになる）
* DNS サーバも NAT BOX 経由で聞くので 192.168.12.1

#### IPsec IKEv2 トンネル設定

* local id は 60.xx.xxx.19 つまりグローバル側のアドレス
（RTX にとっての「ローカル側」はグローバル側）
* local name は適当な文字列（fqdnとあるが「 . 」などは無くても問題ない）
* VPN クライアントのIPアドレスはアドレスプール 1 から割りあてる
（see; ipsec ike mode-cfg address 1 1）
* アドレスプール 1 は192.168.12.152から 159 までとする
（see; ipsec ike mode-cfg address pool 1 192.168.12.152-192.168.12.159/24）

### 複数台の同時並行接続

本来 IKEv2 では一人のユーザが複数セッションを張れるのですが、RTXの実装は一つのトンネル設定について同時に一つのセッションしか許されません。そこで複数台の機器から同時に接続するために、remote name の異なる複数のトンネル設定を用意しておきます。

* トンネル1 を設定し、2, 3 のひな形とする
（see; tunnel template 2-3）
* トンネル名は ylb01 とする（トンネル2, 3 を展開する際に，その下に個別に書いた ylb02, 03 で上書きされる）
* remote name はトンネル1は ylb01、トンネル2は ylb02... とする（上と同じく個別に書いた ylb02, 03 で上書きされる）
（see; ipsec ike remote name 2 ylb01 fqdn）

例えば私は自分のMacを「ローカルID」に ylb01 を指定して接続し、同僚は ylb02 を使う、といったことをすれば二つの機器が VPN セッションを並行して張れます。

なお、もし二台の機器が同じ接続情報でもう一つ並行にVPN接続しようとすると、エラーログに ```Config Attribute: That user name and address already exists``` と出ます。以下に show log reverse コマンドの表示の該当箇所を挙げておきます。なお reverse 順に出していることに注意してください。

```
2025/04/30 18:33:25: [IKE2] Config Attribute: mode-cfg set error
2025/04/30 18:33:25: [IKE2] Config Attribute: address exhaustion
2025/04/30 18:33:25: same message repeated 7 times
2025/04/30 18:33:25: [IKE2] Config Attribute: That user name and address alread
y exists
```

（アドレスを使い切った的なメッセージが出ていますが、正常に接続できた場合はちゃんとアドレスプールから取り出して使えています。）

### VPNトラフィックをグローバル接続側ルータに出す

macOSもiOSも、VPN 接続後は「**全トラフィックを VPN 経路に流し込む**」ようになります。RTX 側ではこの VPN を抜けて流れ込んできた「プライベートネットワーク向けではない」トラフィックは、プライベートネットワーク用のルータに送る必要があります。
ところがこれを ip route deafult gateway でプライベートネットワーク用のルータ（NAT BOX）に振り向ける方法でたいおうすると、VPN を実現するための（クライアントとRTXの間で往復すべき）パケットまでがそちらに向かってしまい、RTX から直接返ってこなくなります。これでは VPN 接続が機能しません。（そもそも最初にVPN接続しようと思ってRTXにパケットを送っても返事が NAT BOX のアドレスを付けて返ってくるので、VPN接続を開始できません。）

と言うわけで、RTX が直接クライアントと話すVPNのためのトラフィックについては、RTXの上流ルータ（冒頭の図の gateway router）に送るようにします。

以下に関係する設定記述をまとめてコメントしておきます。（参考：[blogの辺境](https://riku-zen.cocolog-nifty.com/blog001/2018/04/rtx1100wanurl-d.html)）

```shell
# 全体としてはプライベートネットワークの gateway（冒頭の図のNAT）に送る
ip route default gateway 192.168.12.1
# RTX自身が発するパケットを対象とするためのフィルタを用意
ip local forward filter 200
# RTX自身を source IP にもつ VPN 用トラフィック（とICMP, SSH）を対象とするフィルタを用意
ip filter 100 pass-log 60.xxx.xxx.19 * icmp * *
ip filter 101 pass-log 60.xxx.xxx.19 * udp 500 *
ip filter 102 pass-log 60.xxx.xxx.19 * udp 4500 *
ip filter 103 pass-log 60.xxx.xxx.19 * tcp 22 *
# 上記100〜103フィルタに合致したパケットを RTX の上流ルータへ
ip forward filter 200 1 gateway 60.xxx.xxx.17 filter 100 101 102 103 
```
#### クライアント側で処理できないか？

クライアント側にしてみれば、「全トラフィックをVPN経路に出す」とは単に Mac や iPhone のデフォルトルートが ipsec トンネルになる、という話です。これを route コマンドなどを使って変更することで対応することもできるとは思います。つまりプライベートネットワークへのトラフィックだけ VPN 経路になるようにして、それ以外のトラフィックは各クライアントの VPN 接続前のデフォルトルートに出すよう、route コマンドなどを使ってクライアント側で操作するのです。

なお、それとは別に、L2TP の VPN 接続設定には「オプション」の欄に「すべてのトラフィックをVPN接続経由で送信」するかどうかを選ぶスイッチが用意されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132859/18ee3f8f-4e5a-42dd-bb12-e307dca184dd.png)

しかし IKEv2 の接続設定にはそうした設定がありません。クライアント側の設定についてより詳細な項目が調整できる Apple Configurator （後述）にもありません。その関連資料である [Device Management の IKEv2 セクション](https://developer.apple.com/documentation/devicemanagement/vpn/ikev2-data.dictionary) の IncludeAllNetworks 項目がどうやらそれっぽいのですが、手作業でプロファイルに追加してもうまく機能しませんでした。

## クライアント（macOS/iOS）側

ところで上に示した config をRTXに入れ、Mac の VPN 設定画面を使って以下のように設定を作っても接続はできません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132859/6c289b3c-6aae-4d26-8cd3-c7736563e8d6.png)

### エラー

分かりやすさのために、[リモートアクセスVPN(IKEv2)の設定手順](https://www.rtpro.yamaha.co.jp/RT/docs/ipsec/ikev2_ras/index.html) などを見て私が作成した RTX 側の config を以下に示します。これに対応するよう Mac の標準 VPN 設定画面を操作して接続しようとしたのですが、エラーになりました。ここから今回の長い旅が始まったわけです。。。

```
tunnel select 1
 description tunnel iPhone
 tunnel encapsulation ipsec
 ipsec tunnel 1
  ipsec sa policy 1 1 esp
  ipsec ike version 1 2
  ipsec ike keepalive log 1 off
  ipsec ike keepalive use 1 on rfc4306 10 3
  ipsec ike local name 1 60.xxx.xxx.19 ipv4-addr
  ipsec ike pre-shared-key 1 text xxxxxxxxx
  ipsec ike remote name 1 example.com fqdn
  ipsec ike mode-cfg address 1 1
  ipsec auto refresh 1 off
 tunnel enable 1
 ```

エラーは以下のようなものです。なおログ情報は、```syslog debug on```　と　```ipsec ike log 1 key-info``` （1 は上記の設定例に合わせた gateway ID）あたりを設定しておくと多めに出ます。なお初めに示した私の config はほぼこれに基づいており、同じエラーが出ます。

```
# show log reverse 
2025/04/28 16:04:16: [IKE2] SA:2/IKE established
2025/04/28 16:04:16: [IKE2] GW:*/SA:2/INIT no NAT box detected at local side
2025/04/28 16:04:16: [IKE2] GW:*/SA:2/INIT NAT box detected at remote side
2025/04/28 16:04:16: [IKE2] GW:*/SA:2/INIT cannot accept KE payload
2025/04/28 16:04:16: [IKE2] GW:*/SA:2/INIT no NAT box detected at local side
2025/04/28 16:04:16: [IKE2] GW:*/SA:2/INIT NAT box detected at remote side
2025/04/28 16:04:16: [IKE2] GW:*/SA:2/INIT exchange started
2025/04/28 16:04:16: [IKE2] SA:2/IKE temporarily assigned
2025/04/28 16:04:16: [IKE2] SA:1/IKE established
2025/04/28 16:04:16: [IKE2] GW:*/SA:1/INIT no NAT box detected at local side
2025/04/28 16:04:16: [IKE2] GW:*/SA:1/INIT NAT box detected at remote side
2025/04/28 16:04:16: [IKE2] GW:*/SA:1/INIT cannot accept KE payload
2025/04/28 16:04:16: [IKE2] GW:*/SA:1/INIT no NAT box detected at local side
2025/04/28 16:04:16: [IKE2] GW:*/SA:1/INIT NAT box detected at remote side
2025/04/28 16:04:16: [IKE2] GW:*/SA:1/INIT exchange started
2025/04/28 16:04:16: [IKE2] SA:1/IKE temporarily assigned
```

```cannot accept KE payload``` 、つまり Key Exchange (鍵交換)に失敗しています。（NATのメッセージは気にしなくて良いです）

調べたところ、どうやら macOS/iOS は Diffie-Hellman (DH) に group 19 や 20 といった楕円曲線系のもの（[参考](https://www.watchguard.com/help/docs/help-center/ja-JP/Content/en-US/Fireware/bovpn/manual/diffie_hellman_c.html)）を提案してくるようです。（と書きつつも macOS/iOS が提示する DH group の優先順に関する公的な資料は見つからず、裏が取れていません。）

一方で RTX 側は DH group 2, 14 あたりの MODP 系にしか対応していません。（参考：[15.24 IKE が用いるグループの設定](https://www.rtpro.yamaha.co.jp/RT/manual/rt-common/ipsec/ipsec_ike_group.html), コマンドリファレンス）

コマンド ```ipsec ike group``` で挙がってくる最上位は modp2048 ですから、MODP 2048bit を使う group 14 をクライアント側が提案するように調整できれば良いのですが、困ったことに macOS/iOS の標準設定画面ではそうした項目が用意されていません。

### Apple Configurator

やむなく Apple Configurator を使って解決することにしました。App Store から誰でもダウンロードして使うことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132859/24ddfa93-d38c-46e1-a70a-2b7ec61e5315.png)

Apple Configurator を使うと、Mobile Device Management (MDM) 用のプロファイルを作ることができます。プロファイルでは標準 GUI 画面には含まれない、細かなパラメタを設定することができます。（Apple は標準的な GUI 画面に大量のオプションスイッチが出てくるのを嫌っているのです。）

Apple Configurator を起動するとこんなウィンドウが開きますが、今回このウィンドウには用がありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132859/dd5b2a0e-17df-4176-a291-443eafddbb0d.png)

この Apple Configurator を使って **DH group 14** のプロファイルを作ります。

#### VPN接続用プロファイルの作成

「ファイル」メニューから「新規プロファイル」を選び、出てきたウィンドウの「名前」項目を設定します。これはプロファイルのファイル名にもなりますから、何のためのものか判る名前を付けると良いです。01と連番的なものがついているのは複数台で同時接続するための用意です。（後述）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132859/23e87d4d-9346-452b-b8f7-b03baeeff8ff.png)

上の赤い矢印の「名前」の項目にプロファイルの名前を設定し、下の図の赤い矢印の「VPN」をクリックすると，以下のウィンドウが出ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132859/493ea232-4b02-4fe0-a080-bca92804305a.png)

上の図の右側中央にある「構成」ボタンをクリックすると以下のウィンドウが出ます。各種の項目を設定してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132859/559e8bf4-755c-49b4-acd6-faefec1d8978.png)

* 接続名：macOS のシステム設定画面などで表示される各 VPN アクセス項目の名前です。接続対象などが分かる名前を付けるのが良いです。
* 接続のタイプ：ここをIKEv2 にすると、その下の各種項目が表れます。
* サーバ：RTX の（グローバル側の）アドレスです。
* リモート識別子：RTX の ipsec ike local id で設定した値です。ここではクライアントの設定をしているので、クライアントから見た「リモート」とは RTX のことですあり、それは RTX 側で設定した「ローカル」の識別子、となります。
* ローカル識別子：RTX の ipsec ike remote name で設定した値です。上と同じ理由で RTX 側とで「ローカル」「リモート」が逆転しています。
* コンピュータ認証：IKEv2 では証明書を使う事が多いのですが、RTX は事前共有鍵にしか対応していません。
* 共有シークレット：RTX の ipsec ike pre-shared-key で設定した値です。

少し下の方にスクロールすると以下の「IKE SAパラーメータ」「子SAパラメータ」という項目が見えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132859/ac1ae950-a52c-4545-936a-42b434293e3f.png)

ここが**問題の箇所**、つまり DH group を指定するところで、14を設定します。といってもデフォルトが 14 になっていると思います。が、しっかり確認しましょう。なお、変更するときは「IKE SA」と「子SA」のパラメータを一致させる必要があります。（異っていると接続に失敗します）

| デフォルトが group 14? |
|:-----------|
| Apple Configurator ではデフォルトが DH group 14 になっています。あれ？19 or 20 （楕円曲線系）じゃないの？まあ Configurator のデフォルトが必ずしも Mac のデフォルトと一致しているわけではないでしょうが、ちょっと不思議な感じです。|

また、DNSサーバを空欄にすると少なくともmacOSではプロファイルのインストール（後述）に失敗する、という事象が発生しました。

ここまで設定できればあとは保存です。ファイルメニューから「保存...」を実行してください。以下のようにプロファイル名がファイル名の欄に入って保存出来る状態になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132859/fe90ec72-1ab9-4446-8c9c-5b6e1340759a.png)

#### VPN プロファイルのインストール（Mac）

作成したプロファイルを Mac にインストールしましょう。

システム設定の「プロファイル」を開きます。下の図はシステム設定の項目検索機能（上の矢印）を使って出しています。ここで「 ＋ 」ボタン（下の矢印）を押すか、プロファイルをドラッグ＆ドロップ（赤い枠の領域に）して読み込ませます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132859/d99dea97-2e51-4360-8f6d-3254e0a501d7.png)

署名が無いことの警告やパスワード入力を経て、以下の画面になるでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132859/454516fa-9110-465d-af20-428ddc329f1f.png)

これでシステム設定の項目に、このプロファイルに対応する VPN 接続設定が追加されているはずです。下の図の左側の矢印の「VPN」を選ぶと、そこにApple Configuratorで設定した「接続名」で VPN 接続の項目ができている（真ん中の矢印）はずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132859/fbb052a3-a3a3-4e88-ad5b-c876b7f37c75.png)

ここで上の図の右側の矢印のスライド（ボタン）をクリックすると、VPN接続が始まります。成功すると、以下のように「接続済み」と出るはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132859/9565dd67-5c06-4880-944e-a6619ab07776.png)

何かしら問題があるときは「接続失敗」と出ます。うまくいきますように。

#### iOS へのインストール

ちょっと書くのに疲れてきたので今回はパスします。[ここ](https://support.apple.com/ja-jp/guide/iphone/iph6c493b19/ios) にあるように、メイル送信などで iOS デバイスにプロファイル・ファイルを送り込んで読み込ませると、VPN 設定のところに項目が現れます。おそらく Mac から AirDrop で送り込むのが簡単だと思います。

#### Android へのインストール

特に構成プロファイルなどは必要なく、標準 GUI で作業するだけで簡単に設定できます。YAMAHA の「[リモートアクセスVPN(IKEv2)の設定手順](https://www.rtpro.yamaha.co.jp/RT/docs/ipsec/ikev2_ras/index.html#ex_android)」ドキュメントが助けになるでしょう。

### 複数台での同時利用

冒頭で簡単に説明しましたが、RTX1210 の IKEv2 では同一ユーザが複数の VPN セッションを張ることができません。そこで複数機器から同時に使うために、remote name を ylb01, ylb02 などと違えた複数のトンネル設定を RTX 側に設定しました。そして、それぞれの remote name に対応するプロファイルもまた個別に Apple Configurator を作って使い分けなければなりません。

ところで Mac の標準 VPN 設定画面では、先ほど作成した ylb01 用のプロフィールの詳細情報画面を見ると「ローカルID（RTXにおける remote はクライアントでの local）」のフィールドは書き換えが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132859/e6ca5f54-ee47-4634-b8e4-8cb212f9e4c6.png)

しかしここを書き換えて OK ボタンを押した後で、その接続設定を使って VPN 接続しようとしてもエラーになります。何かが不整合を起こしているようです。そして iOS ではプロファイルを読み込ませて出てくる VPN 設定では、そもそもローカル ID が出てこず、何も書き変えることができません。

と言うわけで、やはり Apple Configurator で複数のプロファイルを作成してインストールするしかないように思えます。まあ動けば良いのですけれど。。。

## おわりに

長い道のりでしたが、ともかく macOS / iOS / Android の全てで正しく動作することが確認できました。

この記事を書くにあたり、私に RTX1210 が IKEv2 対応したことを気づかせてくれた [@kosuge](https://qiita.com/kosuge/items/59edc482c035073684d6) さんに感謝します。またルータの設定などに慣れない私にとって最後の問題だった「全トラフィックを流し込む」問題を解決する設定の良い説明を置いてくださった [blogの辺境](https://riku-zen.cocolog-nifty.com/blog001/2018/04/rtx1100wanurl-d.html) さんにも感謝します。

そして最後に、思い出したように RTX に IKEv2 対応ファームウェアを出してくださった YAMAHA の皆さん、ありがとうございました。これで長いこと使い続けてきた SonicWall がいつ壊れても安心です。ああよかった。