クライアントは接続済みと報告し、インターフェースは起動したままで、ブラウザーはタイムアウトする。この三つの記述のどれも嘘ではない。接続済みは、要求したページとは何の関係もない層を表している。どの層が報告しているかを決めるには、新しいリクエストを一度送り、通信が動いたことを証明するカウンターを一度見ればよい。再起動はその証拠を捨て、観察しようとしていた条件を作り直してしまう。

接続済みと呼ばれる三つの別物

最下層では、接続済みとはクライアントのプロセスが動作し、相手に向けたソケットを保持していることを意味しうる。その上では、アドレスを持つインターフェースが存在することを意味しうる。常駐デバイスや復旧ルーチンは、その背後に生きたセッションがなくてもこれを作れる。制御の層では、関連付けがネゴシエートされたことを意味しうるが、その下をパケットが一つでも通ったかは何も語らない。それぞれは他が耐えない障害に耐え、クライアントは通常、主張できる最も強いものを表示する。

したがって、緑のアイコンと死んだトンネルは矛盾ではなく両立する。両者は別の対象を報告している。この障害がクライアントのバグと誤診され続ける理由は、まさにそこにある。

デーモンに触れる前に、本当に必要な宛先へ無害なリクエストを一度送り、作業中は必須の直接通信ブロックをそのままにしておく。再起動は出来事の順序を消し、原因を隠せるほど近い条件を作り直す。だから同じチケットが一週間後に何も新しくないまま戻ってくる。リクエスト一つ、カウンターの読み取り一つ、障害を生んだきっかけ一つが最小限の証拠である。

どのカウンターがパケットの移動を証明するか

IPsec では IKE の関連付けと CHILD の関連付けは別の対象であり、この問いに答えるカウンターを持つのは child だけである。child を一覧し、パケットが両方向で増えるかを見て、アプリケーションがしようとしていることと比べる。ゼロのまま設置された関連付けは、アプリケーションが失敗し続ける中で増えている関連付けとは別の所見である。前者は通信が選択されていないこと、後者は通信が動いていて障害がもっと先にあることを意味する。カウンターは数秒あけて二度読む。一度の試料では傾向を示せない。

swanctl --list-sas
ip xfrm state list
ip -s link show dev tun0

ゼロのカウンターは選択を指す。ルーティング、ポリシー、パケットが出た名前空間、あるいはクライアントが結び付けたことのないインターフェースである。増えるカウンターはトンネルから遠ざかることを指すので、遠端での転送、名前解決、戻り経路、宛先サービスの順に進める。child を別に持たないプロトコルも同じ証拠を自前の言葉で示すので、IPsec の語彙を借りるのではなく、相手の状態とパケット数について報告する内容を使う。読み取りの形は、それを生んだ道具よりも重要である。

カウンターが動いた後に障害はどこにあるか

ゲートウェイが自分の管理アドレスで応答することは、ゲートウェイが動いている証拠であって、その背後の何かが要求を処理している証拠ではない。だから真ん中の箱ではなく遠い側を試す。名前解決は障害を最もよく隠す。トンネル経由で届かないリゾルバーは、死んだ接続とまったく同じようにタイムアウトする。二回の照会がその場合を分けるし、どちらも安い。まずトンネルが押し付けるリゾルバーに尋ね、次に同じ名前を公開リゾルバーに尋ねる。

dig +short host.example
dig +short @10.20.0.1 host.example
ping -c 2 10.20.0.25

公開リゾルバーでは解決するがトンネルのリゾルバーでは解決しない名前は DNS 経路が壊れていることを意味し、両方で解決してもブラウザーでタイムアウトする名前は戻り経路かサービスを指す。アドレスへの ping が成功してもアプリケーションが拒否するなら、ネットワークは要求を届け、サービスがそれを拒否したのであり、それはまったく後の段階である。

きっかけを記録し、それから一つだけ変える

障害の前に何があったかを記録する。しばらくの無操作、ネットワークの変更、鍵の更新、復帰したノート PC、復元されたシステムである。これらは異なる仕組みを生み、通常は復元されたシステムだけが自分で直る。それはまさに何も教えてくれない場合である。再起動は出来事の順序を取り除き、原因を隠せるほど近い条件を作り直す。きっかけがまだ再現できるうちに書き留める。

次に裏付けのある修正を一つ行い、元のリクエストを障害を生んだきっかけとともに繰り返す。無操作は最も再現しやすいきっかけなので、修正が症状ではなく仕組みに対処したことを最も早く確かめられる。

報告したいのは、送ろうとした通信が届こうとしたサービスに届いたという証拠である。緑になるアイコン、読み込まれるキャッシュ済みのページ、動くカウンターはどれも、意図した宛先への完了したリクエスト一つに及ばない。リクエスト、カウンターの読み取り、きっかけを一緒に保ち、次の人が修正と偶然を区別できるようにする。

関連記事