試行の最初のパケットより前に始まるキャプチャから始めます。そうしないと会話の途中を読むことになります。すでに走っている折衝は暗号化された交換と鍵の更新を示し、どちらも開始時のようには見えません。開始時は鍵なしで復号できる部分であり、だからこそ到達性の問いによく答えます。順に四つの確認を行えば、新しいキャプチャから、どちら側が話をやめたかという擁護できる結論へ進めます。

まず、キャプチャが先頭から始まっていることを確認する

トンネルが上がった後に始めたキャプチャには、カプセル化されたデータストリームと定期的な keepalive が入り、どちらも暗号化されているかほぼ空です。クライアントを再起動して試行そのものを記録するか、キャプチャの実行中に意図的に新しい接続を起こします。新しい試行を作れない場合はその旨を記録に残します。記録しなかった開始時は、どんな復号でも取り戻せないからです。

キャプチャは二つの端点と UDP 500 および 4500 に絞り、ファイルを読める大きさに保ちます。負荷の高いホストでは、絞り込みのないキャプチャは無関係な通信の下に折衝を埋めてしまいます。

tcpdump -i any -n -s 0 -w fresh-ike.pcap 'udp port 500 or udp port 4500'

試行が興味深いときはファイルを保存します。同じキャプチャが、交換が何だったのか、そして何か戻ってきたのかという二つの問いに答えるからです。開始時刻と、絞り込んだ端点の組を記してラベルにします。この二つの事実がないキャプチャは、アドレスが変わり、どの試行を記録したのか誰も思い出せない一週間後には使いものになりません。

次に、ペイロードより先にヘッダーを読む

IKE ヘッダーはセキュリティパラメータのインデックス、交換の種類、メッセージ ID を運び、新しい折衝ではこれらの値が際立ちます。開始側は非ゼロの SPI を作り、まだ応答を見ていないため最初の要求の応答側 SPI はゼロで、交換の種類は IKE_SA_INIT、メッセージ ID はゼロです。それ以外は同じ折衝の後の段階か、まったく別の試行に属します。

この最初の交換の提案、鍵交換、nonce のペイロードは平文で読めます。読めることは認証済みという意味ではなく、この時点ではどちらの側も身元を証明していません。

Diffie-Hellman の私有値は決して回線を渡らないので、キャプチャからセッション鍵を導くことはできません。 認証は次の交換で行われます。最初の交換で合意した内容によって保護されます。ある側が本物かと問われても、この交換はその問いに答えられません。示せるのは、双方がある提案に合意し、ファイルには含まれない共通の秘密を作ったことだけです。

三つ目に、要求とその応答を突き合わせる

SPI の組、交換の種類、メッセージ ID で突き合わせ、応答フラグを確認します。再送は元のメッセージ ID を繰り返すのであって、二度目のログイン試行ではありません。交換ではなくパケットを数えることが、健全な折衝を幽霊のループに変える道です。

応答は拒否であることもあります。クッキー要求、受け入れられないグループの通知、提案に関するエラーです。これらは正当な応答であり、経路は動いているがポリシーが動いていないことを意味します。すべての応答を成功とみなすのではなく、通知を復号します。通知がグループや提案を名指しするとき、修理はファイアウォール側ではなく設定側にあります。

向きも重要です。応答のない要求と、クライアントに決して届かない応答は別の障害であり、クライアント側のタイムアウトに見えるのは後者だけです。

四つ目に、4500 番で IKE を他のすべてから切り分ける

4500 番ポートは、概要表示では同じに見える三つを運びます。四バイトのゼロ non-ESP マーカーの後ろの IKE、マーカーの位置に非ゼロの SPI を持つカプセル化 ESP、短い keepalive です。IKE とカプセル化 ESP を分けるのはこのマーカーなので、通信を IKE と呼ぶ前にそのバイトを読みます。4500 と読めるキャプチャのラベルはポート番号であって、プロトコルではありません。

カプセル化 ESP は鍵なしでは解釈できない暗号化ペイロードであり、その存在は障害ではなく動作中のトンネルの印であるかもしれません。

同じ試行について両方のポートを監視します。IKE は 500 で開いても NAT 検出後に 4500 へ移ることがあるからです。500 だけで絞ったトレースは、折衝が成功して移動したまさにそのときに静かに見えます。フィルタを広げ、不在から何かを結論づける前に同じ時間窓を読み直します。

一つの観測点での沈黙が意味するもの

クライアントに応答がないことは、その観測点が見たことだけを証明します。絞り込み、経路、誤った遠隔アドレス、停止したサービス、プロトコルの不一致は、いずれも同じ空白のトレースを生みます。

関係する ICMP unreachable は証拠を足しますが、その中に引用されたパケットを読み、送信した機器のアドレスを記録します。

ルーターによる拒否は、相手側が返す認証済みのエラーとは別の出来事であり、サービスが生きていることを証明するのは後者だけです。同じ試行をサーバーログや承認された観測と突き合わせ、要求が届いたか、応答が出たかを確かめます。キャプチャは範囲を絞って私的に保ちます。読めるハンドシェイクのフィールドは、ファイルの残りを無害にはしないからです。価値のある結果は、一組の要求と応答が突き合わされていること、あるいは観測点を名指しした記録済みの空白です。

関連記事