フレッツのHGWと他のルーターを共存させる

# 動機

ひかり電話を使うにはHGWが必要。でもHGWでは機能不足。
HGW[^1]と他のルーター[^2]を共存させるには。

# 要件

- ひかり電話が使えること
    - SIPで内線も使えること
- 他のルーターの機能が全て使えること

# HGWのみ

![1.png](https://qiita-image-store.s3.amazonaws.com/0/104225/528a5e60-df04-dfc8-372b-beea0658f4b8.png)

- メリット: 想定された使い方のため、問題が起こらない
- デメリット: hgwは機能不足

# HGWと他のルーターを並列でつなぐ
## HGWにDHCPv6-PDクライアントをさせる

![2-1.png](https://qiita-image-store.s3.amazonaws.com/0/104225/67755326-c24e-20a2-f2f2-65efa7f9c447.png)

- メリット: routerはhgwを経由しないため、hgw性能の影響を受けない
- デメリット: IPv6はhgw経由となり、routerの機能が使えない

IPoEが使えない我が家では、routerで別拠点とフレッツの網内通信でトンネルを掘って、IPv6を使っていた。
フレッツのIPoEはDHCPv6-PDクライアント(hgw)に経路が向くが、フレッツの網内通信はDHCPv6-PDクライアント以外のルーター(router)からも使えたようだ。
結果、フレッツ網内プレフィックスと別拠点のプレフィックスでマルチプレフィックスになっていたが、longest matchで救われていたようだ。
ただ、トンネルの制約でIPv6のMTUが1280になり、[QUIC](https://ja.wikipedia.org/wiki/QUIC)が使えないという問題[^3]があったため、IPoEへ移行したいと思っていた。
後日、我が家でもIPoEが開通し、IPv6のMTUが1500となりQUICが使えるようになったが、別拠点とのトンネルも併用したい。routerでトンネルしつつ、外へはIPoEのアドレスへ[nat6](http://www.seil.jp/doc/index.html#fn/nat6/index.html)するために、以下の案を検討した。

## 他のルーターにDHCPv6-PDクライアントをさせる

![2-2.png](https://qiita-image-store.s3.amazonaws.com/0/104225/95debed5-e89e-5708-f0dd-612a5f595d34.png)

- メリット: routerの機能をIPv4/IPv6の両方で使える
- デメリット: hgwに対しDHCPv6-PDさせないフィルタが必要

HGWをVoIPアダプタ化するこの案は、[こちら](http://diary.sorah.jp/2017/02/19/flets-ngn-hikaridenwa-kill-dhcpv6pd)が大変詳しい。
hgwとrouterでのDHCPv6-PDの奪い合いを止めたいが、HGWにはDHCPv6-PDクライアントを停止する機能がないため、HGWのWAN側にDHCPv6-PDのフィルターが必要。これにより網内のRAも止まるはず。
…と思っていたが、HGW[^1]は、DHCPv6-PDが取れないと、過去にリースされたプレフィックスを、期限切れ後も使い続け、LAN側にRAしてくるようだ。プレフィックスを忘れさせるため完全初期化すると、DHCPv6-PDが通らない限り、ひかり電話を含めた全ての機能が有効にならない。[ひかり電話の設定プロトコル](http://www.voip-info.jp/index.php/%E3%81%B2%E3%81%8B%E3%82%8A%E9%9B%BB%E8%A9%B1_%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB)はIPv4で行われると思っていたのに、残念…。
この時点で、HGW性能の影響を受けない並列化をあきらめ、HGWのPPPoEパススルー機能を使った直列化を検討。


# HGWと他のルーターを直列でつなぐ
## LANにHGWを接続し、SIPクライアントの内線を使えるようにする

![3-1.png](https://qiita-image-store.s3.amazonaws.com/0/104225/104eba3c-854c-c6ae-ab57-2eefd2ac387f.png)

- メリット: 直列でありながら、local1から内線が使える
- デメリット: hgwのRAを止めるためにフィルターが必要

routerがブリッジになった瞬間、ループ発生の危うい構成。
フィルターも面倒だし、もっとスマートな解があるのでは…。

## 他のルーターのWAN側にIPアドレスを付与する

![3-2.png](https://qiita-image-store.s3.amazonaws.com/0/104225/50361f5e-b78e-277f-e9f3-82cdbc4a8ad8.png)

- メリット: フィルター不要で内線が使える
- デメリット: hgw性能の影響を受ける

HGWはDHCPv6-PDサーバーにもなるし、IPv4のスタティックルートを設定できるので、この構成が取れる。192.168.1.0/24のgatewayは192.168.0.2を設定すればよい。
routerはIPv4はPPPoEなので、WAN側にアドレスを付与していないのは盲点だった。
直列は[SEILの公式blog](https://www.seil.jp/blog/10.html)でも解説されているし、[トンネルアダプタのガイドライン](https://www.ntt-west.co.jp/open/ngn/pdf/ipv6_tunnel_adp.pdf)でも想定されているので、安心感はある。
これをしばらく使うことにした。

# 今後
## PPPoEをなくす
IPoEが開通してIPv6はPPPoE不要となったが、IPv4はPPPoE。[こちらの議論](https://m.srad.jp/story/17/02/08/0646205)などを読むと、PPPoEを終端するNTEがネックになっていそうなので、DS-LiteやMAP-EでIPv4もPPPoEから脱出したい。
## SPI
HGWのセキュリティログにSPIでいっぱいひっかかっているパケットが出るようになってしまった。Android端末に多そう。何故だ…。

# おまけ
図は[`nwdiag`](http://blockdiag.com/ja/nwdiag/)で書きました。さいこー。
Ubuntuでは`sudo apt install python-nwdiag`でインストール完了。簡単。

[^1]: 我が家では[RT-S300SE](http://web116.jp/shop/hikari_r/rt_s300se/rt_s300se_00.html)を使用
[^2]: 我が家では[SEIL/x86](http://www.seil.jp/product/seil-x86.html)を使用
[^3]: QUICとMTUの関係は[こちら](https://groups.google.com/a/chromium.org/forum/#!topic/proto-quic/uKWLRh9JPCo)参照