トンネルでは三つの異なる事態が起こり得て、それぞれに異なる対応が必要です。相手側が応答をやめる、デーモンのプロセスが死ぬ、あるいはトンネルの背後のアプリケーションが応答をやめる、という三つです。そのどれでもサービスを再起動する設定は、丁寧な監視ではありません、無関係な障害に一つの乱暴な処置を当てているだけです。各仕組みが実際に何を観測できるかを比べれば、役割分担は明らかになります。

一つに見える三つの障害

相手の沈黙は、もう一方の端が送信をやめたことを意味し、OpenVPNは心拍を自ら持つためそれを自分で検出できます。プロセスの死はデーモンが終了したことであり、サービス管理者は気づきますがOpenVPNには分かりません。アプリケーションの障害は、トンネルは正常でその背後の何かが正常でないことであり、他の二つの仕組みにはそれを知る手段がありません。それぞれに異なる対応が必要で、どれもトンネルが稼働していることに気づくのと同じではありません。

これらは異なる層からの異なる信号であり、それぞれに推測なしで行動できる所有者がいます。これらを混ぜると、解釈できない兆候で再起動する仕組みになります。

タイマーを変える前に三つの事例を書き出してください。その一覧自体が、一つの仕組みに三つすべてを任せていることを示すのが普通です。

keepaliveが実際に何に展開されるか

keepalive ディレクティブは省略形であり、展開はモードによって異なります。サーバーでは keepalive 10 60 は十秒ごとのローカル ping、120 秒のローカル再起動タイムアウト、クライアントへ送られる 10 と 60 の値になります。サーバーのタイムアウトが意図的に二倍なのは、サーバーが諦める前にクライアントが再起動する機会を得るためです。プロファイルの省略形ではなく、稼働中の設定で展開後の形を読んでください。

この二倍化のため、両端が六十秒後に再起動するという説明は誤りです。経路が劣化したときに両端が足並みを揃えて揺れない理由も、これで説明できます。

心拍は OpenVPN のピア通信であり、どこかの公開ホストへの ICMP 検査ではありません。応答はトンネルの遠端が生きていることだけを証明します。利用者が本当に必要とするデータベースやウェブサービスについては何も言いません。

Restart=on-failure が見ていないもの

上書きを追加する前に、インストール済みのユニットを読んでください。Restart=on-failure は文書化されたプロセス障害の条件に反応するものであり、接続状態の監視とは同じではありません。内部の再接続が始まったから発火するわけではなく、正常終了はクラッシュとは意味が異なります。

この区別が重要なのは、内部の再起動が同じプロセスを生かし続けるからです。ユニットは何も見ず、トンネルは自力で回復し、それが正しい結果です。

RestartSec と起動制限は意図的に設定してください。クラッシュループがゲートウェイを叩き、本当のエラーを再起動メッセージの下に埋めてしまううえ、発動した再起動制限はユニットを失敗状態に残し、それは目に見えますが、無制限のループは見えません。

ping-restart と ping-exit は交換できません

ping-restart は OpenVPN の内部再起動を起こし、プロセスを保ちます。ping-exit は同じ種類のタイムアウトでプロセスを終了させ、判断をサービス管理者に渡します。両者は排他的であり、後者を選ぶと復旧の所有者が変わります。違いは、誰が再試行を決めるのか、そして試行のあとにどれだけの状態が残るのかにあります。

タイムアウト時の終了を選ぶなら、ユニットには整合する再起動ポリシーと終了ステータスの扱いが必要です。さもなければ生存性の障害が恒久的な停止に見え、永続化のオプションは内部再起動をまたいでインターフェースとルートを保てますが、プロセスの終了をまたぐことはできません。

配備ごとに一つのライフサイクルを選び、その理由を書いてください。両方のディレクティブを持つプロファイルは、決めていないプロファイルです。

各障害を独立した事例として試す

承認された時間帯に、沈黙する相手、殺したデーモン、利用できないアプリケーションを模擬し、どの復旧が発動したかを確認します。沈黙する相手なら内部の再接続、殺したプロセスならユニットの再起動、アプリケーションの停止ならどちらも起こらないはずです。二つの事例が同じ動作を生むなら、所有権はまだ混ざっています。

繰り返される復旧も修理ではありません。拒否された資格情報や同じ実効名を共有する二人のクライアントは互いを置き換え続け、より速いタイマーはその揺れを速くするだけです。

関連記事