共有VPNアカウントのセッション上限:一台だけ切断される理由
共有ログインが同時セッションの上限に達し、一台の端末が切断されます。クライアントのメッセージを読み、サーバー側でセッションを数え、そしてIDモデルを直してください。
すでにスマートフォンで動いているアカウントに二台目のノートPCを追加すると、一分も経たずにスマートフォンのトンネルが切れます。あるいは新しい端末が接続を完了せず、クライアントはタイムアウトではなくポリシーのメッセージで終わります。どちらの場合もネットワークは正常で、その上で受け入れ可否が決まっています。共有ログインは一つのIDであり、ほとんどのVPNサービスは所有する端末数ではなくそのIDを数えています。私はクライアント画面から外側へ向かって調べます。どの層が拒否したかは、たいていその画面に出ているからです。
ネットワークに触れる前にクライアントのメッセージを読む
三つの失敗は似て見えて同じではありません。タイムアウトは、パケットがどこにも届かなかったという意味です。TLSまたは証明書のエラーは、端点が応答したもののハンドシェイクが失敗したという意味です。認証またはポリシーの拒否は、ゲートウェイが資格情報を読み、そのうえで拒否したという意味です。セッション上限の話に属するのは三つ目だけなので、まずそれを見極めてください。
OpenVPNクライアントは重要な行をログ画面に残します。その後に続く再試行ループではなく最後の接続試行までスクロールし、AUTH_FAILEDや送られてきた理由の文字列を探します。クライアントは説明のない一般的な拒否を報告することが多いので、次の一手はサーバー側であり、クライアントの設定ではありません。プロバイダーのアプリはさらに厄介です。端末上限のメッセージは役に立ちますが、二秒で崩れる接続はポリシー判断であって、パスワードの誤りではありません。いずれの場合も端末名と正確な時刻を書き留めてください。事業者はその組をアクセス記録と数秒で照合できます。
サーバーが数える場所でセッションを数える
重要なカウンターはゲートウェイ上にあります。OpenVPNはサーバーが--status付きで起動されると状態ファイルを書き、接続中の各クライアントをコモンネーム、実アドレス、トラフィックカウンターとともに列挙します。
cat /var/log/openvpn-status.log
# or query the management socket directly
echo "status 2" | socat - UNIX-CONNECT:/run/openvpn/server.sock
同じコモンネームを持つ二行は、一つの証明書の下にある二つの生きたセッションです。既定ではOpenVPNは両方を保持しません。--duplicate-cnがなければ、同じ証明書を使う二つ目の接続が一つ目を置き換え、古い端末はトンネルを失います。この置き換えこそがID上限の兆候です。ランダムなパケット損失は、別の端末が現れたまさにその瞬間に、ちょうど一台だけを丁寧に切断したりはしません。
WireGuardには調べられるセッションテーブルがありません。wg show wg0はピアと最後のハンドシェイクを表示し、登録された端末はそれぞれ固有の鍵を持つピアです。そこでの共有アカウントは複数のマシンにコピーされた設定ファイルであり、上限はその設定を配るもの、つまりプロバイダーのポータル、席数、あるいは公開アドレスに紐づく規則から来ます。自分でゲートウェイを運用する場合は、OpenVPN 2.6のマニュアルがサーバー側のオプションを説明しています。
一つのメッセージの裏に隠れた四つの上限を切り分ける
共有アカウントのチケットの多くは、四つの受け入れ判断のどれかです。クライアントはそれらを区別できませんが、どの端末が失敗するかというパターンなら区別できます。
同じIDで二つ目の接続。 新しい端末が動き、古い端末が同じ瞬間に落ちます。これはゲートウェイまたはアカウントシステムが適用するID単位の同時接続規則です。壊れているものは何もなく、サービスはポリシーどおりに動いています。
プランの席数または端末数。 最初の端末は接続したままで、次が拒否され、ほかは動き続けます。ライセンス上限はクライアント側では直せないので、クライアントを変える前にプロバイダーの端末一覧を確認してください。
公開アドレスに紐づく上限。 家庭用ルーター一台の背後にある二台のノートPCが失敗する一方、同じログインがスマートフォンのテザリングからは通ります。二台目を別のネットワークに移して試してください。そこで接続できるなら、見ているのはアドレス単位の規則かNAT規則であり、アカウント数ではありません。
サーバー全体の最大数。 ゲートウェイ上の全員が同じ混雑時間に失敗し、昨日まで正常だったアカウントも含まれます。OpenVPNの--max-clientsはそう振る舞い、登録済みの端末とは何の関係もありません。
席を増やす前に古いセッションを片づける
まずく終わったセッションが席を占有したままになることがあります。RADIUS会計はセッション開始時に記録を書き、停止時に閉じます。クライアントが消えると停止が届かず、サーバーは中間更新かタイムアウトが切れるまでセッションを保持します。FreeRADIUSゲートウェイでは開いた記録を確認できます。
SELECT username, acctsessionid, acctstarttime
FROM radacct WHERE acctstoptime IS NULL;
開始時刻が古く、トラフィックのない開いた記録は、すでに存在しない端末のものです。上限が本当だったと決めつける前に、事業者のコンソールまたは切断要求で閉じてください。Wi-Fiがモバイルに切り替わるとスマートフォンは再接続し、ノートPCはOS内で一本、ベンダーアプリ内でもう一本のトンネルを動かせます。これは一台のマシンから二つのセッションとして数えられます。
一緒に動く端末どうしで一つのIDを共有するのをやめる
恒久的な修正は構造的なものです。各端末に固有のコモンネームを持つ証明書、または独自のアカウントを与え、どの人物とどのマシンが持つかを記録します。OpenVPNでは端末ごとにクライアント証明書一つとなり、乗っ取り動作を望まない限り--duplicate-cnは切ったままにします。WireGuardでは端末ごとに鍵ペア一つを、その場で生成し、決してコピーしません。
端末上限を避けるためにプロファイルを複製すると失効が壊れます。一つのコピーを失効させると、それを共有する全端末が切れ、ログはどのマシンが何をしたかを言えなくなります。上限が商業的なものなら正直な修正は席の追加です。社内ポリシーなら、同じアクセス権を持つ二つ目のIDを申請してください。
決まった順序で検証する
毎回同じ方法で修復を試し、結果に意味を持たせてください。
- すべての端末でサインアウトし、サーバーのアクティブ一覧が空であることを確認します。消えない項目は古いセッションであり、クライアントの不具合ではありません。
- 端末を一台ずつ接続し、接続の合間に一覧を確認します。
- 二台を同時に動かす必要があるなら、両方の行が異なるIDを持ち、両方がハンドシェイクを新しく保っていることを確認します。
- Wi-Fiからモバイルへの切り替え後に繰り返します。再接続が二つ目の記録を作ることがあるためです。
新しい端末が接続したときに古い端末がまだ切れるなら、ゲートウェイは例外を与えられていないID単位の規則を適用しています。端末名、タイムスタンプ、アクティブセッション一覧を事業者に渡してください。それで曖昧な苦情が、答えられるポリシーの問いに変わります。