YAMAHA RTX1300 でtransixのDS-LiteとZOOT NATIVEの固定IPv4アドレスを併用する

別の記事「[YAMAHA RTX1300 でJPNE v6プラスのMAP-Eと固定IPv4アドレスを併用する](https://qiita.com/chibiegg/items/917938295f1aad81c3b3)」にMAP-E版を掲載しました。


ヤマハの家庭向けVPNルーターであるRTXシリーズに10ギガビットに対応したRTX1300が登場し、フレッツ 光クロスをこれまで通りの構成で活用できるようになりました。

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

RTX1300とフレッツ 光クロスを利用していますが、RTX1210やフレッツ 光ネクストでも同様に利用可能と思われます。

# まえおき

外から自宅のネットワークにVPN接続をするためには固定でなくていいのでグローバルIPv4アドレスがルーターに付いている必要があります。
これまではフレッツ 光ネクストを利用しており、プロバイダにはIIJのFiberAccess/NFを利用していたため、VPN接続のためのグローバルIPアドレスはIPv4 PPPoEで割り当てられるグローバルIPを利用していました。

しかしながら、IIJのFiberAccess/NFはフレッツ 光クロスには対応しておらず、プロバイダを変更することになります。

## PPPoE対応プロバイダ

2023年3月現在のフレッツ 光クロスの東日本におけるPPPoE対応プロバイダは以下の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73788/ee49cbfc-ac86-31ea-386e-83cbebb8b2bf.png)

https://flets.com/sch_provider/pvd_view.php?type=CROSS_PPPoE&pref=tokyo

これまで通りIIJを利用しようと思うと ＩＩＪ　ＦｉｂｅｒＡｃｃｅｓｓ／Ｆサービス になりますが、高くて躊躇しました。

いつもJANOGの展示ブースがちかいGLBBさんもやっていますが、料金がわかりませんでした。

ということで、PPPoEを利用するのはあきらめて、IPoEのみに対応したプロバイダから選んでいきます。

## IPoE対応プロバイダ

2023年3月現在の対応プロバイダは以下の通りでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73788/625c6156-73fd-2795-9170-11fc7506913f.png)

https://flets.com/sch_provider/pvd_view.php?type=CROSS&pref=tokyo

ここで、私が欲しい要件は次のとおりです。

* MAP-EではなくDS-Lite方式のIPv4 over IPv6サービスを提供していること (好みの問題)
* 固定IPv4が提供されていること

この条件を満たし、価格が高くないプロバイダということで、インターリンクのZOOT NATIVE (IPv4固定IP1個) を利用することにしました。

https://www.interlink.or.jp/service/zootnative/koteiip.html

* IPv6はIPoEでそのままインターネットに出ていく (transix経由)
* 割り当てられて固定IPv4アドレスはIPIPトンネル (IPv4 over IPv6) でトンネル終端装置からインターネットに出ていく

また、ここには書かれていませんが、固定IPv４アドレスを使う場合にも、これまで通りの transix DS-Lite も利用できます。

:::note warn
ZOOT NATIVEでは転送料制限があり、一定量以上の通信を行った場合二週間に渡って100Mbpsの制限がかけられます。
目安は1日あたり50GB以下だそうです。

(2023年4月時点)
:::


# 今回やること

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

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

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

* IPv6のプレフィックスをフレッツからDHCPv6で受け取りLAN1で使えるようにする
  * フレッツからは `/56` のプレフィックスが割り当てられるため、そのうちの `/64` を一つ使う 
* tunnel1 にDS-Liteの設定を行う
* tunnel2 に固定IPv4アドレスの設定を行う
  * 合わせてIPv6アドレスをインターリンクに通知するための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::feed/64` を割り当てます。

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

> Subject: ZOOT NATIVE IPv4固定IP1個サービス 登録完了のご案内
> (省略)
> 　【インターフェースID】　::feed (0000:0000:0000:feed)
> (省略)


```
ngn type lan3 ntt
ipv6 route default gateway dhcp lan3
ipv6 lan3 address dhcp-prefix@lan3::feed/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 の設定

`tunnel endpoint address` で指定するAFTRのアドレスはNTT東西で異なります。 `2404:8e00::feed:100` このアドレスは東日本のAFTRのひとつです。

参考 : [transixのIPv4接続（DS-Lite）でインターネット接続 ルーターの設定例：ひかり電話契約ありの場合](https://network.yamaha.com/setting/router_firewall/ipv6/ds-lite#contract)

```
tunnel select 1
 description tunnel DS-Lite
 tunnel encapsulation ipip
 tunnel endpoint address 2404:8e00::feed:100
 ip tunnel tcp mss limit auto
 tunnel enable 1
```

DS-LiteではNATをルーターでは行わないため、NATの設定は不要です。

## tunnel2 の設定

`2404:8e00::feed:141` はインターリンクからの開通メールに記載されている「固定IPトンネル終端装置 IPv6アドレス」です。

> Subject: ZOOT NATIVE IPv4固定IP1個サービス 登録完了のご案内
> (省略)
> 　【固定IPトンネル終端装置 IPv6アドレス】　2404:8e00::feed:141
> (省略)

```
tunnel select 2
 description tunnel "Static IPv4"
 tunnel encapsulation ipip
 tunnel endpoint address 2404:8e00::feed:141
 ip tunnel nat descriptor 1
 ip tunnel tcp mss limit auto
 tunnel enable 2
```

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

割り当てられた固定IPv4アドレスはここで指定します。 `217.178.XXX.XXX` の部分にはインターリンクのメールに記載された「グローバル固定IPv4アドレス」を指定していください。

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

### インターリンクにIPv6アドレスを通知するluaスクリプト

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

> Subject: ZOOT NATIVE IPv4固定IP1個サービス 登録完了のご案内
> (省略)
> 　【アップデートサーバーユーザー名】　uXXXXXXXXXX
> 　【アップデートサーバーパスワード】　YYYYYYYY
> 　【アップデートサーバーURL】　http://update.transix.jp/request
> (省略)


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

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

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

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

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

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

----------------------------------------
-- 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?username=%s&password=%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 transix.lua
```

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

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


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

通常のパケットは tunnel1 をデフォルトゲートウェイとして利用しますが、 ルーター自身 (192.168.100.1) が発信元となるパケットは `217.178.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
```

# まとめ

インターリンクのZOOT NATIVE (固定IPv4アドレスオプション) を利用することで、フレッツ光 クロスでもIPv6、IPv4、リモートアクセスVPNをつかうことができました。