VPNトンネルでtracerouteが片方向だけ死ぬ理由
片方向では完走し、もう片方向ではアスタリスクを並べるトレースは、たいてい診断の問題です。プローブ方式、戻り経路、実際のリクエストを比較しましょう。
一方向では完走し、もう一方向ではアスタリスクの行を並べるtracerouteの出力は、非対称な転送に見えますが、たいていそうではありません。表示される各ホップには、プローブが届くこと、ルータが応答を決めること、そして応答が戻ってプローブと照合されることが必要です。この鎖のどれか一つが切れると、トンネルがデータを運び続けていても、その行はアスタリスクになります。
トレースは転送の証拠である前に、診断の証拠です。問う価値があるのは三つの鎖のどれが失敗したかであり、その答えは出力の形ではなくパケットから得られます。
アスタリスクは欠けた応答であり、欠けたホップではない
tracerouteは、TTLが各ラウンドで一台先のルータで期限切れになるプローブを送って外側へ進みます。期限切れのプローブを破棄するルータは、自分を名指すICMP Time Exceededメッセージを返すはずで、ツールはその名前を表示します。ツールが実際に待っているのは、そのメッセージがタイムアウト内に届くことです。ルータが別の送信元アドレスから応答する、エラーを生成する頻度を制限する、あるいは何も言わずにプローブを捨てるなら、そのラウンドは表示できるものを何も生みません。
これらの結果のどれも、行きの経路が壊れているとは言いません。アスタリスクは返事のない郵便についての報告であり、空の道についてのものではありません。
プローブ方式が、出会うフィルタを決める
Linuxの既定の方式は通常、番号の大きいUDP宛先ポートで、WindowsのtracertはICMPエコーを送り、Linuxには代わりにICMPやTCPを使うよう指示できます。どれも、ステートフルなファイアウォールやクラウドのセキュリティグループには別種のトラフィックに見えます。片側のUDPトレースともう片側のICMPトレースを比べることは、二つの異なる実験を比べることです。結果を違いと呼ぶ前に、方式、アドレスファミリー、送信元アドレス、タイムアウトを固定してください。
公平な比較には、実際にトラフィックを運ぶホストからトレースを実行し、代わりに転送するゲートウェイから実行しないことです。ルータが生成したトレースはルータ自身の送信元アドレスと出力ポリシーを使い、それらはクライアントが見るどんなものよりも厳しい場合があります。正確なコマンドを記録して、次の人が再現できるようにしましょう。
タイムアウトの値は実験のもう半分であり、メモから漏れやすいものです。混雑した経路で二秒待つとアスタリスクを報告し、五秒待つと同じ場所でホップを報告します。すべての実行で値を同じに保ち、比較がネットワークについてのものになるようにしましょう。
戻り経路はそれ自体が一つのルート
ICMPエラーは独自の送信元と宛先を持つ普通のパケットで、トレーサへ戻る経路が必要です。トンネルのポリシーがLANのプレフィックスを運んでも、エラーを生成したルータのアドレスを運ばなければ、メッセージはあなたに届かない経路へ出ていきます。経路が存在しても、パケットが予期しないインターフェースの予期しないアドレスから届くため、応答フィルタがそれを落とすことがあります。これはアプリケーションの障害ではなく、診断プレーンでの不一致です。
トレースが完了するまであらゆるセレクタを広げることは、絵をきれいにし、ポリシーを悪くします。特定の診断アドレスを直すか、アスタリスクを受け入れてアプリケーションを別の方法で試しましょう。
実際のリクエストでトンネルを確認する
サービス自身のポートでのTCPハンドシェイクは、重要な方向で転送、戻りルーティング、フィルタリングを試します。以下のコマンドは両端で実行し、どちらの側が何を開けるかを比べます。サービスのポートとトンネルインターフェース名は自分の構成のものに置き換えてください。
traceroute -I -n -w 2 203.0.113.40
traceroute -T -p 443 -n -w 2 203.0.113.40
curl -sS -o /dev/null -w '%{http_code} %{time_total}\n' --max-time 5 http://203.0.113.40:8080/health
ss -tan state established
まず二つのtracerouteの実行を読み、ICMPの実行がホップを示してTCPの実行が示さなければ、違いは経路ではなく方式です。次に、妥当なステータスコードで交換が完了していれば行きと戻りの両方の経路が実際のトラフィックで機能しているため、curlの結果をアプリケーション層の答えとして受け取ります。ソケットの一覧は接続がそもそも確立しているかを示し、それはどのトレースにも分かりません。
双方向にインタラクティブなセッションを運びながら、一方のtracerouteがアスタリスクを並べるトンネルは健全で、ただ写真映えしないだけです。両側のコマンド出力を記録として残し、欠けたホップはVPNへの判定ではなく診断についての未解決の問いとして扱いましょう。