Windows7 DNS resolverの問い合わせ先DNSサーバの優先度付けについて

問い合わせ先DNSサーバの選択

前回の項目3においてAとAAAAの両方が観測された件についてさらに調べて、ようやくWindows7 DNS resolverの問い合わせ優先度がわかってきました。

まず、基本的なこととして、以下の項目に着目します。

  • IPv4IPv6両方のDNSサーバが存在するとき、IPv4を優先
  • IPv4DNSサーバに問い合わせた時、応答がなければIPv6DNSサーバに問い合わせる
  • AAAAレコードより先にAレコードで問い合わせをする
    • このとき、NXDOMAINであった場合はAAAAレコードを抑制する
  • 端末にIPv4アドレスのみが割り当てられているときは、AAAAレコードを抑制する

そこで、これらの挙動に沿ってシチュエーションごとに挙動を分けてみました。ここでは、eth1にはIPv4のみを、eth2にはIPv6のみを割り当てています。ここは前回の記事と同じです。

IPv4IF eth1 IPv6IF eth2 IPv4DNSサーバへの問い合わせ IPv6DNSサーバへの問い合わせ
UP UP A IPv4DNSサーバへの問い合わせ結果がNXDOMAINもしくは応答がないとき、Aを先行し、応答があればAAAAを問い合わせる
UP DOWN A ×
DOWN UP × Aを先行し、応答があればAAAAを問い合わせる

といった感じになります。もちろんDualStackのIFがあればこのようなことは特に心配する必要がないのですが、IPv4IPv6のネットワークを分けている場合には注意が必要です。


このような挙動から既知の問題点としては、「eth1にIPv4、eth2にIPv6」を割り当てた時に、www.kame.netなどのIPv4IPv6の両方に対応したWEBサイトにアクセスすると、IPv4でアクセスしてしまうということです。これはIPv4でAを問い合わせた時に応答があり、そこで名前解決が終了してしまうためです。

また、このような特殊環境下において、IPv6トランスポートを優先できないかといろいろ試しましたが、Windows7の内部実装に依存しつつまたnetshなどでpolicyを変更することができなかったため残念ながらできませんでした。


こういった挙動はIPv6が浸透せず、IPv4がまだ大半で用いられている情勢では良い実装だと思うのですが、IPv6優位になってきたときには、AレコードからAAAAレコードへのフォールバックが問題になってくると考えられます。

いずれにせよ、IPv6優位になってきたときにパッチか何かで変更されることを期待するしかないですね。