IPv6のDNS問題

回線をJCOMからドコモ光にしたところ、IPv6が使えるようになりました。プロバイダには無料のIPv6サービスがあったので追加しました。

さて、そんなIPv6ですが、アドレス空間がIPv4の32bitから128bitに拡大することで、アドレス枯渇問題を解消し、さらには広帯域化によりさらなる通信速度の向上が期待できるとあって、私個人も大変期待していたのですが、思いも寄らない副作用がもたらされました。

わが家では、NATとDynamicDNSを利用して、外向けにサーバを運用しています。小賢しくも複数のマシンで分散してあれこれやっている関係で、外からはひとつのIPアドレスであっても、中では複数のプライベートアドレスに別れて処理をしています。なので、外向けのDNSと内向きのDNSとで提供している情報が異なっています。今までは、DHCPサーバが、LANに接続した際に、DNSも中向のものを利用するように指定していたので、これを今回も踏襲しました。

一見うまく動いているこの仕組みが、どうもうまくないことに気づいたのは、わりとすぐのことでした。何しろ、Windowsから、家の中のサーバにアクセス出来なくなってしまったのですから......。

理由は、名前解決にあることはすぐに分かりました。何しろnslookupすれば、DNSサーバとして、IPv6のアドレスを持ったやつが返事をしてきて,外向きのIPアドレスを返してきやがるからです。疑う余地はありません。

どうやら、ドコモのルータPR-500KIがDHCP6を動かしているから、このようなことになるようです。Linuxでは、/etc/resolv.confにIPv4のDNSが先に来て、そのあとにこのIPv6のそれが挟まるので、ローカルのアドレスが優先的にかえりますが、WindowsはどうやってもIPv6が先なのです。広帯域通信のメリットを享受するためにはIPv6はオフにできませんし、かといって、ローカルのサーバにアクセス出来なくなるのは困ります。

先達の知見を頼ろうとしたら、どうも netsh を使って、IPv4へのルーティングを優先してやればいい、というような事が書かれています。

PS C:\Windows\System32> netsh interface ipv6 show prefixpolicies
アクティブ状態を照会しています...

優先順位 ラベル プレフィックス
---------- ----- --------------------------------
50 0 ::1/128
40 1 ::/0
35 4 ::ffff:0:0/96
30 2 2002::/16
5 5 2001::/32
3 13 fc00::/7
1 11 fec0::/10
1 12 3ffe::/16
1 3 ::/96

PS C:\Windows\System32>

赤く示した、::ffff:0:0/96 がIPv4のルーティングで、これの優先順位が低いのが問題だというわけです。優先順位は、netshを使って変更できます。管理者権限で以下のようにします。

PS C:\Windows\System32> netsh interface ipv6 set prefixpolicy ::ffff:0:0/96 60 4
OK
PS C:\Windows\System32>

これで変更されるのですが、実はこれをやってもDNSの参照順位は変わりません。

頑固です!Windowsはとても頑固です。

結論から言えば、やはりDNSをどうにかするしかありません。よく見ると、ルータの管理画面には、「詳細設定→DNS設定」という項目があります。(PR-500KIの場合)

ここでは、IPv6のDNS設定に対して、特定ドメインへの問い合わせを、指定したDNS(但しIPv6で接続可能な)に渡すという設定が可能です。つまり、ここで、自ドメインへの問い合わせをローカルのDNSサーバに渡すようにしてしまえばいいのです。


これにより、ローカルのPCからの自ドメインへのIPv6側への問い合わせはローカルのDNSに落ちて、期待した結果が戻るようになりました。他のルータでどうなるのかは分かりませんが、とりあえず、PR-500KIをご利用の方でローカルのDNSがある場合には同じように対応出来ると思われます。ご参考まで。