要点:VPN接続は永続的な状態ではなく、切断される可能性のあるネットワークセッションです。Wi-Fiのローミング、セルタワーのハンドオフ、サーバーの再起動、パケットロストの急増、アプリの一時停止、OSのスリープサイクル――これらすべてがトンネルを定期的に中断させます。トンネルが切断されると、OSのデフォルトのルーティングルールは「特定のルートがなければ物理インターフェースを使う」と言います――つまり、トラフィックは実際の接続にフォールバックし、実際のIPアドレスが通信相手に送信されます。キルスイッチとは「いや、トンネルが復旧するまでトラフィックの送信を止める」という仕組みです。概念的にはシンプルです。しかし実装上、この言葉は少なくとも3つのまったく異なるものを指すために使われており、障害モードも大きく異なります。
キルスイッチが存在する理由――サイレントフォールバック問題
キルスイッチがない場合に何が起きるか考えてみましょう。VPNに接続してコーヒーショップにいるとします。ウェブメールクライアントでメールを読んでいます。Wi-Fiが一時的に途切れます――おそらく2秒間。VPNクライアントは再接続しようとしますが、基盤となるネットワークが消えているため再接続に失敗します。30秒後、ネットワークが復帰します。ここで何が起きるかはVPNクライアントの動作次第です。
- キルスイッチなしの場合――Wi-Fiが復帰した瞬間、OSのデフォルトルートはWi-Fiインターフェースに戻ります。VPNクライアントはまだ再接続しようとしていますが、アプリは待ちません。ウェブメールのバックグラウンド同期は次のリクエストを素のWi-Fi経由で送信し、実際のIPアドレスと、ネットワークから渡されたDNSリゾルバーを使います。VPNが再接続し終わるころ(5〜20秒後)には、すでに情報漏洩が起きています。
- キルスイッチありの場合――VPNが切断されると、キルスイッチはトンネル経由でないすべてのトラフィックをブロックするファイアウォールルールをインストールします。Wi-Fiが復帰しても、VPNセッションが完全に復旧するまでアプリは何も送信できません。ウェブメールの同期リクエストはネットワークエラーで失敗しますが(アプリは再試行します)、素のインターフェース経由でデバイスからトラフィックが出ることはありません。
サイレントフォールバック問題こそ、キルスイッチが解決するために設計された核心的な問題です。「VPNがクラッシュして素の状態でブラウジングしている」という状況ではなく、はるかに微妙なケース――VPNが一時的に利用できない状態で、アプリがそれを知らず、その隙間で漏洩する――がポイントです。
3種類のキルスイッチ
ベンダーが「キルスイッチ」と言うとき、以下の3つのアーキテクチャのいずれかを意味している可能性があります。障害モードが異なるため、その違いは重要です。
1. システム全体のキルスイッチ(ファイアウォールベース)
最も強力なモデルです。VPNクライアントはOS上にファイアウォールルールをインストールします――macOSではpf、Windowsではウィンドウズフィルタリングプラットフォーム(WFP)、Linuxではiptablesまたはnftables、iOS/Androidではシステムネットワーク拡張機能を使います。このルールは、VPNサーバーのIPを宛先としないすべてのアウトバウンドパケットをドロップします。VPNが稼働しているとき、トンネル自体がVPNサーバーへのトラフィックをルーティングするため、パケットは通過します。VPNがダウンしているとき、「許可」ルールに一致するものがないため、すべてブロックされます。ファイアウォールルールは、VPNクライアントがクラッシュしても有効なままです。なぜならOSのファイアウォールは、そのルールをインストールしたアプリケーションから独立しているからです。
2. アプリレベルのキルスイッチ(アプリケーション単位)
すべてのトラフィックをブロックするのではなく、リストに追加した特定のアプリのみをブロックします。VPNが切断されると、それらのアプリはVPNが復旧するまでネットワーク接続を失います。他のアプリは通常どおり動作し続けます。これは非常に特定のシナリオ――特定のブラウザ、IRCクライアント、BitTorrentクライアントの保護――に役立ちますが、一般的な防御としては弱く、大きな攻撃対象領域が残ります(システムトレイアプリ、バックグラウンドサービス、OSコンポーネント、リストに追加し忘れたアプリなど)。
3. ネットワークレベルのファイアウォール(常時接続VPN)
特にAndroidでは、VPNアプリ自身が実装するキルスイッチよりも強力なプリミティブがあります。「常時接続VPN」というシステムレベルの設定で、「VPNなしの接続をブロック」を有効にしたものです。これはOS自体がルールを強制するものであり、どのアプリが要求していても、AndroidはVPN以外のトラフィックをまったくルーティングしません。VPNアプリがクラッシュしても、OSがラインを守ります。これはモバイルで利用可能な最も堅牢なキルスイッチの動作であり、アプリが実装したキルスイッチよりも絶対的に強力です。
各種類がOSレイヤーで実際にどう動くか
実装の詳細は障害モードを予測するために重要です。ファイアウォールベースのキルスイッチは、ファイアウォールAPIにバグがある場合に失敗します。アプリベースのキルスイッチは、アプリがクラッシュした場合に失敗します。OS強制の常時接続VPNは、セーフモードで再起動しない限り、実質的に失敗しません。
iOS実装――NetworkExtensionとオンデマンドルール
iOSはサードパーティのVPNアプリに文字通りの「キルスイッチ」APIを公開していません。公開しているのはNetworkExtensionフレームワークの「オンデマンドルール」メカニズムです。これは「例外に一致しないネットワーク接続をアプリが試みるたびに、まずVPNを接続させる」というルールです。VPNが確立できない場合、接続リクエストはハングします。ユーザーの視点からはキルスイッチのように動作しますが、実際には「VPNがダウンしていたらすべてブロック」ではなく「VPNを強制的にオンにする」ルールです。機能的な結果は似ており、実装が異なります。
NetworkExtension APIはまた、includeAllNetworksフラグ(iOS 14で追加)もサポートしており、VPNをシステムレベルのネットワークフィルターにします――カーネルやシステムサービスからのトラフィックも強制的にVPNを通過させます。このフラグが設定されると、VPNは本当にフルキルスイッチとして機能し、OSがトンネル外にトラフィックが出ないことを保証します。すべてのVPNベンダーがこれを有効にしているわけではなく、このフラグには互換性の影響があります。
Android実装――常時接続VPN+VPNなしの接続をブロック
Androidで最も強力なキルスイッチ動作は「設定」→「ネットワークとインターネット」→「VPN」→VPNの横の歯車アイコン→「常時接続VPN」と「VPNなしの接続をブロック」の2つのトグルにあります。両方がオンのとき、VPNアプリではなくAndroidシステム自体がVPN接続されるまでトラフィックのルーティングを拒否します。VPNアプリがクラッシュしても、強制終了されても、アンインストールされても、ルールは持続します。Androidの公式開発者ドキュメントにこのメカニズムの詳細が記載されています。これはコンシューマーモバイルデバイスにおけるキルスイッチ動作のゴールドスタンダードです。
macOS実装――システムネットワーク拡張機能
macOS 11(Big Sur)以降のVPNはシステム拡張機能フレームワーク経由で動作します――コンテンツフィルターやシステムレベルのネットワークフィルターをサポートするのと同じアーキテクチャです。キルスイッチは通常、VPNクライアントがインストールするパケットフィルタールール(pf)と、ルートテーブルの変更を保持するネットワーク拡張機能の組み合わせとして実装されます。VPNが切断されると、pfルールはそのまま残り、VPNが再確立されるまでトラフィックをブロックし続けます。VPNクライアント自体がクラッシュした場合の動作は、システム拡張機能がロードされたままの状態に設定されているかどうかによります――よく設計されたクライアントはルールをそのまま維持し、設計の悪いクライアントはクラッシュ時にルールを解除して漏洩させます。
Windows実装――Windowsフィルタリングプラットフォーム
Windows VPNは通常、Windowsフィルタリングプラットフォーム(WFP)のフィルタールールをインストールすることでキルスイッチを実装します。このルールは仮想VPNアダプター上のトラフィックを許可しながら、物理アダプター上のトラフィックをブロックします。フィルターはVPNクライアントプロセスの再起動後も持続します(ユーザースペースのアプリではなく、カーネルフィルターレイヤーが所有しているため)。そのため、VPNアプリがクラッシュしてもフィルターは残ります。リスクは、一部のVPNクライアントが低品質のファイアウォールルール戦略を使用していることです――たとえば、PowerShellやnetshを通じてWindowsDefenderファイアウォールを操作する方法は、他のファイアウォールルールや設定ミスによってバイパスされる可能性があります。
キルスイッチが失敗するとき――知っておくべき漏洩条件
キルスイッチは完璧な保証ではありません。キルスイッチが有効な状態でもトラフィックが漏洩する可能性がある、十分に文書化された条件があります。各VPNベンダーはこれらを異なる方法で処理しており、注意深い実装で対処されるものもあれば、OSレベルの協力なしには避けられないものもあります。
接続ブートストラップ中のDNSポイズニング
VPNサーバーに接続するために、VPNクライアントはまずサーバーのホスト名を解決する必要があります。キルスイッチが「VPNなしのトラフィック不可」を強制している場合でも、VPNクライアント自身がVPNサーバーを見つけるためにDNSルックアップを行う必要があるため、例外を設ける必要があります――これは小さな漏洩面です。悪意のあるローカルネットワークがDNSレスポンスをポイズニングして、VPNクライアントを偽サーバーにリダイレクトする可能性があります。ほとんどのクライアントは、VPNサーバーにハードコードされたIPを使用するか、TLS証明書をピン留めすることでこれを処理し、リダイレクトされたサーバーが検証に通らないようにします。安価なVPNクライアントはこのステップをスキップすることがあります。
IPv6の漏洩
ネットワークにIPv6接続があり、VPNクライアントのキルスイッチがIPv4トラフィックのみをブロックしている場合、キルスイッチが「有効」な状態でもIPv6トラフィックは素のインターフェース経由で流れ出す可能性があります。これは最も一般的な現実世界の漏洩モードの1つです。修正方法は、VPNクライアントが対応するIPv6ファイアウォールルールをインストールすることです。多くの古いクライアントはこれをしません。キルスイッチを有効にした後は、漏洩テストを実行してIPv6の漏洩を必ず確認してください。
キャプティブポータル(Wi-Fiサインインページ)
コーヒーショップ、空港、ホテルでは、インターネット(VPNサーバーを含む)にアクセスする前にキャプティブポータルでログインする必要があることがよくあります。厳格なキルスイッチは、キャプティブポータルがVPNサーバーではないため、キャプティブポータルへのアクセスを拒否します。ほとんどのVPNクライアントには「キャプティブポータルのためにキルスイッチを一時停止する」モードがあり、手動で有効にする必要があります。一時停止中は保護されていないため、キルスイッチが再びオンになるまで機密情報は閲覧しないでください。AndroidのOS標準の常時接続VPNは、システムのキャプティブポータル検出を通じてこれを少し洗練された方法で処理しますが、トレードオフは同じです。
アプリの一時停止とバックグラウンド再起動の競合
モバイルでは、OSがバッテリーを節約するためにVPNアプリを一時停止する場合があります。アプリが再開されると、トンネルが再確立される小さなウィンドウがあります。キルスイッチがOSレベルで実装されている場合(iOSのincludeAllNetworksまたはAndroidの常時接続VPN経由)、漏洩はありません。キルスイッチが純粋にアプリで実装されている場合、OSがアプリを再開したがVPNがまだ再接続していないウィンドウが一時的に存在する可能性があり、そのウィンドウ中にネットワーク呼び出しを行うアプリは漏洩します。
起動時の競合
デスクトップでは、起動からVPNクライアントが開始されるまでの間は保護されません。自動起動するネットワーク対応アプリ(メール、Slack、Steam、システム更新チェックなど)は多くの場合、VPNが起動する前に接続を行います。堅牢なキルスイッチは、ファイアウォールルールを起動時の永続ルールとしてインストールし、起動時でもVPNが接続されるまでトラフィックをブロックします。ほとんどのコンシューマーVPNクライアントはこれをしません。ルールはクライアントが起動した後にのみ適用されます。
キルスイッチの種類の比較
| 種類 | ブロック対象 | OSサポート | 一般的な障害モード |
|---|---|---|---|
| システム全体のファイアウォール | カーネルレベルのすべての非VPNトラフィック | macOS、Windows、Linux;iOSはincludeAllNetworks経由 | ルールがIPv4のみの場合のIPv6漏洩;起動時の競合;DNSブートストラップの例外 |
| アプリレベル(アプリ単位のブロックリスト) | リストされたアプリのトラフィックのみ | Windows、一部のmacOSクライアント | リストにないアプリは漏洩し続ける;OSコンポーネントが漏洩;システムサービスが漏洩 |
| OS強制の常時接続VPN | アプリのクラッシュに関係なくOSレベルのすべてのトラフィック | Android(常時接続VPN+VPNなしの接続をブロック)、iOS(NetworkExtensionオンデマンド) | キャプティブポータルへのサインインが一時停止するまでブロックされる;その他の障害モードはほとんどない |
| アプリケーションモニター(弱い形式) | 直接的なブロックなし;VPNが切断されたときに指定されたアプリを終了するだけ | 一部のWindowsクライアントがいまだにこれを搭載 | 検出と終了の間の競合で漏洩;実質的にキルスイッチではない |
「常時接続VPN」がアプリレベルのキルスイッチにはない何を提供するか
2026年において最も重要な区別は、ベンダーが実装したキルスイッチとOS強制の常時接続VPNの違いです。OS強制版が意味のある意味でより強力な理由は以下の通りです。
- VPNアプリのクラッシュに耐える。何らかの理由でVPNアプリがクラッシュした場合、アプリレベルのキルスイッチはそれと一緒に消えます。インストールしたファイアウォールルールが持続するかどうかは実装次第です。OS強制ルールはOS自体によって保持され、引き続き適用されます。
- 再起動に耐える。多くのアプリレベルのキルスイッチは、アプリ起動時にルールをインストールし、アプリ終了時に削除するため、起動時にギャップが生じます。OSレベルの常時接続設定は、起動後OSがルーティングする最初のネットワークパケットから適用されます。
- システムサービスをカバーする。クラウド同期、OS更新チェック、プッシュ通知デーモン、その他のOSレベルのサービスは通常のVPNクライアントのルーティングを通りません。OS強制の常時接続はこれらをカバーしますが、アプリレベルのキルスイッチはカバーしない可能性があります。
- ユーザーのミスによるバイパスができない。アプリレベルのキルスイッチには、アプリのUIにトグルがあります。ユーザー(または権限を持つ別のアプリ)がそれを無効にできます。OSレベルの常時接続はシステム設定にあり、誤って切り替えることが難しくなっています。
Androidでは、OS強制版を優先してください。システム設定で「常時接続VPN」と「VPNなしの接続をブロック」をオンにし、VPNクライアント独自のキルスイッチを補完的なものとして扱います。iOSでは、includeAllNetworksを有効にしているVPNクライアントを探してください。それが同等のフラグであり、同様の保証を提供します。
Casperのアプローチ――正直な答え
Casper's CloakはOS統合のキルスイッチを各プラットフォームで使用しています――iOSではincludeAllNetworksによりOS自体が漏洩防止ルールを強制し、Androidでは常時接続VPN設定、macOSではカーネルレイヤーのパケットフィルタールールを使用します。3つすべてで動作は同じです。トンネルが切断されると、IPv6を含むOSレベルのサービスを含むすべてのトラフィックが停止します。トンネルが復旧すると、トラフィックが再開されます。忘れるためのトグルも、維持するためのアプリ単位のリストも、IPv6の例外もありません。
これを脅威保護と脅威シールドと組み合わせて、既知の悪意あるドメインに対するアクティブなフィルタリングを行います。これによりトンネルは単なるルーティングレイヤーではなく、フィッシング、マルウェアのC2、既知の悪性インフラへの接続を積極的に拒否します。キルスイッチはトンネルが一時的に切断されたときにフィルタリングをバイパスするものがないことを保証するボトムレイヤーです。パブリックWi-Fi攻撃の解説で取り上げているような敵対的なネットワークでも、アプリレベルのみのキルスイッチが残す「2秒の平文」ウィンドウが生じません。
キルスイッチ全般に対する私たちの立場:これはプレミアム機能ではなく、ベースラインの期待値です。2026年においてキルスイッチを提供しないコンシューマーVPNは、基本的な安全機能を欠いています。これがシステムレベルで重要な理由のスレットモデリングの背景については、NSAのリモートアクセスVPNの選択とハードニングに関するガイダンスが、カーネルレベルの強制によって裏付けられたフルトンネルアーキテクチャを推奨する形で、アーキテクチャの理論を詳細に解説しています。
まとめ
「このVPNにキルスイッチはありますか」は間違った質問です。正しい質問は、スタックのどこでキルスイッチが強制されているか(アプリ、システム、またはOS)、IPv6をカバーしているか、アプリのクラッシュや再起動後も持続するか、そしてデフォルトでオンになっているかです。答えが「OSレベル」「はい」「はい」「はい」なら、キルスイッチは機能しています。答えが「アプリレベルのみ」「いいえ」「場合による」「デフォルトオフ」なら、名前だけのキルスイッチで実際の保護は得られません。
シンプルな実践方法:Androidでは「VPNなしの接続をブロック」を有効にしたシステムレベルの常時接続VPNをオンにします。iOSではincludeAllNetworksを有効にしているVPNクライアントを使用します。デスクトップでは、インストール後に漏洩テストを実行して確認し、VPNサーバー側から切断(またはネットワークケーブルを抜く)して、トラフィックが実際に停止することを確認します。漏洩テストで実際のIPアドレスが表示される場合、キルスイッチは宣伝通りに機能していません――信頼する前に調査してください。