まず確認:接続に失敗するのは隔離されたアプリだけか

ブラウザーでは問題なくアクセスできるのに、Microsoft Storeや特定のUWPアプリがオフラインと表示されても、ノードの障害とは限りません。Windowsのシステムプロキシが 127.0.0.1:7890 を指していて、対象アプリがAppContainerで動作している場合は、ローカルのループバックアドレスへの接続が制限されていないか確認しましょう。この場合、リクエストがClashのコアに届いていない可能性があり、プロキシルールを変えたり、サブスクリプションを何度も更新したりしても解決しないことがあります。

この記事は、Windows 10/Windows 11でローカルHTTPプロキシまたは混合ポートを使っている場合のトラブルシューティングを対象としています。7890は説明用のポート番号です。実際の値はクライアントの設定を確認してください。サイトのブランド名はClash for Macですが、ここで紹介するコマンドはWindowsで実行するものであり、macOSのターミナルでは使えません。

  • ブラウザーも対象アプリも接続できない:まずサブスクリプションが読み込まれているか、プロキシグループで利用可能なノードが選択されているか、ローカルポートが待ち受けているかを確認します。
  • ブラウザーは接続できるが、特定のUWPアプリだけ失敗する:ループバック制限が原因の可能性があります。ただし、アプリ側のサービス障害も切り分けてください。
  • クライアントに対象のリクエストが記録されている:リクエストはクライアントに届いています。マッチしたルール、接続先、接続エラーを確認してください。
  • ダウンロードやログインの一部だけ失敗する:バックグラウンドサービス、別のパッケージ、異なるネットワークスタックが関係している可能性があります。単一アプリのループバック権限が原因だと決めつけないでください。

AppContainerがローカルプロキシに接続できない理由

システムプロキシ経由の一般的なリクエスト経路は次のとおりです。アプリがシステムプロキシの設定を読み取り、HTTPリクエストまたはHTTPSのCONNECTリクエストをローカルプロキシのポートに送信し、コアがルールに従って直接接続するかプロキシノードを使うかを選択します。ここでの 127.0.0.1 はIPv4のループバックアドレスで、接続先はリモートノードではなく現在のWindows PCです。

AppContainerはアプリを隔離された環境で実行します。既定のネットワーク分離ポリシーでは、AppContainer内のアプリがローカルのループバックサービスへ直接接続できないことがあります。プロキシプロセスがポートを待ち受けていて、通常のデスクトップブラウザーから接続できる場合でも、隔離されたアプリはプロキシに到達する前にブロックされる可能性があります。

ループバック免除で変わること

CheckNetIsolation.exeのLoopbackExemptサブコマンドで、ループバック免除を管理できます。指定したパッケージを追加すると、そのAppContainerに適用されるループバック制限を解除できます。ただし、システムプロキシを自動で有効にしたり、サブスクリプションをインポートしたり、プロキシグループを選択したり、アプリに必要なネットワーク機能を追加したりするものではありません。

設定主な役割別途確認が必要な項目
システムプロキシ設定に従うアプリにプロキシのアドレスとポートを通知アプリが設定を参照しているか、ポートが待ち受けているか
ループバック免除指定したAppContainerのループバックアクセス制限を解除プロキシプロトコル、ルールによる振り分け、ノードの状態
TUNモード仮想ネットワークアダプターとルーティングで対象のIP通信を取り込むルーティング、DNS、権限、その他のネットワークフィルターポリシー

「LAN接続を許可」を有効にしても、通常この問題は解決しません。この設定は主にプロキシの待ち受け範囲を変更するものです。LANからポートに接続できるようにしても、AppContainerにループバック権限が付与されるわけではありません。また、ポートにアクセスできる範囲が広がります。

作業前にプロキシのアドレスと待ち受けポートを確認

  1. クライアントの設定を開き、「混合ポート」またはHTTPプロキシポートを確認します。実際のポート番号を控えてください。SOCKS専用ポートをHTTPプロキシのポートとして使わないよう注意します。
  2. Windows 11では「設定」→「ネットワークとインターネット」→「プロキシ」→「手動プロキシ セットアップ」→「プロキシ サーバーを使う」の「セットアップ」を開きます。Windows 10では、同じ名前の「プロキシ」ページで手動プロキシの設定を確認できます。
  3. アドレスとポートを確認します。たとえば、アドレスが127.0.0.1、ポートが7890になっていることを確認してください。クライアントの「システムプロキシ」も有効になっている必要があります。
  4. システムプロキシの設定を複数のソフトが上書きしないよう、ほかのプロキシソフトを一時的に終了します。原因を調べる際は、通信経路を一つに絞るのがおすすめです。

PowerShellで次のコマンドを実行すると、ローカルのTCPポートと明示的なプロキシリクエストをそれぞれ確認できます。

Test-NetConnection -ComputerName 127.0.0.1 -Port 7890

curl.exe --proxy http://127.0.0.1:7890 --head --max-time 20 https://www.microsoft.com/

TcpTestSucceeded : TrueはTCP接続の成功を示すだけで、プロキシプロトコル、TLS、リモートノードが正常であることまでは保証しません。2つ目のコマンドはHTTPプロキシを明示してリクエストし、最大20秒待機します。実際に別のポートを使っている場合は、コマンド内のポート番号も変更してください。Windows PowerShellで同名のエイリアスによる引数の違いを避けるため、ここではcurl.exeを使います。

これらのコマンドは通常のデスクトッププロセスから実行されるため、UWPアプリにループバックアクセス権があることの確認にはなりません。目的はプロキシの入口が使えることを先に確かめ、ポート番号の誤りを隔離の問題と取り違えないようにすることです。

方法1:クライアント付属のループバックツールを使う

Windows向けクライアントの中には、UWPのループバックを補助するツールが付属しているものがあります。旧版Clash for Windowsでは、一般的にGeneral → UWP Loopback → Launch Helperから起動します。これは特定のクライアントにあるメニューであり、すべてのClashまたはmihomoのGUIクライアントに共通するものではありません。このツールを使うために旧クライアントへ切り替える必要もありません。

  1. クライアントのローカルプロキシポートが使える状態になっていることを確認してから、ループバック補助ツールを開きます。
  2. Windowsのユーザーアカウント制御が表示されたら、プログラムの入手元を確認してから許可します。ループバック免除の変更には、通常、管理者権限が必要です。
  3. 一覧から対象アプリを探します。アプリ名とパッケージ情報を確認し、ローカルプロキシを使う必要があるものだけを選択してください。
  4. ツールに表示される保存または適用ボタンをクリックします。ツールによっては英語でSave Changesと表示されます。実際の画面表示に従ってください。
  5. 対象アプリを完全に終了してから起動し直し、失敗した操作をもう一度試します。ウィンドウを閉じただけでは、バックグラウンドプロセスが終了しないことがあります。

一覧に対象アプリがない場合は、まず現在のユーザーアカウントにそのアプリがインストールされているか確認します。名前が似ているだけの別パッケージを選択したり、すべてのアプリに一括で権限を付与したりするのは避けてください。補助ツールがない場合は、次のセクションで紹介するシステムコマンドを使えます。追加した項目の確認と削除もできます。

方法2:CheckNetIsolationで指定したパッケージを追加

1. PackageFamilyNameを調べる

対象アプリをインストールしたWindowsユーザーのセッションでPowerShellを開きます。ここでは例としてMicrosoft Storeのパッケージファミリー名を調べます。

Get-AppxPackage -Name Microsoft.WindowsStore |
    Select-Object Name, PackageFamilyName

Microsoft Storeの一般的なパッケージファミリー名はMicrosoft.WindowsStore_8wekyb3d8bbweです。作業前に、必ずこのPCで取得した結果を確認してください。コマンドで指定するのはPackageFamilyNameです。バージョンやアーキテクチャなどを含むPackageFullNameや、ストアページの製品IDを誤って指定しないでください。

対象パッケージの内部名が分からない場合は、まず現在のユーザーのパッケージ一覧を表示し、出力から確認できます。

Get-AppxPackage |
    Sort-Object Name |
    Select-Object Name, PackageFamilyName

結果が表示されない場合は、サインイン中のユーザーとアプリのインストール先アカウントが一致しているか確認してください。別の管理者アカウントで権限を昇格すると、パッケージを検索するコンテキストも変わることがあります。特に複数人で共有するPCでは、-AllUsersを安易な解決策として使わないでください。

2. 現状を記録して免除を追加

スタートボタンを右クリックし、「ターミナル(管理者)」または「Windows PowerShell(管理者)」を選択します。まず現在の一覧を確認し、パッケージ名を確認してから免除を追加します。

CheckNetIsolation.exe LoopbackExempt -s

CheckNetIsolation.exe LoopbackExempt -a -n="Microsoft.WindowsStore_8wekyb3d8bbwe"

CheckNetIsolation.exe LoopbackExempt -s
  • -s:現在のループバック免除一覧を表示します。
  • -a:免除項目を追加します。
  • -n:パッケージファミリー名を指定します。ほかのアプリを調べる場合は、検索で取得した正確な名前を使ってください。

追加前に一覧を保存またはコピーしておくと、もともと登録されていた項目を確認できます。一覧には名前とSIDが表示されることがあるため、成功メッセージが出たかだけでなく、対象パッケージに対応する項目を確認してください。「アクセスが拒否されました」と表示されたら、まずターミナルが管理者権限で起動しているか確認します。パッケージ名を何度も変えて試すのは避けてください。

3. アプリを再起動してリクエストを再現

対象アプリを終了します。必要に応じてタスクマネージャーでプロセスを終了してから、もう一度起動してください。プロキシグループ、ネットワーク、テスト内容は変えず、たとえばストアのトップページを再読み込みします。こうすることで、免除の追加前後を比較できます。通常、PC全体を再起動する必要はありません。ネットワークのリセットやDNSの変更も同時に行うと、どの操作が効いたのか分からなくなります。

追加しても解決しない場合:リクエスト経路に沿って確認

クライアントに新しい接続が表示されない

実際にネットワークリクエストを送信するパッケージに免除を追加したか確認し、次にシステムプロキシのアドレス、ポート、バイパスリストを確認します。システムプロキシを参照しないアプリもあれば、ダウンロードをバックグラウンドサービスが実行するアプリもあります。前面のアプリだけに免除を追加しても、バックグラウンドサービスの通信には影響しない場合があります。

netsh winhttp set proxyを、すべてのストアアプリに使える万能な修正方法だと考えないでください。WinHTTPプロキシと現在のユーザーのシステムプロキシは別の設定です。変更してもシステムサービスに影響するだけで、対象アプリには反映されないことがあります。

クライアントに接続は表示されるが、想定した出先にならない

接続画面で対象ドメイン、マッチしたルール、実際の出先を確認します。ループバック免除によってルールの優先順位が変わることはありません。リクエストがDIRECTにマッチした場合は、引き続き直接接続されます。リクエストがクライアントに届いていると確認できた場合に限り、ルールモードとグローバルモードを一時的に比較すると診断に役立ちます。テスト後は元の出先モードに戻してください。

TUNを有効にすると状況が変わる

TUNモードでは、システムプロキシを使わないアプリの通信の一部を取り込めますが、Windowsのネットワーク分離を無効にするわけではありません。アプリが引き続きローカルプロキシに接続する設定なら、ループバック制限が関係する可能性があります。「システムプロキシを有効、TUNを無効」の場合と、「クライアントの指示に従って設定したTUN経由」の場合を分けてテストし、違いを記録してください。両方を同時に有効にしただけで、原因を特定できたと判断しないようにしましょう。

元に戻す方法:今回追加した項目だけを削除

ローカルプロキシへのアクセスが不要になったら、同じ補助ツールで対象アプリの選択を外して保存するか、管理者ターミナルから削除コマンドを実行します。以下ではMicrosoft Storeを例に説明します。

CheckNetIsolation.exe LoopbackExempt -d -n="Microsoft.WindowsStore_8wekyb3d8bbwe"

CheckNetIsolation.exe LoopbackExempt -s

-dは指定した項目を削除します。実行後に対象アプリを再起動し、一覧と実際の動作を確認してください。今回追加した項目だけを削除し、開発ツールやほかのアプリが以前から設定している免除は残します。単一アプリの設定を戻すために、一覧全体を消去しないでください。

ループバック免除とシステムプロキシの設定は独立しています。クライアントのシステムプロキシを無効にしても免除は自動で削除されず、免除を削除してもWindowsのプロキシ設定は元に戻りません。クライアントの使用を停止する場合は、「設定」→「ネットワークとインターネット」→「プロキシ」も別途確認し、待ち受けが停止したローカルポートがシステムプロキシに設定されたままにならないようにしてください。

よくある質問

ループバック免除を追加すれば、アプリは必ずプロキシを使いますか?

必ずしもそうではありません。免除で解除されるのは、対象AppContainerのループバックアクセス制限だけです。アプリがローカルプロキシのアドレスを使い、クライアントが正しいポートで待ち受け、利用可能な設定がある必要があります。直接接続するかプロキシを使うかは、出先モードとマッチしたルールにも左右されます。

サブスクリプションやノードを変更したら、免除を追加し直す必要がありますか?

通常は必要ありません。免除はパッケージの識別情報に紐づいており、ノード、サブスクリプションURL、ローカルポートには紐づきません。アプリの更新後もパッケージファミリー名が変わらなければ、通常は再登録不要です。アンインストール後に再インストールして動作が変わった場合は、パッケージの識別情報と免除一覧を確認し直してください。

localhostと127.0.0.1に違いはありますか?

localhostはIPv4またはIPv6のループバックアドレスに解決されることがあります。プロキシが127.0.0.1だけで待ち受けているのに、接続先として::1が使われると接続に失敗します。トラブルシューティングでは、まず明示的なIPv4アドレスで待ち受け状態を確認してください。ただし、これでAppContainerの分離を回避できるわけではありません。

すべてのアプリに一括で免除を追加したほうがよいですか?

おすすめしません。アプリごとに追加すると動作を確認しやすく、元に戻すのも簡単です。追加前の一覧を保存し、対象のパッケージファミリー名を記録して、必要な項目だけを変更する方法が日常的なトラブルシューティングに適しています。