YAMAHA RTシリーズルーターをIPv6ネイティブ環境に接続して、v6用DNSをLAN内サーバーに設定させた話

**※6/5追記
その後コンフィグをブラッシュアップして、新しい記事 [2020年版RTXサンプルコンフィグ（RTX830導入＋いろいろ整理）](https://qiita.com/1nagawa/items/632d0da84230fd31c78a)にまとめました。そちらも合わせてご参照下さいませ。**

# 1. この記事の前提
YAMAHA RTシリーズルーターには、下記のような既知の問題があります。

* IPv6ネイティブ環境（NTTフレッツ網）に接続した際、「o_flag=1」を指定してIPv6用DNSを別に立てDHCPv6で広報しても、**IPv6の仕様に反してフレッツ指定のDNSもしくはルーター自身のリカーシブDNSが広報**されてしまいます。
* YAMAHA RTシリーズのリカーシブDNS機能は**EDNS0非対応**のままです。v6接続も増えてきた今、できれば何とかしたいですね。

# 2. 成功した内容
IPv4・v6両用のDNSサーバーをLAN内で構築し、YAMAHA RTの設定と組み合わせて、「**IPv6用DNSをフレッツ指定のDNSでもルーター自身でもなく、このLAN内DNSサーバーを使うよう構成できました**」。

* なお、そもそもYAMAHA RTシリーズで「o_flag=1」なのにステートフルなDNSサーバーの広報を受け付けない挙動が、IPv6の仕様に沿っていない上に原因不明です。
* 本記事ではその挙動を逆手に取って、最終的にLAN内サーバーをDNSとして構成できましたが、なぜこう設定するとうまく行くのかは「分からない」としか言えないところもあります。元が原因不明ですので。
* そのため、別の環境で試してもこの通りにならない可能性はあります。あらかじめご了承下さい。

# 3. やったこと

* 前提として、弊宅のフレッツ回線はひかり電話なしです。よってRA環境となります。
* また機種はRTX810です。型落ちで性能的につらくなって来てますが、弊宅は集合住宅のVDSL接続なのでOUNは100M NIC仕様、その帯域程度ならフルフルに使い切って速度90M前後まで出せる状態です。

### 3-1. YAMAHA RT(その1)

元となる設定に変わったことはありません。YAMAHA公式とかmfeedに掲載されているサンプルコンフィグがベースです。

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

フレッツでv6接続する時のテンプレですね。IPv4部分は飛ばします。
DS-Lite接続なのでトンネル設定が入ります。

```
tunnel select 1
 tunnel encapsulation ipip
 tunnel endpoint address 2404:8e01::feed:101
...
 tunnel enable 1
```

YAMAHA RTにDHCPをさせています。

```
dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope 1 ...
dhcp scope option 1 router=192.168.0.1 dns=192.168.0.2 domain=local.example.net
```

この192.168.0.2というのがLAN内DNSサーバーです。
また、domain=でローカルドメイン名「local.example.net」を設定し、端末に渡してやる方がいいと思います。多分。
**この辺りからが今回の記事のキモです（と思う）。**

### 3-2. LAN内DNSサーバー
LAN内DNSサーバーはCentOS＋PowerDNS Recursorでサクッと立てました。CentOS8.1出たばっかりですがリポジトリ揃ってますので大丈夫。
また、OSのネットワーク設定で固定IPv6アドレスを設定します。
フレッツから降ってくるprefixが例えば
`2001:db8::/64`
なら、
`2001:db8::2/64`
みたいに、「フレッツ網から降ってきたprefix＋最終オクテットを好きな数字」とかでいいでしょう。「::1」はルーターなのでそれ以外で。
PowerDNS Recursorもv6アドレスからの問い合わせに応答するよう設定します。

ここまで用意しておいて、YAMAHA RTの設定に戻ります。

### 3-3. YAMAHA RT(その2)

```
dns host lan1
dns service off
dns service fallback on
dns server 2001:db8::2
dns cache use off
dns domain local.example.net
dns notice order dhcp server
```

※1/21 コンフィグと挙動を一部修正しました。
YAMAHA RTは ~~DNSリカーシブ機能を稼働させます。~~ DNSサーバーの設定を入れますがリカーシブ機能は停止します。

* **dns domainはDHCPに設定した「local.example.net」で設定します。**
* **そしてdns serverに「さっきLAN内に立てたDNSサーバーのv6アドレス」を指定します。**


こうすると、結果的に「**YAMAHA RTはv6用DNSサーバーを広報しなくなります**」。
理由は正直よく分かりません。LAN内DNSサーバーは「グローバルなマルチキャストv6アドレス」を持っているためコンフィグとして設定可能だが、そいつはYAMAHA RT配下のLANにいるため広報しなくなる、とかでしょうか。


さて、v6用DNSサーバーが広報されていない状況で、LAN内の端末はAAAAレコードをどうやって解決するでしょうか？
**IPv4 DHCPで設定されたLAN内DNSサーバーに聞きに行きます。そいつが普通にAAAAを返してくれます。AAAAが分かれば端末はそれを元にv6ネットワークに旅立っていけます。**
v6用のDNSサーバーはv6のRAやDHCPで広報されたものでないといけない！とつい思い込んでしまいますが、そんなことは全くないわけです。この罠けっこうハマります。

# 4. 得られた成果

というわけで、v4用DNSもv6用DNSも、私がLAN内に立てたサーバーに設定させることができました。
正確には「v6用DNSを広報させず（フレッツ既定とかYAMAHA RT自身とかにさせず）v4用DNSを見させるようにできた」という状態ですね。

![コメント 2020-01-20 222246_New.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84482/b242ade4-cb4f-33ec-da1c-14b4ee042cd6.png)

**v6でインターネットに出られてますね。**

![コメント 2020-01-20 222758_New.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84482/95892174-6f58-b8b6-e0d5-c9e6b86812fa.png)

**v4のDNSからちゃんとAAAAが返ってきてます。もちろんEDNS0対応だよ！**


ベンチマークだと差が出にくいのですがブラウザの表示が速くなったように感じます。
実際EDNS0対応でTCPフォールバックを起こしませんので、その分レスポンスが早い可能性は考えられます。
最近のWebサイトはリッチになったため、読み込み時に発行されるDNSクエリ数が桁違いなので、小さな積み重ねが体感差に結びつく可能性はあり得ます。

# 5. おまけ
この記事の主題とは外れますが、弊宅でYAMAHA RTに設定しているコンフィグをいくつか。


・パフォーマンス改善系

`ip routing process fast`
`ipv6 routing process fast`


・セキュリティ強化系

`ip filter source-route on`
`ip filter directed-broadcast on`


DS-Liteを使っている場合、v4トンネルの方にファイアウォールルール入れ忘れることがあるので、

```
tunnel select 1
 ip tunnel secure filter in ...
 ip tunnel secure filter out ...
...
```

てな感じでpppoe側と同様に入れておきましょう。

それでは本記事はこの辺で。