デスクトップGUIが管理接続を保持しているため、独自の接続を開こうとする監視スクリプトは何も読めないか、さらに悪いことにGUIがプロンプトへの応答を停止します。よくある結論はデーモンが不安定だというものですが、コミュニティ版のデーモンではこの制限は仕様です。制御インターフェースは接続された管理クライアントを一度に一つだけ処理し、その数はVPNが収容できる利用者数とは関係ありません。

一つのソケット、一人の保持者

管理チャネルは接続中のクライアントを一つだけ受け付けます。一つ目が有効なときに二つ目が来ると、待機するか拒否され、オプションの裏に並列購読モードが隠れているわけではありません。現在の保持者を切断すればデーモンは次の接続を受け付けますが、それは引き継ぎであり、二本目のチャネルではありません。

そのため追加のツールはすべて競合相手になります。GUIが接続を保持していれば、ポーリングするスクリプトは接続に失敗するか、GUIが諦めた後でしか成功せず、この順序は次の再接続でも繰り返されます。スクリプトが先に接続すれば、GUIは制御経路を失い、プロンプトが機能しなくなります。どちらのツールも競合を報告しません。それぞれが自分の失敗したコマンドしか見ていないからです。

What you needMechanism that fitsWhat it cannot do
Periodic list of connected clientsStatus file written on an intervalDeliver events as they happen
Interactive prompts and session controlThe single management connectionServe two controllers at once
Multiple consumers of eitherOne owner process that fans outExist without you writing it

どのコンポーネントが制御を持つかを決める

対話チャネルの保持者を一つ選び、接続するのはそれだけにしてください。接続を管理するGUI、認証プロンプトに応答するスクリプト、セッションを終了させるコントローラーはすべて保持者と見なされ、その役割を担えるのは一つだけです。

GUIが接続を保持している場合は、それと争うのではなく、GUIが提供する連携機能を使ってください。保持者とソケットを奪い合うと、利用者にはランダムに見える断続的な障害が発生し、デバッグする人はたいてい競合の後半しか見ません。再起動後にどのプロセスが最初に接続するかを記録してください。その順序が毎回どちらが勝つかを決めるからです。GUIより先に起動したモニターは、GUIが諦めるまでチャネルを保持します。

収集には状態スナップショットを使う

監視の多くが必要とするのは会話ではなく一覧です。定期的な状態ファイルは制御チャネルに触れずにそれに応え、GUIが接続したままでも動作し続けます。

status /run/openvpn/server.status 10
management /run/openvpn/server.sock unix

間隔は鮮度の予算なので、安全に見える最小値ではなく、ダッシュボードが本当に必要とする値に設定してください。数秒ごとに書き出されるスナップショットは安価ですが、数秒ごとに制御ソケットへ再接続するスクリプトは安価ではありません。再接続のたびに保持者と競合するからです。

スナップショットは履歴でもイベントフィードでもありません。一つの間隔の中で入って出ていく接続は決して現れないため、自己上書きするファイルをポーリングしても監査要件は満たせません。利用者が一度でも接続したかを知る必要があるなら、スナップショットは不適切な道具です。

ファンアウトは設計であり、モードではない

複数の利用側が本当にライブの管理データを必要とするなら、信頼できるコンポーネントを一つソケットの前に置き、厳選した観測結果だけを他へ公開させてください。そのコンポーネントが再接続、認証プロンプト、何を公開して安全かの判断を担います。

意図をもって構築してください。許可するクエリを定義し、誰が問い合わせたかを記録し、ファンアウト層が誤って遠隔操作パネルにならないようにします。デーモンには有効化できるマルチクライアントモードはなく、設定行で作れるものでもありません。保持者は人を切断できるインターフェースを持つため、セキュリティ境界の一部として扱ってください。その再起動は、文書化された復旧手順を伴う定常作業であるべきです。

ソケットは指標ではなく特権として扱う

管理インターフェースは利用者を切断できます。状態を変更し、人名を含むイベントを読むこともできます。パスワードはクライアントを認証するだけで通信を暗号化しないため、ネットワーク上の傍受者は会話を誰にでもさらします。

ローカルソケットか厳しく制限されたリスナーを選び、収集ツールが実際にどのプロセスを対象にしているかを確認してください。サーバー製品は独自の管理APIを備えており、挙動が異なります。間違ったデーモンに向けた収集ツールは、自信に満ちた誤った結論を出します。何も返さないクエリをデバッグする前に、パスと所有プロセスを確認してください。

関連記事