トンネルは上がっており、IPv4 のサイトは読み込まれ、一つのホスト名だけがタイムアウトする。すぐに「VPN が壊れている」か「認証情報が間違っている」と結論したくなるが、どちらも通常は正しくない。名前は IPv4 と IPv6 の両方のアドレスを返し、アプリケーションが片方を選び、その候補のうち実際に経路が機能していたのは 一つだけだった。選択したのはクライアントであり、トンネルは選ばれたものをカバーしていなかっただけだ。

選択はカバレッジの約束ではない

RFC 6724 で説明されている既定のアドレス選択は、複数の候補があるときホストがどの送信元と宛先の組を優先するかを決める。Happy Eyeballs はその上に接続戦略を加える。両方のファミリーで試行を始め、先に応答したほうを採用するので、ユーザーが壊れたファミリーのタイムアウトを待つことはない。

どちらの仕組みも経路を作らない。トンネルが IPv4 しか運ばない場合でも、AAAA の候補はクライアントが試しうる正当な宛先であり、障害はエラーではなく読み込みの遅さとして現れる。ブラウザーがフォールバックするからだ。ユーザーは「壊れたサイト」ではなく「遅いサイト」を報告し、サポートチケットもその曖昧さを引き継ぐ。固定したファミリーで再現すれば、報告は具体的になる。

そのフォールバックのせいで、症状はアプリケーションごとに一貫しない。ブラウザーは遅延を隠し、ファミリーを固定したコマンドラインクライアントは本当の失敗をすぐに見せる。

リクエストが実際に使ったファミリーを特定する

トンネルではなく名前から始める。両方のレコード種別を問い合わせ、何が返ったかを記録する。

dig +short A example.com
dig +short AAAA example.com
curl -4 -sS -o /dev/null -w '%{http_code}\n' https://example.com
curl -6 -sS -o /dev/null -w '%{http_code}\n' https://example.com

v4 のリクエストが成功し v6 のリクエストが失敗するなら、デバッグできる形で問題を再現できている。シェルからは両方成功するのにブラウザーが失敗するなら、トンネルに触る前にアプリケーション自身のリゾルバーやキャッシュされた応答を確認する。

ファミリーと宛先をメモに残す。「VPN 経由でサイトが読み込めない」というチケットは誰にも検証できないが、「AAAA が失敗し A が成功する」というチケットは特定の経路を指している。

そのファミリーの経路を確認する

失敗しているファミリーについて、カーネルにどの経路を使うかを尋ね、トンネルに設定されたアドレスと比較する。Linux では ip -6 route getが宛先に対して選択されるインターフェースと送信元を表示する。

次にトンネル自体を確認する。WireGuard のピアは許可 IP のリストを持ち、0.0.0.0/0 のエントリは IPv6 について何も語らない。ピアのリストに IPv6 プレフィックスがなければ、クライアントが AAAA のトラフィックをトンネルへ送る理由はなく、パケットはホストが本来行う経路から出ていく。

ファイアウォールの規則と NAT ポリシーも、ファミリーごとに同じ確認に値する。IPv4 向けに書かれた規則はどのプラットフォームでも IPv6 をカバーせず、これが一方のファミリーだけが動く最も一般的な理由である。

スクリーンショットを簡単にするために IPv6 を無効にしない

システム全体で IPv6 を切れば症状は消えるが、診断は残らない。IPv6 専用の宛先も壊し、次のアプリケーションのために同じバグを隠すことになる。あるマシンが本当に IPv6 を使うべきでないなら、それは所有者とテストを伴う意図的な方針である。障害対応の最中に切ることは、どちらでもない。

クライアントがファミリーをどう扱うべきかを決め、明示的に設定する:トンネルを通すか、サポートされた方法で遮断して、選択が到達不能な候補を決して提示しないようにする。どちらも正当な設計である。全体無効化はどちらでもない。設計ですらないからだ。

チケットに書くこと

四つを記録する。ホスト名、失敗したファミリー、カーネルが選んだ経路、ファミリー固有のリクエストの結果だ。これだけあれば、二つの経路のどちらを指したのかを推測せずに、他の誰かが障害を再現できる。

RFC 6724 のアドレス選択規則 は、クライアントがその候補をなぜ優先したかを説明し、RFC 8305 は遅延を隠した競争の挙動を説明する。どちらもパケットをルーティングしてはくれない。そこはトンネルが担う部分である。

関連記事