YAMAHA RTX1300 でJPNE v6プラスのMAP-Eと固定IPv4アドレスを併用する

別の記事「[YAMAHA RTX1300 でtransixのDS-LiteとZOOT NATIVEの固定IPv4アドレスを併用する](https://qiita.com/chibiegg/items/38ff83116b01d9de1149)」のMAP-E版です。

前回はインターリンクのZOOT NATIVEを契約し、transixのDS-Liteと固定IPを併用する解説をしました。

しばらくそのまま利用していたのですが、ZOOT NATIVEの転送料制限にかかってしまったのでプロバイダを変えてみることにしました。

今回はCyberBBの「光クロス＋IPv4固定IP」を契約します。こちらはインターネットマルチフィードのtransixではなく、JPNEのv6プラスを利用したサービスになります。
transixではIPv4 over IPv6はDS-Lite方式(IPIPトンネル)でしたが、v6プラスではMAP-E方式になります。
固定IPについては違いはなくどちらもIPIPトンネル方式です。

この記事では、フレッツ光 クロスをRTX1300で収容し、IPv6とIPv4の通信、およびL2TP/IPsecを利用した外部からのリモートアクセスVPNを利用する設定を紹介します。

RTX1300とフレッツ 光クロスを利用していますが、RTX1220やフレッツ 光ネクストでも同様に利用可能と思われます。
MAP-Eに対応しているのは [一部機種](http://www.rtpro.yamaha.co.jp/RT/docs/v6plus/#support) だけなので注意してください。
固定IPだけを利用するにはこれらの機種でない (MAP-Eに対応対応していない) 機種でも動作します。

# 今回やること

改めて本記事で紹介する内容を以下に整理します。

* フレッツ 光クロスのONUはLAN3、端末はLAN1に接続されていることとする
* ルーターのIPアドレスは192.168.100.1/24とする
* RTX1300でフレッツ光 クロスを収容し、CyberBBの固定IPv4を利用する
* 外からのL2TP/IPsec VPNの終端には割り当てられた固定IPv4アドレスを利用する
* 宅内からのインターネット接続は固定IPv4アドレスを利用せずにv6プラス MAP-Eを利用する

この構成を実現するためにRTXに設定することは以下の通りです。

* IPv6のプレフィックスをフレッツからDHCPv6で受け取りLAN1で使えるようにする
  * フレッツからは `/56` のプレフィックスが割り当てられるため、そのうちの `/64` を一つ使う 
* tunnel1 にMAP-Eの設定を行う
* tunnel2 に固定IPv4アドレスの設定を行う
  * 合わせてIPv6アドレスをJPNEに通知するためのLuaスクリプトも設置する 
* IPv4ルーティングテーブルの設定
    * 固定IPv4を発信元とするパケットはtunnel2、それ以外はtunnel1をデフォルトゲートウェイとする
* L2TP/IPsecの設定を行う

# 設定を行う

## IPv6アドレスの設定

LAN3でDHCPv6を受け取り、宅内の端末で使うIPv6アドレスとしてLAN1には `dhcp-prefix@lan3::1:0:0:0:1/64` を割り当て、LAN3には固定IPv4アドレスのIPIPトンネル終端用として `dhcp-prefix@lan3::006f:6d48:d100:0000/64` を割り当てます。

:::note warn
LAN3に割り当てるIPv6アドレスはCyberBBからの開通メールに記載されている「インターフェースID」である必要があります。
:::


```
ngn type lan3 ntt
ipv6 route default gateway dhcp lan3
ipv6 lan3 address dhcp-prefix@lan3::006f:6d48:d100:0000/64
ipv6 lan3 dhcp service client
dns server dhcp lan3

ipv6 prefix 1 dhcp-prefix@lan3::1:0:0:0:1/64
ipv6 lan1 address dhcp-prefix@lan3::1:0:0:0:1/64
ipv6 lan1 rtadv send 1 o_flag=on
ipv6 lan1 dhcp service server
```

## tunne1 の設定

MAP-Eの場合には `tunnel encupsulation map-e` を指定します。
`tunnel endpoint address` の指定は不要です。

transixと異なり、NATの設定も必要です。

参考 : [v6プラス対応機能 | 設定例 2 : IPv6/IPv4 インターネットサービス DHCPv6-PD](http://www.rtpro.yamaha.co.jp/RT/docs/v6plus/#setting2)

```
tunnel select 1
 description tunnel v6Plus
 tunnel encapsulation map-e
 ip tunnel mtu 1460
 ip tunnel nat descriptor 100
 ip tunnel tcp mss limit 1420

nat descriptor type 100 masquerade
nat descriptor address outer 100 map-e
```


## tunnel2 の設定

`2404:9200:225:100::65` はCyberBBからの開通メールに記載されている「BRアドレス」(Border Relay アドレス) です。


```
tunnel select 2
 description tunnel "Static IPv4"
 tunnel encapsulation ipip
 tunnel endpoint address 2404:9200:225:100::65
 ip tunnel mtu 1460
 ip tunnel nat descriptor 1
 ip tunnel tcp mss limit auto
 tunnel enable 2
```

固定IPアドレスについてはNATをルーターで行う必要があるため、こちらもNATディスクリプタを設定しています。

割り当てられた固定IPv4アドレスはここで指定します。 `111.109.XXX.XXX` の部分にはCyberBBのメールに記載された「IPアドレス」を指定してください。

```
nat descriptor type 1 masquerade
nat descriptor address outer 1 111.109.XXX.XXX
```

### JPNEにIPv6アドレスを通知するluaスクリプト

以下のスクリプトを手元のPCに `v6plus.lua` として保存します。
この時、アップデートサーバのURLやユーザー名、パスワードはCyberBBからの開通メールに記載された情報を利用してください。


```v6plus.lua
----------------------------------------
-- 設定値                             --
----------------------------------------
-- アップデートサーバーのURL
UPD_SV = "http://fcs.enabler.ne.jp/update"

-- ユーザー名
USERNAME = "XXXXXXXXX"

-- パスワード
PASSWORD = "YYYYYYYYY"

-- SYSLOGのレベル
LOG_LEVEL = "info"

-- SYSLOGのプレフィックス
LOG_PFX = "[v6plus]"

-- ステートレスDHCPv6でDNS情報を取得するコマンド
DHCPv6_IR_CMD = "ipv6 lan3 dhcp service client"

----------------------------------------
-- SYSLOGを出力する関数               --
----------------------------------------
function logger(msg)
  rt.syslog(LOG_LEVEL, string.format("%s %s", LOG_PFX, msg))
end

----------------------------------------
-- メインルーチン                     --
----------------------------------------
local log, result
local req_t = {}
local res_t


-- HTTPリクエストの準備
req_t.url = string.format("%s?user=%s&pass=%s", UPD_SV,
                          USERNAME, PASSWORD)
req_t.method = "GET"

-- HTTPリクエストを実行
res_t = rt.httprequest(req_t)

if res_t.rtn1 then
    -- アップデートの結果をログに出力する
    if res_t.code == 200 then
        result = "successfully"
    else
        result = "failed"
    end

    log = string.format("Update %s (code=%d)", result, res_t.code)
    logger(log)
else
    -- リクエストの応答がない場合、DNS情報が取得できていない可能性があるため
    -- DNS情報を再取得する
    rt.command(DHCPv6_IR_CMD)

    logger("Update failed")
end

```

これをSFTPでRTXの `/scripts/transix.lua` としてアップロードします。

```
sftp 192.168.100.1
mkdir scripts
cd scripts
put v6plus.lua
```

このLuaスクリプトを毎分実行するように設定しておきます。

```
schedule at 1 */* *:*:10 * lua -- /scripts/v6plus.lua
```


## IPv4ルーティングテーブルの設定

通常のパケットは tunnel1 をデフォルトゲートウェイとして利用しますが、 ルーター自身 (192.168.100.1) が発信元となるパケットは `111.109.XXX.XXX` を利用するためにtunnel2を経由するように設定します。

これを実現するためにポリシーベースルーティングを設定します。

```
ip filter 1001 pass 192.168.100.1 * * * *
ip route default gateway tunnel 2 filter 1001 gateway tunnel 1
```


## L2TP/IPsecの設定を行う

L2TP/IPsecの設定については通常通りです。
参考 : [L2TP/IPsecを使用したリモートアクセス : ルーター コマンド設定](https://network.yamaha.com/setting/router_firewall/vpn/vpn_client/vpn-smartphone-setup_rtx1200#config2)

```
pp select anonymous
 pp bind tunnel100
 pp auth request mschap-v2
 pp auth username hoge hogepassword
 ppp ipcp ipaddress on
 ppp ipcp msext on
 ppp ccp type none
 ip pp remote address pool dhcp
 ip pp mtu 1258
 pp enable anonymous

tunneua select 100
 tunnel encapsulation l2tp
 ipsec tunnel 100
  ipsec sa policy 100 100 esp aes-cbc sha-hmac
  ipsec ike keepalive use 100 off
  ipsec ike local address 100 192.168.100.1
  ipsec ike log 100 key-info message-info payload-info
  ipsec ike nat-traversal 100 on
  ipsec ike pre-shared-key 100 text examplepsk
  ipsec ike remote address 100 any
 l2tp tunnel disconnect time off
 l2tp keepalive use on 10 6
 ip tunnel tcp mss limit auto
 tunnel enable 100

l2tp service on
ipsec auto refresh on
ipsec transport 100 100 udp 1701

nat descriptor masquerade static 1 11 192.168.100.1 esp
nat descriptor masquerade static 1 12 192.168.100.1 udp 500
nat descriptor masquerade static 1 13 192.168.100.1 udp 4500
nat descriptor masquerade static 1 14 192.168.100.1 udp 1701

ip lan1 proxyarp on
```

# まとめ

CyberBBの「光クロス＋IPv4固定IP」を利用することで、フレッツ光 クロスでもIPv6、IPv4、リモートアクセスVPNをつかうことができました。