Windows UWPアプリがプロキシに接続できないときの対処法|ループバック免除の設定と解除

Windows UWPアプリがローカルプロキシに接続できない原因と、クライアントのツールやCheckNetIsolationでループバック通信を許可する方法を解説します。

よくある症状:ブラウザーは使えるのに、特定のアプリだけ接続できない

Windowsのシステムプロキシを有効にすると、ブラウザーはクライアント経由でサイトに接続できるのに、特定のUWPアプリだけネットワークエラーが続き、クライアントの接続一覧にも通信が表示されないことがあります。この場合、AppContainerのネットワーク分離が原因かもしれません。アプリが 127.0.0.1:7890 などのローカルプロキシに接続しようとしても、mihomoコアに届く前にWindowsによってブロックされることがあります。

ループバック免除で解決できるのは「分離されたアプリからローカルサービスに接続できるかどうか」です。ノードの品質、サブスクリプションの無効化、プロキシルールの問題には効果がありません。原因がこの段階にあると確認できた場合にのみ、免除を追加してください。また、Microsoft Store経由で配布されているからといって、すべてがUWPアプリとは限りません。ストア内の従来型デスクトップアプリやパッケージ化されたWin32アプリには、同じ制限が適用されない場合があります。

ループバックアドレスとAppContainerのネットワーク分離

127.0.0.1 はIPv4のループバックアドレス、::1 はIPv6のループバックアドレスです。これらのアドレス宛ての通信は、現在使用しているPC内にとどまります。クライアントはHTTPポートまたは混合ポートをループバックアドレスにバインドし、アプリからのリクエストをそのポートで受け取ります。その後、mihomoコアがルールを照合し、外部へ接続します。

UWPアプリは通常、AppContainerの分離環境で動作します。Windowsはこうしたアプリからローカルのループバックサービスへのアクセスを制限しているため、システムプロキシがローカルを指していても、アプリが接続できないことがあります。CheckNetIsolation.exe のループバック免除機能を使うと、指定したアプリコンテナーに対するこの制限を解除できます。

免除を設定しても、アプリにプロキシが自動設定されるわけではなく、アプリマニフェストのネットワーク機能が追加されるわけでもありません。アプリがシステムプロキシを無視する場合、独自のネットワーク機能を使う場合、または企業ポリシーによる制限がある場合は、それぞれの設定や制限への対処が必要です。

作業前に確認:プロキシポートとシステム設定

待ち受けポートを確認する

まずクライアントで、使用中の設定とポートを確認します。以下では混合ポートの例として 7890 を使いますが、すべてのクライアントでの既定値ではありません。実際のポートが 7897 の場合は、以降のコマンドやシステム設定にも 7897 を指定してください。

mixed-port: 7890
allow-lan: false
bind-address: 127.0.0.1
mode: rule

以下はパラメーターの例であり、完全な設定ではありません。既存のサブスクリプション設定を上書きしないでください。ローカルのUWPアプリにループバック免除を設定するために、待ち受けアドレスを 0.0.0.0 に変更したり、「LAN内の接続を許可」を有効にしたりする必要はありません。リモートのサブスクリプション更新で直接記述した設定が上書きされる場合もあるため、クライアントの永続設定やオーバーライド機能を使ってください。

Windowsの接続先ポートを確認する

  1. Windows 11では「設定」→「ネットワークとインターネット」→「プロキシ」→「手動プロキシ セットアップ」→「プロキシ サーバーを使う」の横にある「セットアップ」を開きます。Windows 10では「設定」→「ネットワークとインターネット」→「プロキシ」を開きます。
  2. アドレスとポートが現在のクライアント設定と一致していることを確認します。クライアントがシステムプロキシを自動管理している場合は、設定が互いに上書きされないよう、クライアント側のスイッチから変更してください。
  3. PowerShellで以下の待ち受け状態を確認します。結果が表示されない場合は、まずコアを起動するかポートを修正してから、アプリの免除設定に進んでください。
Get-NetTCPConnection -State Listen -LocalPort 7890 |
  Select-Object LocalAddress, LocalPort, OwningProcess

curl.exe --proxy http://127.0.0.1:7890 --head --max-time 15 https://example.com/

curl.exe でプロキシを明示的に指定すると、そのポート経由でリクエストを完了できるか確認できます。HTTPレスポンスが返れば、このテスト経路で接続できています。タイムアウトする場合は、ノードとログを確認してください。このコマンドは通常のデスクトッププロセスで実行されるため、成功してもUWPのループバック制限が解除されたとは限りません。また、レスポンスだけで実際の出口が想定どおりかどうかも判断できません。

方法1:クライアント内蔵のループバック免除ツール

Windows向けクライアントの中には、ループバック免除ツールを備えたものがあります。メニュー名は「UWP Loopback」「Loopback」「ループバック免除」など、クライアントによって異なります。機能の場所はクライアントやバージョンによって変わるため、古いバージョンのメニュー手順をすべてのmihomoクライアントに当てはめないでください。

旧バージョンのClash for Windowsでは、「General」→「UWP Loopback」→「Launch Helper」から該当ツールを起動できます。このクライアントはすでにメンテナンスが終了しているため、既存環境での確認用に限ってください。この機能を使うために旧クライアントをインストールすることはおすすめしません。現在使用中のクライアントに同じ項目がない場合は、次のWindowsコマンドを使ってください。

  1. ツールを起動し、必要に応じて表示される管理者権限の確認に対応します。発行元とプログラムの入手元を確認し、出所不明の「修復ツール」は実行しないでください。
  2. アプリ一覧から問題のアプリを探し、パッケージ情報を確認してください。表示名が似ているという理由だけで選ばないようにします。
  3. 対象のアプリだけにチェックを入れ、ツールの保存または適用ボタンをクリックします。チェックを入れただけで保存していない場合、通常は免除リストに反映されません。
  4. 対象アプリを完全に終了してから、再度起動します。ウィンドウを閉じてもバックグラウンドで動作し続ける場合は、タスクマネージャーで該当するタスクを終了してからテストしてください。

GUIツールは通常、Windowsの免除機能を操作しやすくしたものです。設定後は CheckNetIsolation.exe LoopbackExempt -s を使って結果を個別に確認できます。ツールにアプリが表示されない場合は、現在のアカウントにインストールされているか、対象となるアプリの種類かを確認してください。

方法2:CheckNetIsolationで特定のアプリを追加する

ターミナルを管理者として開く

スタートメニューで「ターミナル」または「Windows PowerShell」を検索し、「管理者として実行」を選びます。以下の例ではPowerShellの構文を使います。管理者認証に別のアカウントを使う場合は、アプリパッケージの検索対象ユーザーに注意してください。「現在のユーザーにはインストールされていない」ことを、アプリが存在しないと誤認する可能性があります。

PackageFamilyNameを調べる

ループバック免除の -n オプションには、パッケージファミリー名 PackageFamilyName を指定します。デスクトップショートカット名や、バージョンとアーキテクチャを含む PackageFullName ではありません。まず、現在のユーザーにインストールされているパッケージを一覧表示します。

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

以下では、Microsoft Storeのパッケージを例に検索方法を説明します。ほかのアプリを調べる場合は、上の一覧から該当するパッケージを探して検索条件を置き換えてください。無関係なアプリに権限を追加しないようにします。

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

一般的な結果では、パッケージファミリー名は Microsoft.WindowsStore_8wekyb3d8bbwe ですが、必ず使用中のPCで表示された値を使ってください。検索結果が空の場合は、対象ユーザーとパッケージ名を確認します。ほかのPCのパッケージ名をネット上で見つけて推測しないでください。

免除を追加して一覧を確認する

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

CheckNetIsolation.exe LoopbackExempt -s

-a は追加、-s は登録済みの免除一覧を表示するオプションです。一覧にはアプリコンテナー名とSIDが表示されることがあるため、対象のパッケージがあるか確認してください。「アクセスが拒否されました」と表示された場合は、ターミナルを管理者権限で起動したか確認します。アプリコンテナーが見つからない場合は、パッケージファミリー名とインストール状況を再確認してください。

検索で対象パッケージを正確に特定できた場合は、PowerShellの変数を使うと手入力やコピー時のミスを減らせます。

$app = Get-AppxPackage -Name Microsoft.WindowsStore
if ($null -ne $app) {
    CheckNetIsolation.exe LoopbackExempt -a "-n=$($app.PackageFamilyName)"
} else {
    Write-Output "現在のユーザーに指定したアプリパッケージが見つかりません。"
}

結果を確認:接続、ルール、出口を切り分ける

検証時は、同じネットワーク、同じ設定、同じ操作で条件をそろえます。クライアントの接続画面を開いてから、アプリで問題のページを再読み込みするか、ログインを試してください。アプリのホーム画面にキャッシュ済みの内容が表示されるかどうかだけで、成功と判断しないでください。

確認できた状態考えられる問題箇所次に行うこと
免除リストに対象パッケージがない権限またはパッケージ名管理者ターミナルで再検索して追加する
対象パッケージは一覧にあるが、接続記録がないアプリがプロキシを使っていない、またはリクエストが送信されていないアプリを再起動し、システムプロキシとアプリのネットワーク設定を確認する
接続は表示されるが、ポリシーがDIRECTになっているルールによる振り分け適用されたルールを確認し、プロキシポリシーを使うべき通信か判断する
プロキシポリシーに入った後、接続がタイムアウトするノード、DNS、または接続先ネットワークコアのログと選択中のノードの状態を確認する
ネットワーク接続は成功するが、アカウント操作に失敗するアプリのサービスまたはアカウントの地域設定サービスの稼働状況、アカウント、エラーコードを確認する

クライアントにプロセス名が表示される場合は、対象アプリの特定に役立ちます。表示されない場合は、リクエストの時刻とドメイン名を手がかりにしてください。ログにDNS、TLS、認証エラーがある場合は、それぞれの経路を調べます。同じ免除を繰り返し追加しないでください。一時的にグローバルモードへ切り替えるとルールの影響を切り分けられますが、テスト後は元のモードに戻してください。

TUNモードとループバック免除の違い

システムプロキシは、利用するアプリにプロキシアドレスを渡します。一方、TUNモードは仮想ネットワークインターフェースとルーティングを使って、対象の通信を処理します。接続方法は異なります。アプリがシステムプロキシを参照しない場合、ループバック免除を設定しても自動的にプロキシを使い始めるわけではありません。その場合は、クライアントのTUNモードを検討してください。

ただし、TUNを有効にしてもAppContainerのネットワーク制限がすべて解除されるとは限りません。アプリが制限対象のループバックポートに直接接続しようとする場合は、その制限を個別に対処する必要があります。TUNで通信を取り込めるかどうかは、権限、ルート、DNS、インターフェースの除外ルール、ほかのVPNソフトの影響にも左右されます。

免除の解除とその後の管理

ローカルプロキシへのアクセスが不要になった場合や、問題がループバックと無関係だと分かった場合は、追加した免除を削除できます。以下では同じパッケージ例を使い、この項目だけを解除します。ほかのアプリの既存設定には影響しません。

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

CheckNetIsolation.exe LoopbackExempt -s

-d は指定した項目を削除するオプションです。実行後に一覧を再表示し、対象項目が削除されたことを確認してください。作業前に一覧を保存しておくと、今回追加する項目とデバイスにもともとあった設定を区別できます。

同じパッケージファミリー名が維持される通常の更新では、免除を追加し直す必要はほとんどありません。アンインストール後の再インストール、配布元の変更、パッケージIDの変更があった場合は、もう一度検索してください。基本的な確認手順は、ポートの稼働確認、アプリの種類の確認、対象パッケージへの免除追加、アプリの再起動、接続とルールの確認です。接続できているのにアプリの機能が失敗する場合に限り、ノード、DNS、アカウント関連サービスを調べてください。

Clash をダウンロード