VPN が接続した途端に DNS64 の応答が変わるのはなぜか
DNS64 の応答は変換の前提を符号化している。どのリゾルバーが応答したか、プレフィックスが経路化されているか、経路上に変換器があるかを確認する。
DNS64 の応答はサーバーの性質ではなく、ネットワークの配置を表している。リゾルバーは IPv4 アドレスから IPv6 アドレスを合成し、その結果はそのプレフィックスの末端に変換器がいる場所でしか機能しない。VPN を経路に持ち込むと、その配置は三つの条件に応じて保たれたり、変わったり、真でなくなったりする。
その条件とは、応答したリゾルバー、合成されたプレフィックスへの端末の経路、そしてその経路上で何かが変換を行っているかどうかである。いずれも観測でき、それが障害を診断可能にする。
合成された AAAA レコードは実際に何を指すのか
DNS64 リゾルバーは IPv4 しか持たない名前への AAAA 問い合わせに対し、使用するよう設定されたプレフィックスの中に IPv4 アドレスを埋め込んで応答し、その作業のよく知られたプレフィックスは RFC 6147 で説明されている 64:ff9b::/96 である。レコードはアプリケーションには他の AAAA レコードと変わらず見え、そこが要点で、IPv6 しか持たないクライアントは宛先が IPv6 を一度も持ったことがないと知らずに接続を試せる。その接続はやがて、経路上のどこかで二つのファミリー間を変換する NAT64 機能に依存する。その変換器がなければ、合成されたアドレスはもっともらしく見えるだけでどこにも通じない宛先である。
したがってレコードは、元の IPv4 アドレスと、変換器に到達できるという前提という二つのことを同時に符号化している。応答自体に見えるのは最初の一つだけだ。
三つの条件が今も機能するかを決める
第一の条件はどのリゾルバーがレコードを作ったかであり、DNS64 が設定されていないリゾルバーはその名前に対して何も返さず、アプリケーションは別の形で失敗する。第二は、応答が妥当でもそこへの道が欠けていることがあるため、端末が合成されたプレフィックスへの経路を持つかどうかである。第三は、64:ff9b::/96 を別の場所へ運ぶトンネルは別の機能に届くか何にも届かないため、そのプレフィックスを所有する変換器が使う経路上にいるかどうかである。三つともトンネルの前は成り立ち、後で崩れうるので、症状は突然の後退に見える。
その順に確認する。応答がない場合と経路がない場合はブラウザーでは同じに見え、リゾルバーのログではまったく違って見える。
リゾルバーが変われば応答も変わる
VPN クライアントはしばしば独自のリゾルバーを押し込むか、問い合わせ経路を丸ごと引き継ぎ、そのリゾルバーは何も合成しないかもしれない。すると IPv4 しか持たない名前への問い合わせは AAAA レコードを返さず、IPv6 しか持たないクライアントはそれを到達できない名前として経験する。逆に、合成するリゾルバーがトンネル経路の運ばないプレフィックスを渡すこともある。
キャッシュはこれを見えにくくする。オフィスのネットワークで得た合成レコードは、それを生んだ文脈より長く生き残ることがあり、クライアントは変換器にもう到達できないアドレスへ接続し続ける。記録が保存されたときに応答したリゾルバーではなく、いま応答しているリゾルバーを見る。古い応答と新しい応答を記録せずにキャッシュを消すと、必要な証拠が壊れる。
問い合わせと経路を別々に試す
アプリケーションを関与させる前に名前を直接問い合わせ、どのサーバーが応答したかを書き留める。以下のコマンドは AAAA レコード、使用中のリゾルバー、合成されたプレフィックスへの経路の有無を示す。トンネルを落とした状態で実行し、次に上げた状態でもう一度実行する。
dig AAAA ipv4only.example.com +short
dig AAAA ipv4only.example.com | grep -E '^;; SERVER'
ip -6 route get 64:ff9b::c000:0216
curl -6 -sS -o /dev/null -w '%{http_code} %{time_connect}\n' --max-time 8 http://ipv4only.example.com/
結果は連鎖として読む。AAAA レコードがなければ、目の前のリゾルバーは合成しておらず、IPv6 しか持たない経路はその名前では機能せず、クライアントが何をしても同じである。レコードがあり経路がない場合は、現在の経路がそのプレフィックスを運んでいないということで、これはリゾルバーの障害ではなく経路選択の判断である。経路があり要求がなお失敗する場合は変換器そのものを指し、それはさらに別の所有者に属する。
各結果のそばにリゾルバー、ネットワークの文脈、アドレスファミリーを記録する。次の比較でリゾルバーの変化と経路の変化を切り分けられるのは、その記録があってこそだ。