VPNクライアントを再接続してほしいという依頼は、三つの異なる意味を持ちます。認証済みのセッションを一つ切断すること、UDPサーバーがなくなることを全クライアントに伝えること、あるいはデーモン自体を再起動することです。それぞれ影響範囲が異なり、選び方を誤ると一人の利用者向けの修正がサービス停止になります。範囲を決めることが判断であり、コマンドはそこから導かれます。

どの制御を使うかを尋ねる前に、誰に影響を与えるべきかを尋ねてください。

一つのインスタンス:管理インターフェース

設定された管理インターフェースは接続中のインスタンスを一覧し、そのうちの一つだけを切断できます。各セッションはクライアント識別子を持ち、client-kill CID 共通名ではなくその識別子を対象にします。古いログからコピーした値はもう存在しないセッションを指すため、現在のステータス出力から生きた識別子を読んでください。インスタンスを切断しても、その接続が終わるだけで他には影響しません。

新しい接続を保証するものではありません。クライアントが戻るかどうかは、再試行の設定、残っているリモートエントリ、認証の要件、そして監視アプリケーションがまだ動作しているかどうかによります。戻ってきたクライアントは新しい識別子を受け取るため、識別子の比較が古いものと新しいものを見分ける唯一の確実な方法です。

UDPの終了通知はクライアント単位のコマンドではない

explicit-exit-notifyは、終了と再起動のイベントに関する設定ディレクティブです。UDPクライアントでは、セッションが終わることを相手に伝え、数値引数が通知を何回繰り返すかを制御します。サーバーがUDP上で動作しているときは、接続中のクライアントに再起動の制御メッセージを送り、文書化された値は同じサーバーへの再接続と別のリモートエントリへの移動を区別します。これは幅広い対象を持つライフサイクル信号です。

その中には、任意の時点で任意のクライアントを選ぶものはありません。再接続ボタンとして扱うと、接続中のすべてのセッションに一度に届きます。

シグナルはセッションではなくプロセスに作用する

SIGUSR1は、設定を読み直さずに接続を再起動するよう実行中のプロセスに要求し、永続化オプションがその再起動を何が生き延びるかを決めます。SIGHUPはさらに進み、設定ファイルを読み直してリソースを開き直します。SIGTERMとSIGINTは秩序ある停止を要求します。これらはプロセスレベルの操作であり、マルチクライアントのサーバーではプロセスが担うすべてのセッションに影響し、チケットに書かれた一つだけではありません。

プロセスがサービス管理者の下で動いているときは、プロセス一覧で見つけたPIDにシグナルを送るのではなく、管理者自身の制御を使ってください。再起動と再読み込みは同じデーモンに対して別のことをするため、ユニットを読んで管理者がどのシグナルを送るのかを確認してください。

制御を選ぶ前に範囲を決める

三つの質問で決まります。誰に影響を与えるか:一人の利用者か、一つのサーバーの全クライアントか、デーモンとそれが担うすべてか。何を残すか:設定か、トンネルの状態か、どちらでもないか。誰に権限があるか:管理連携か、サービスの所有者か、終了通知を制御するネットワーク運用者か。これに答えれば、合う制御は一つだけです。

再接続ボタンを得るために認証なしの制御リスナーを追加すると、ポートに到達できる誰かにそのボタンよりはるかに多くを渡すことになります。

切断ではなく、新しいセッションを確認する

切断イベントは古いセッションが終わったことを証明します。新しいセッションが認証され、アドレスを受け取り、ルートを設定し、利用者が必要としたリソースに到達するかについては何も語りません。新しい識別子を確認し、次にトンネルの状態、次に実際のリソースを一つ確認してください。その三つの手順が、再接続と動作する接続の違いです。

変更記録に範囲を書いてください。クライアントが共有サーバーの四十人のうちの一人だったとき、「クライアントを再接続した」は説明になりません。

関連記事