2つ目のVPNクライアントが1つ目を壊した:共有リソースを特定する
2つのVPNスタックが、サービス、固定ポート、フィルタードライバー、または既定ルートを奪い合います。どちらかのクライアントをアンインストールする前に、排他的なリソースを名指ししてください。
昨日は元のクライアントが動いていた。今日は新参者が接続を要求し、古いプロファイルは以前なら文句もなく通過していた段階で止まる。認証情報が関わることはまれで、ゲートウェイはたいてい無実だ。変わったのは、二つのVPNスタックが同じ排他的リソースを求めるようになったことであり、修復はそれを名指しできるかどうかにかかっている。両方を再インストールするのではなく、層をたどろう。
四つの層を順にたどる
VPN製品には、二度走るのをしばしば拒むバックグラウンドサービス、固定ポート、ルーティングテーブルより先に通信を見る仮想アダプターまたはカーネルフィルター、そして既定より前にルートを入れる権利という、衝突しうる四つのリソースが必要だ。どれが譲ったかを知れば、曖昧な衝突は検証できる答えを持つ一つの問いに変わる。
何かに触れる前に、症状を層に対応づける。起動しないクライアントはサービスを、起動しても交渉しないものはポートを、相手が接続をすべて失うのにこちらがつながるものはフィルターか既定ルートを指す。その対応表を書き留めておけば、期待してアプリを再インストールする一時間を節約できる。
二度走らないサービスから始める
Windowsでは企業向けクライアントは通常トンネル以上のもので、プロファイルとともにサービス、フィルタードライバー、ときには資格情報プロバイダーをインストールする。変更前にどのサービスが動いていたか、変更後にもう一度記録し、何かが動くまで再起動する代わりに二つの一覧を比べる。サービスは依存関係で互いを排除することもあり、一方の起動が他方を止め、同じパターンはmacOSでもlaunchdのジョブと共有デーモンで見られる。数秒で起動して終了するクライアントは、構成ではなく所有権を報告している。
プロファイルを読む前に、サービスの状態とそのログを読む。同じ分のうちに起動して停止したサービスが探すべきパターンであり、そのイベントログが追い出した依存関係を名指しする。プロファイルは動いていないプロセスを修復できないし、それを編集する時間は実際の衝突に使われない時間だ。
次に、誰がポートを所有しているかを尋ねる
ポートの所有権は得られる最も明確な証拠だ。二つのIKE実装が同じローカルアドレスと同じUDPポートで同時に応答することはできず、何度試してもそれは変わらない。
Get-NetUDPEndpoint -LocalPort 500,4500 | Select-Object LocalAddress,LocalPort,OwningProcess
netstat -ano | findstr :500
sudo lsof -nP -iUDP:500
ss -lunp | grep -E ':500|:4500'
どの行があなたのプラットフォームに合っても、欲しい答えはプロセスとそれを生んだサービスだ。待ち受けているのが組み込みのIKEサービスなら二つ目のクライアントが、ベンダーのエージェントなら組み込みのクライアントが侵入者だ。どちらがログイン時に起動してよいかを決め、もう一方を毎回殺すのではなく自動起動を無効にする。
フィルタードライバーはルートの下にいる
ネットワークフィルタードライバーはアダプターとプロトコルスタックの間の通信を傍受するので、ルーティングテーブルが何と言おうとパケットを書き換えたり遮断したりできる。正しく見えるルートが無視されるのはこういうことだし、成功するpingが何も読み込めないブラウザーの隣に居座る理由でもある。
ベンダーのコンポーネントも特定の接続に結びつく。一つのアダプターに結びついた古いフィルターは、ほかの点では正しいプロファイルがハンドシェイクを終えるのを妨げることがあり、そのコンポーネントをアダプターのプロパティから外すほうが、製品を丸ごと削除するより狭く、元に戻しやすい。結びつきは接続ごとなので、スタック全体ではなくアダプターを比べる。
どの製品が起動を所有するかを決め、記録する
共存が現実的なのは、二つのクライアントが設計上異なる層を占める場合だけであり、たとえばIPsecスタックが、アプリケーションの通信だけを扱うプロキシーの隣にある場合である。同じポート、同じフィルター層、または既定ルートを公開する権利を両方が求めるなら、交互に奪い合い続け、失敗のたびに新しい不具合に見える。
所有者を意識して選ぶ。再起動を生き延びる形には、二つ目のクライアントを仮想マシンの中で動かす、専用ハードウェアに置く、両方のプロトコルを話す一つのクライアントに標準化する、などがある。負けた側の自動起動とサービスを無効にするほうが、起動のたびにルーティングテーブルを作り直すより小さな変更で、設定を一か所編集すれば元に戻る。