vpn.persistent は試し続けるが、つないだままにはしない
このプロパティは VPN サービスに、リンク変更をまたいでトンネルを保持するよう求めます。有効化、生存性、意図、kill switch の挙動は別々の問いのままです。
NetworkManager は一つのプロパティ、vpn.persistent を公開しており、人々はそれに四つの異なる問いへ同時に答えてもらおうとします。上流のドキュメントは慎重で、永続性は VPN サービスが対応し、プロファイルが有効にしたときに適用され、接続は明示的な切断までリンク変更や障害を生き延びるよう求められます。同じドキュメントは、このプロパティの既定値が false であることも示しており、これはほとんどの復旧計画が想定しているものではありません。結果の約束ではなく、試行の依頼として読んでください。
この設定が実際に約束するもの
プロファイルに保存された値はマネージャーへの指示であり、マネージャーはその指示を、扱い方を知っている VPN プラグインに渡さなければなりません。インストールされたプラグインがこのプロパティを無視しても、プロファイルは有効になり、ログは静かなままで、後からデバッグする人にとっては両方の悪いところ取りです。プロファイルの中の何も、プラグインに持っていない挙動を実装させることはできないため、目に見える唯一の結果は不在です。
だからこそ、ドキュメントの条件はスイッチよりも重要です。実際にどのプラグインとリリースを持っているかを確認し、接続の説明の隣にバージョンを書いておけば、次の人がそれを再発見せずに済みます。実装されていないフラグの上に築いた復旧ポリシーは、本番でちょうど一度失敗し、しかも必ず最も都合の悪いときに失敗します。
このプロパティを試行として扱うことは、テストに対する正しい期待も設定します。フラグが設定されているかを確認するのではなく、リンクが落ちたときに何かが起きたかを確認します。これは別の実験であり、午後をかける価値があるのは片方だけです。
一つにまとめられる四つの問い
有効化は、そもそも何が VPN を立ち上げるのかを問います。NetworkManager のプロファイルは基本接続に結び付けられ、別途管理される OpenVPN サービスは独自の起動を持ち、そこに三つ目の起動手段を加えると、誰が主導するかについて異なる考えを持つ二つの所有者が生まれます。別のトリガーを追加する前に、どのコンポーネントが起動を所有するかを決めてください。
復旧は、リンクが変わったとき、あるいは消えたときに何が起きるかを問い、それが vpn.persistent が扱う狭い問いです。生存性は、クライアントが相手側の応答停止を認識できるかを問い、代わりに OpenVPN の keepalive や再起動の挙動がそれに答えます。二つの仕組みはしばしば同じ言葉で説明され、別の場所で実装されるため、別々のツールで別々にテストしないと、一方の挙動をもう一方に帰してしまいます。
意図は、そもそも再接続が望まれているかを問い、これは状態のポーリングでは答えられない問いです。意図的な停止と障害は同じ非アクティブ状態を生むため、不在で再接続するものは人間の決定を推測していることになります。推測は、誰かを踏み越えるその瞬間までは問題ありません。
それらを分けておくチェックリスト
設定を読んで推論するのではなく、出来事を順番に実行し、それぞれが何を示すかをタイムスタンプとともに記録してください。
第一に、意図した基本接続を有効にし、VPN が期待したトリガーを通じて立ち上がったこと、インストールを忘れていた仕組みを通じていないことを確認します。第二に、承認された中断の間に、マネージャーの VPN イベント、所有クライアントの復旧状態、プライベートリソースへの新しい要求を比較します。第三に、意図的に切断して待ち、背後で何もプロファイルを再起動しないことを確認します。
第三の手順は人々が飛ばすものであり、実際の欠陥を最もよく見つけるものでもあります。アクティブなプロファイルをポーリングし、存在しないときに再接続するウォッチドッグは、ユーザーの意図的な切断を陽気に取り消します。ユーザーの立場からすればそれは回復力ではなく、言うことを聞かない機械です。追加する前に本人たちに聞いてください。
結果は接続の説明と同じ文書に書いてください。復旧ポリシーは、誰かが意図的に失敗させた最後のときと同じだけの価値しかありません。タイムスタンプは、次にメモを読む人にその違いを見えるようにします。
認証は復旧の一部である
再接続は純粋にネットワークの行為ではありません。承認されたフローが新しいチャレンジ、ワンタイムコード、あるいは 有効化コンテキストが届かない秘密 を必要とするなら、どの永続性設定もそれを無から生み出すことはできません。
これはよくあるパターン、つまりキーリングが解錠されたマシンでは接続が復旧し、同じマシンでも再起動後には失敗することを説明します。ネットワーク層は求められたとおりに動き、資格情報層には差し出せるものがなかったのです。
再試行間隔を短くするのではなく、資格情報のワークフローを直してください。誰も答えられないプロンプトに対する速い再試行は、ログのノイズと、何かが試みられているという誤った印象を生みます。
永続性は kill switch ではない
このプロパティは VPN の関係を維持または復元しようとします。VPN が落ちている間にアプリケーションが何をしてよいかは決めず、それ自体では何も遮断しません。
トンネルの外に一切のトラフィックを出さないことが要件なら、それは独自の仕組み、独自のテスト、独自の故障モードを持つ別のポリシーです。永続性がそれをカバーすると仮定することは、セキュリティの判断を事故に変えます。
復旧メモに、VPN が何を試みたか、そして試行の間どのアプリケーショントラフィックが許可されていたかの両方を記録してください。