IPv4とIPv6の接続確認
名前解決からHTTPまでを系統別に確認し、片側だけの失敗箇所を特定します。
説明
一つのホスト名にIPv4とIPv6の両方が登録されていても、経路や通信制御は系統ごとに違います。ブラウザで表示できるだけでは、両方が正常かは分かりません。
同じWebサービスのDNS、経路、接続結果の記録をコマンドで確認します。時間差で接続を試した記録から成功の理由を調べ、IPv6だけ失敗した規則と、修正後の結果を照合します。
1名前解決の候補を確認
web.example.testのDNS応答を保存した記録です。
cat dns.txtAとAAAAの応答AはIPv4の192.0.2.80、AAAAはIPv6の2001:db8:20::80です。両方返ったことは、両方でTCP接続できることを意味しません。名前解決の結果と、その先の接続を別々に調べます。
2二系統の経路を確認
同じ端末のIPv4とIPv6の経路を保存した記録です。
cat routes.txtアドレスファミリーごとの経路IPv4は192.0.2.1、IPv6はfe80::1を既定の次ホップにします。IPv6のゲートウェイがリンクローカルアドレスでも、遠隔宛先への経路として使用できます。二つの経路は独立して確認します。
3接続段階のどこまで進んだか
同じホスト名を指定し、IPv4とIPv6それぞれに限定した確認結果を読みます。
cat checks.csv系統別の確認結果IPv4はTCP、TLS、HTTP200まで進みました。IPv6は名前解決・経路・近隣解決ができてもTCP443でtimeoutです。TLSの検証やHTTP処理まで到達していないため、現時点で証明書エラーやHTTPエラーとは扱いません。
4ブラウザでは成功した理由
attempts.csvには両系統を時間差で試した記録があります。時刻の単位はミリ秒です。
cat attempts.csv接続開始と終了の時刻IPv6を0msから試し、IPv4を250msから開始して290msで接続しています。IPv4の成功が全体の成功として見える一方、IPv6の障害は残っています。この時間差は教材例の設定で、すべてのクライアントの固定値ではありません。
5並行試行が減らした待ち時間
記録上のIPv4接続時間40msを使い、IPv6の3秒の失敗を待ってから試す場合と比較します。
python3 -c接続完了までの時間を比較 'v4_duration=290-250; sequential=3000+v4_duration; concurrent=250+v4_duration; print(sequential,concurrent,sequential-concurrent)'待ち方による完了時刻逐次なら3040ms、時間差で試すと290msで、2750msの差です。Happy Eyeballsのように複数候補を試す仕組みは利用者の待ちを減らしますが、片側の障害を修復するわけではありません。
6失敗側の通信に一致する規則
同じ時間帯の境界装置の規則とカウンターを確認します。
cat policy.csv宛先とポートの一致IPv6の宛先2001:db8:20::80・TCP443にdrop規則があり、カウンターが3です。ここでは対象通信と時間帯を照合済みという条件で、失敗原因をこの規則へ絞ります。単なるtimeoutだけからフィルターと断定したわけではありません。
7修正後も両方で確認
IPv6のTCP443を意図した許可へ直した後の確認記録です。
cat recheck.csv変更後の二系統の結果IPv4・IPv6ともTCP接続、TLS検証、HTTP200まで進んでいます。接続に使ったホスト名と証明書の確認を保ったまま、各系統を個別に確認することで、片側へのフォールバックによる見落としを避けられます。
まとめ
名前解決・経路・TCP・TLS・HTTPの到達段階を系統別に確認します。
一方への接続成功で他方の失敗が見えにくくなるため、個別の結果を残します。
操作履歴と解説を振り返れます。
シェル / PCAPと通信の記録
cat dns.txtweb.example.test. 60 IN A 192.0.2.80 web.example.test. 60 IN AAAA 2001:db8:20::80
cat routes.txtIPv4: default via 192.0.2.1 dev eth0 IPv6: 2001:db8:10::/64 dev eth0 IPv6: default via fe80::1 dev eth0
cat checks.csvFAMILY,DNS,ROUTE,NEIGHBOR,TCP443,TLS,HTTP IPv4,192.0.2.80,default,reachable,connected,verified,200 IPv6,2001:db8:20::80,default,reachable,timeout,not_started,not_started
cat attempts.csvFAMILY,START_MS,END_MS,RESULT IPv6,0,3000,timeout IPv4,250,290,connected
python3 -c 'v4_duration=290-250; sequential=3000+v4_duration; concurrent=250+v4_duration; print(sequential,concurrent,sequential-concurrent)'3040 290 2750
cat policy.csvFAMILY,DESTINATION,PROTOCOL,PORT,ACTION,COUNTER IPv4,192.0.2.80,tcp,443,allow,12 IPv6,2001:db8:20::80,tcp,443,drop,3
cat recheck.csvFAMILY,TCP443,TLS,HTTP IPv4,connected,verified,200 IPv6,connected,verified,200
演習完了