Edgerouter (ER-X) で DS-lite だけしてみる (ひかり電話なし)

苦労に苦労を重ねた IPoE化ですが、少しずつ記録を残しておきます。

# 前提条件

IPoEとして利用できる条件が整っていることが条件ですね。ご存知でしょうけど。

- フレッツ光クロス、フレッツ光ネクスト、またはフレッツ光ライトなど NTT東日本・西日本のNGN回線引き込み済み
- 「フレッツ・v6オプション」契約済み
- DS-lite利用可能なIPoEプロバイダ(IIJ/Interlink/BB.Exceite/ぷららなど)に契約済み

なお、今すでに`PPPoE`を使っている状況の利用でも問題なく設定できます。安心して設定してください。また、WAN側(我が家ではeth0)にIPv4のアドレスを振っておく必要はありません。振っててもいいです。好きにしてください。

# この設定でできること

`IPoE`でIPv4接続ができるようになります。IPv6通信はまだできません。

この図でいうとオレンジに囲われた「ココ」の部分を実現します。

<img width="1099" alt="Screen Shot 2020-05-04 at 11.36.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37263/77f3a316-1cb5-b9ce-0511-0f8c707d21b9.png">

# IPv6アドレスの取得

まず、なにはともあれ IPv6アドレスを確認しましょう。以後の設定は、先程の図の通りWAN側を`eth0`、LAN側は`eth1`〜`eth4`を束ねた`switch0`として扱います。また、すべて`CLI`で実行します。`Edgerouter`のOSである`EdgeMax`ではIPv6の設定が、GUIからはちょっとやりにくい(できないとは言っていない)ので、コピペですんで確実なCLIでの操作にしています。大丈夫、1日格闘すれば覚えます。

さて、`ssh`でログインしたらば、次のコマンドを実行します。

```bash
configure
set interfaces ethernet eth0 ipv6 address autoconf
commit; exit
```

これで10分程待つと、IPv6アドレスが振られるはずです。我が家ではこんな感じです。`show interfaces` コマンドを実行してみましょう。ここで`eth0`にIPv6アドレスが振られていれば成功です。`ひかり電話`がないので `/64` でアドレスが振られています。このIPv6アドレスが重要ですので、コピペできるようにしておきましょう。

```bash
$ show interfaces
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface    IP Address                        S/L  Description
---------    ----------                        ---  -----------
eth0         2409:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/64
                                               u/u  Internet
eth1         -                                 A/D  disabled
eth2         -                                 u/u  Local
eth3         -                                 u/u  Local
eth4         -                                 A/D  disabled
lo           127.0.0.1/8                       u/u
             ::1/128
switch0      xxx.xxx.xxx.xxx/24                u/u  Local
```

次にIPv6のデフォルトゲートウェイを知ります。個人的には `ip -6 route | grep default` のが分かりやすい気がしないでもないですが、`VyOS`っぽく知るには、このパターンです。

```bash
$ show ipv6 route  | grep '::/0'
K      ::/0 [1/0] via fe80::xxxx:xxxx:xxxx, eth0, 01w4d14h
```

さて、設定としてはこれで終わらせても良いですが、Edgerouter の再起動時などにIPv6アドレスが付与されるまで 10分程度も待てない、ということであれば静的割当しておくことも一つの方法です。ただし、NTT局内工事などでIPv6アドレスの割り振りが変わる可能性もあります。普段はほぼほぼ再起動するようなこともないでしょうし、あまり気にしなくても良い気はしますが、それでも静的割当しておきたいという方は、次のようにします。

## IPv6アドレスの静的割当 (やりたい方だけ)

まず、IPv6アドレスの自動割当を削除します。

```bash
configure
delete interfaces ethernet eth0 ipv6
commit; exit
```

次に、今割り当てられているIPv6アドレスを消し去ります(付与されたままだと、IPアドレスの静的割り当てができません)。

```bash
$ sudo ip addr flush dev eth0
```

※ IPv4アドレスを割り振ってると、それも一緒にここで吹き飛びますから気をつけてください

あとは、先程確認したIPv6アドレスとデフォルトゲートウェイアドレスと個々に割り当てます。

```bash
configure
set interfaces ethernet eth0 address '2409:****:****:****:****:****:****:****/64'
set protocols static route6 ::/0 next-hop 'fe80::xxxx:xxxx:xxxx' interface eth0
commit; exit
```

# DS-lite 用の IPv4 over IPv6 トンネルの設定

ここで事前に知っておくべきは 2点。

1. local-ip = Edgerouter eth0 に割り当てられた IPv6アドレス (/64不要)
2. remote-ip = NTT東日本・西日本ごとに割り当てられたAFTRのIPv6アドレス (次表を参照のこと)

NTT東日本エリア | NTT西日本エリア
|:----:|:----:|
2404:8e00::feed:100|2404:8e01::feed:100
2404:8e00::feed:101|2404:8e01::feed:101

AFTRのアドレスは2つありますが、どちらか一方を指定すればよいです。

#### IPv6 トンネル最小限度の設定

```bash
configure
set interfaces ipv6-tunnel v6tun0 encapsulation ipip6
set interfaces ipv6-tunnel v6tun0 local-ip '2409:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx'
set interfaces ipv6-tunnel v6tun0 mtu 1452
set interfaces ipv6-tunnel v6tun0 multicast disable
set interfaces ipv6-tunnel v6tun0 remote-ip '2404:8e00::feed:101'
set interfaces ipv6-tunnel v6tun0 ttl 64

set protocols static interface-route 0.0.0.0/0 next-hop-interface v6tun0
commit; exit
```

以上で完了です。トンネル経由しているとは言え、まれにIPv4で攻められる時があるので(なんでや)、Firewall の設定をしておくことをオススメします。もし既に IPv4向けのFirewall設定をしていれば、それをそのまま再利用できます。今 eth0 に割り当てられているFireWallを`v6tun0`に割り当てればそれで良しです。

# PPPoEからの移行

ここまでで、`DS-lite`の定義は完了です。こわがらずに `PPPoE`の定義を削除しましょう。

```bash
configure
delete interfaces ethernet eth0 pppoe
commit; exit
```

これで、無事に切り替わるはずです。わたしは躊躇してこのPPPoE設定を外せずにいたため、ずーっと`IPoE`に切り替えられずに1日悩みこみました。ホント、なんてこったい。

事の顛末は「[せっかくのIPoE化もDS-liteの制限で台無しだったので、代替策を考えた](https://note.com/sho7650/n/n5a00e1a582bf)」にありますので、こちらも気分転換にどうぞ。

# 参考リンク

- [EdgeRouter設定メモ: IPv6/IPoE + DS-Liteでインターネット高速化](http://stop-the-world.hatenablog.com/entry/2018/11/05/135911)
- [DS-Liteをとりあえず試すために1NICで接続環境を作る](https://qiita.com/garupon/items/243b91396182a36c02d1)
- [Edgerouter Lite-3でDS-Lite](https://qiita.com/haccht/items/17ed2bed628d2fd17bea)
- [RTNETLINK answers: File exists が出てしまった時の対処方法](https://app.getpocket.com/read/2952463764)