一覧NW-07-3 · IPv6と近隣探索

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と通信の記録

1
cat dns.txt
web.example.test. 60 IN A 192.0.2.80
web.example.test. 60 IN AAAA 2001:db8:20::80
2
cat routes.txt
IPv4: default via 192.0.2.1 dev eth0
IPv6: 2001:db8:10::/64 dev eth0
IPv6: default via fe80::1 dev eth0
3
cat checks.csv
FAMILY,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
4
cat attempts.csv
FAMILY,START_MS,END_MS,RESULT
IPv6,0,3000,timeout
IPv4,250,290,connected
5
python3 -c 'v4_duration=290-250; sequential=3000+v4_duration; concurrent=250+v4_duration; print(sequential,concurrent,sequential-concurrent)'
3040 290 2750
6
cat policy.csv
FAMILY,DESTINATION,PROTOCOL,PORT,ACTION,COUNTER
IPv4,192.0.2.80,tcp,443,allow,12
IPv6,2001:db8:20::80,tcp,443,drop,3
7
cat recheck.csv
FAMILY,TCP443,TLS,HTTP
IPv4,connected,verified,200
IPv6,connected,verified,200

演習完了