TUNモードとシステムプロキシの本質的な違い
Clashクライアントでよく見かける「システムプロキシ」と「TUNモード」は、強弱の異なる2つのスイッチではなく、通信を取り込む経路が異なります。システムプロキシはHTTPおよびHTTPSプロキシのアドレスをOSに設定し、一般的な待受アドレスは 127.0.0.1:7890 です。ブラウザーやチャットツールなど、システムプロキシ設定を参照するアプリは接続をClashに渡しますが、システムプロキシを無視するアプリはそのまま直接通信します。
TUNモードでは仮想ネットワークアダプターを作成し、システムのルーティングテーブルに対応する経路を追加します。ルーティング条件に一致するIPパケットはまず仮想ネットワークアダプターに入り、その後mihomoカーネルが宛先を識別してルールと照合し、プロキシ、直接接続、拒否のいずれかを決定します。つまりTUNが取り込むのはネットワーク層の通信であり、各アプリがHTTPやSOCKSプロキシを理解する必要はありません。
| 比較項目 | システムプロキシ | TUNモード |
|---|---|---|
| 接続位置 | アプリ層のプロキシ設定 | 仮想ネットワークアダプターとシステムルーティング |
| 代表的なポート | 混合ポート 7890 | 仮想ネットワークアダプターがIPパケットを受け取るため、アプリ側でポートを指定する必要はありません |
| 対象アプリ | ブラウザーおよびシステムプロキシに対応するアプリ | ランチャー、コマンドラインツール、ゲームなど、直接通信するアプリ |
| UDP対応 | アプリとプロキシプロトコルに依存 | UDPも取り込めますが、ノードとプロトコル側の対応も必要です |
| 必要な権限 | 通常は一般ユーザー権限 | サービス、ネットワーク拡張機能のインストール、またはVPN権限の付与が必要 |
TUNを有効にすると便利なケース
- ブラウザーは接続できるのに、ゲームランチャー、ストアクライアント、デスクトップアプリだけが常に直接接続される。
git、パッケージマネージャーなどのコマンドラインプログラムがシステムプロキシを参照しない。- アプリがUDPやQUICを使用しており、HTTPプロキシの設定だけでは対応できない。
- アプリごとに
HTTP_PROXY、HTTPS_PROXY、またはSOCKS5アドレスを設定したくない。 - 同じClashルールで、このPC上のより多くの接続を一元的に処理したい。
Web閲覧だけなら、通常はシステムプロキシのほうが簡単で、問題が起きた際の切り分けも容易です。TUNはルーティングとDNSの処理経路を変更するため、実際に通信を取り込む必要がある場合に適しています。インストール後に必ず有効にする機能ではありません。
有効化の前に権限とサービスを準備する
ここでは、mihomoカーネルを使用するClash Verge Rev 2.xの設定構成を例に説明します。クライアントによって項目の位置は多少異なりますが、準備作業はほぼ同じです。カーネルが仮想ネットワークアダプターを作成してルートを書き込み、アプリの終了や再起動時に設定を正しく解除できるだけの権限が必要です。
Windows:サービスモードをインストールする
- ほかのVPN、ネットワーク高速化ツール、仮想ネットワークアダプター関連ツールを終了し、初回インストール時のルート競合を避けます。
- クライアントを開き、「設定」→「システム設定」→「サービスモード」に進みます。
- 「インストール」を選び、Windowsユーザーアカウント制御の画面で管理者権限を許可します。
- インストール後、サービスの状態が「実行中」になっていることを確認し、「プロキシ」ページで「TUNモード」を有効にします。
- 初回の有効化後は、仮想ネットワークアダプターとルートの初期化が完了するまで3~10秒ほど待ちます。
サービスモードでは、管理者権限を持つバックグラウンドサービスが仮想ネットワークアダプターとルートを処理し、グラフィカルインターフェースは一般ユーザーとして実行できます。インストールボタンを押しても状態が変わらない場合は、クライアントを完全に終了し、「管理者として実行」で一度起動してから再インストールしてください。企業PCでサービスのインストールが制限されている場合は、端末管理者の許可が必要です。
macOS:補助プログラムまたはネットワーク拡張機能を許可する
- クライアントの「設定」→「システムサービス」または「サービスモード」に進み、補助プログラムをインストールします。
- システムパスワードまたはTouch IDの確認画面で操作を許可します。
- システムがネットワークコンポーネントをブロックした場合は、「システム設定」→「プライバシーとセキュリティ」を開き、ページ下部で該当コンポーネントを許可します。
- クライアントに戻ってTUNを有効にします。VPN構成の追加許可を再度求められた場合は、「許可」を選びます。
macOSのアップデート後は、古い補助プログラムの再認証が必要になる場合があります。パスワードを何度も求められる、TUNスイッチが自動的に戻るといった場合は、まずクライアントのサービスモードをアンインストールしてシステムを再起動し、現在のクライアントから再インストールしてください。2つのClashグラフィカルクライアントのシステムサービスを同時に残さないでください。
Android:VPN接続の権限を確認する
AndroidのClash Meta系クライアントは通常、システムのVPNServiceを使ってローカルの仮想ネットワークアダプターを構築します。「設定」→「ネットワーク」→「TUN」を開くと、システムにVPN接続の確認画面が表示されます。許可すると、ステータスバーに鍵またはVPNのアイコンが表示されます。Androidでは同時に1つのVPNサービスしか維持できないため、既存の企業VPN、WireGuard、その他のプロキシアプリは切断されます。
Clash TUNの推奨パラメーター設定
多くのデスクトップ環境では、まず stack: mixed、auto-route: true、auto-detect-interface: true に設定し、Clash DNSで53番ポートの問い合わせを処理する構成がおすすめです。以下はmihomo 1.19系で認識できる基本設定の例です。
mixed-port: 7890
allow-lan: false
mode: rule
log-level: info
tun:
enable: true
stack: mixed
auto-route: true
auto-detect-interface: true
strict-route: true
dns-hijack:
- any:53
dns:
enable: true
listen: 0.0.0.0:1053
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
default-nameserver:
- 223.5.5.5
nameserver:
- https://dns.alidns.com/dns-query
グラフィカルクライアントは、これらの項目の一部を自動生成または上書きすることがあります。クライアントに「TUNスタック」「自動ルート」「DNSハイジャック」のスイッチがある場合は、優先して画面上で変更し、サブスクリプションが生成した読み取り専用設定を同時に編集しないでください。サブスクリプションの更新で設定本文が上書きされても、クライアントに保存した全体上書き設定は通常そのまま適用されます。
スタックの選択:通常はmixedから始める
| スタック | 特徴 | 推奨用途 |
|---|---|---|
| mixed | システム側とユーザー空間の処理経路を組み合わせ、互換性と性能を両立 | Windows、macOSでの一般的な第一選択 |
| system | システムのネットワークスタックへの依存が大きく、リソース使用量は通常少なめ | mixedと特定のアプリが競合する場合の検証用 |
| gVisor | ユーザー空間のネットワークスタックを使用し、分離方法と互換性の経路が異なる | 特定のUDP通信やシステムスタックに異常がある場合の切り分け用 |
スタック名が高機能に見えるからといって、頻繁に切り替えないでください。まずmixedで実行し、Webページ、DNS、ダウンロード、取り込み対象のアプリを順にテストします。特定の接続だけが失敗する場合に、system、次にgVisorを試してください。変更するたびにTUNを完全に切断してから再度有効にします。
自動ルートと出口インターフェースの自動検出
auto-route: true は、取り込みに必要なルートをカーネルが自動的に書き込む設定です。auto-detect-interface: true は、現在実際に使用している出口ネットワークアダプターを検出します。ノートPCで有線からWi-Fiへ、家庭内ネットワークからスマートフォンのテザリングへ切り替えた場合も、自動検出によりプロキシ接続が再びTUNへ送り返される可能性を抑えられます。
strict-route: true はルーティングの制約を強め、Windowsでは一部のDNS問い合わせが取り込み経路を迂回するのを抑える効果もあります。ただし厳格なルート設定は、LAN探索、仮想マシンのブリッジ接続、企業内ネットワークに影響する場合があります。有効化後にプリンター、NAS、社内ネットワークへアクセスできなくなったら、TUN全体を無効にするのではなく、まずstrict-routeを一時的に無効にして比較してください。
DNSハイジャックでany:53がよく使われる理由
dns-hijack: any:53 は、取り込んだ通信に含まれる従来型のUDP/TCP 53番ポートへの問い合わせをmihomoのDNSモジュールに渡します。これにより、ドメイン解決の結果とルール判定を一致させやすくなり、アプリがシステムDNS設定を迂回するケースも減らせます。アプリ内蔵のDoHを自動的に取り込む設定ではありません。DoHは特定サーバー宛てのHTTPS通信であるため、ドメインまたはIPルールで別途処理する必要があります。
198.18.0.1/16 はfake-ipでよく使われるアドレス帯です。アプリがドメインを問い合わせると、まずこの範囲のマッピングアドレスが返され、カーネルがマッピングから元のドメインを復元してルールと照合します。LAN機器、プリンターのドメイン、実IPに依存する一部アプリで問題が起きた場合は、該当ドメインをfake-ipのフィルターリストに追加してください。一般のパブリックアドレス帯へ安易に変更するのは避けます。
画面で有効にしてから通信の取り込みを確認する手順
- 「設定」ページで利用可能な設定を更新して選択し、少なくとも1つのノードに正常接続できることを確認します。
- 実行モードを「ルール」に設定し、テスト中に全通信向けのグローバルポリシーが影響しないようにします。
- 「設定」→「Clash設定」→「TUN」に進み、スタックをmixedに設定します。
- 「自動ルート」「出口ネットワークアダプターの自動検出」「DNSハイジャック」を有効にします。
- サービスモードがインストール済みで実行中であることを確認し、TUNのメインスイッチをオンにします。
- まずシステムプロキシに対応するブラウザーでテストし、その後、従来システムプロキシでは取り込めなかったアプリをテストします。
- クライアントの接続ログを開き、対象ドメインが表示されるか、最終的にどのルールとポリシーグループに一致したかを確認します。
動作を確認するには、「システムプロキシ」を一時的に無効にしてTUNだけを残します。ブラウザーと対象アプリが引き続きClashのルールに従って接続できれば、仮想ネットワークアダプター経由の経路は機能しています。テスト後にシステムプロキシを再び有効にするかはクライアントの実装によります。mihomoは通常、2つの入口を同時に処理できますが、切り分け中は一度に1つだけ有効にすると状況が分かりやすくなります。
Windowsで仮想ネットワークアダプターとルートを確認する
PowerShellで次のコマンドを実行すると、現在のネットワークアダプターとIPv4ルートを確認できます。クライアントによって作成されるアダプター名には、Mihomo、Clash、Metaなどが含まれる場合があります。
Get-NetAdapter | Sort-Object Status, Name
Get-NetRoute -AddressFamily IPv4 |
Sort-Object RouteMetric |
Select-Object -First 20
仮想ネットワークアダプターがUp状態になり、ルーティングテーブルにTUNが管理する項目が表示されるはずです。デフォルトルートが仮想ネットワークアダプターに変わったかどうかだけで成否を判断しないでください。OSやカーネルのバージョンによっては、分割ルート、ポリシールーティング、より具体的なルート項目が使われることがあります。
Webページの結果だけでなく、ログでルールを確認する
「ログ」ページを開き、レベルをinfoに設定します。テスト対象のアプリを起動すると、対象アドレス、ネットワーク種別、適用されたポリシー(TCP、UDP、MATCH、DIRECT、具体的なプロキシグループなど)が表示されます。該当する接続がまったくない場合は、通信がカーネルに入っていません。ログはあるもののDIRECTと表示される場合は、ルールの順序を確認します。プロキシを選択済みなのにタイムアウトする場合は、ノード、UDP対応、リモートサービスを確認してください。
TUN有効化後にインターネットへ接続できない場合の切り分け順
切り分け中にスタック、DNS、ノード、ルールを同時に変更しないでください。「サービス権限 → 仮想ネットワークアダプター → DNS → ルール → ノード」の順に段階的に確認すると、問題箇所を早く特定できます。
| 症状 | 優先して確認する項目 | 対処方法 |
|---|---|---|
| TUNスイッチがすぐオフに戻る | サービスモードまたは管理者権限 | システムサービスを再インストールし、クライアントを再起動してから有効にする |
| IPアドレスには接続できるが、ドメインを開けない | DNSモジュールと53番ポートのハイジャック | dns.enable、dns-hijack、上流DNSが利用可能か確認する |
| Webは使えるが、ゲームや音声通信が失敗する | UDP、QUIC、ノードの対応状況 | UDPログを確認し、別のノードまたはスタックを試す |
| LAN機器にアクセスできない | strict-routeとプライベートアドレス帯のルール | 厳格なルートを無効にして確認し、LANのアドレス帯にDIRECTを追加する |
| スリープ復帰後にネットワークへ接続できない | 出口ネットワークアダプターの変更と残留ルート | TUNをいったん無効にして再度有効にし、必要に応じてシステムサービスを再起動する |
| 特定のアプリだけ失敗する | アプリ内蔵DNS、IPv6、証明書ポリシー | そのアプリの接続ログを確認し、IPv4とUDPを個別にテストする |
ステップ1:基本設定とノード自体が使えることを確認する
TUNを無効にし、システムプロキシを有効にして、ブラウザーで現在のノードをテストします。この状態でも接続できない場合、問題は仮想ネットワークアダプターではありません。まず設定、ポリシーグループ、ノードの状態を確認してください。TUNは通信がカーネルへ入る方法を変えるだけで、無効なノードを修復するものではありません。
ステップ2:DNS障害とルーティング障害を切り分ける
ドメインでは接続できないのに、既知のIPアドレスにはアクセスできる場合は、まずDNSを確認します。クライアントログにDNS問い合わせがない場合は、dns.enable と53番ポートのハイジャックを確認します。問い合わせはあるものの上流がタイムアウトする場合は、到達可能な上流DNSへ変更し、プロキシサーバーのドメイン解決に使うブートストラップDNSへ直接アクセスできることも確認してください。
ドメインを解決できるのにTCP接続がログにまったく現れない場合は、ルートが書き込まれていない、仮想ネットワークアダプターが起動していない、別のVPNが先に通信を取り込んでいる可能性が高いです。まず他のVPNとネットワークフィルターツールを終了し、TUNを一度無効にしてから再度有効にします。
ステップ3:LANと仮想マシンのネットワークを処理する
代表的なプライベートアドレス帯は 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16 です。家庭用ルーター、NAS、プリンターは通常DIRECTに一致させます。ルールはフォールバックのMATCHより前に置きます。例:
rules:
- IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
- IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- MATCH,ノード選択
仮想マシンやコンテナのネットワークもこれらのアドレス帯を使う場合があるため、すべてのプライベートアドレスを機械的にTUNの対象外にしてはいけません。仮想マシン内部の通信をプロキシ経由にする必要がある場合は、まず通信がホストのどのネットワークアダプターを通っているかを確認し、DIRECTルール、ルート除外、仮想マシン内での個別プロキシ設定のいずれかを選びます。
性能、IPv6、長期運用のポイント
TUNは仮想ネットワークアダプターとユーザー空間の処理を1層追加しますが、日常的なWeb閲覧やダウンロード速度は、通常ノードの遅延、回線の混雑、プロトコル、リモートサーバーの制限に大きく左右されます。性能を比較する際は、同じノードと同じ対象ファイルを使い、TUNを無効・有効にした結果をそれぞれ少なくとも3回測定してください。1回だけの速度テストでは、キャッシュや一時的な回線変動の影響を受けやすくなります。
CPU使用率が高い場合は、まずログレベルをdebugからinfoに戻し、継続的な接続テストを止めてから、具体的なプロセスを確認します。大量のUDPセッション、P2Pソフト、頻繁なDNS問い合わせは、接続数を大幅に増やすことがあります。デスクトップクライアントの接続ページで、異常に活発なアプリを特定できます。
IPv6はネットワーク環境を確認せずに無理に有効化しない
ローカルネットワーク、プロキシノード、ルールセットがIPv6に正しく対応している場合は、対応する処理を有効にできます。通信事業者のIPv6が不安定な場合、アプリがAAAAアドレスへの接続を優先してタイムアウトすることがあります。切り分けでは、Clash設定のIPv6を一時的に無効にし、同じ宛先への接続時間を比較してください。特定のサイトを直すためだけに、OS全体でIPv6を恒久的に無効化しないでください。
復旧用の設定を1つ残しておく
- 現在動作しているスタックの種類、DNSモード、strict-routeの状態を記録します。
- クライアントまたはmihomoカーネルを更新した後は、サービスモードが引き続き実行中か確認します。
- サブスクリプション更新後はポリシーグループ名を確認し、ローカルルールが存在しないグループを参照しないようにします。
- YAMLを変更する前にクライアントの設定チェック機能を使い、インデントには半角スペースを統一して使用します。
- 通信できなくなった場合は、まずTUNを無効にします。ネットワークがすぐ復旧したら、この記事の順番に沿って項目ごとに確認します。
TUNで重要なのは、スイッチをすべて有効にすることではなく、権限、ルート、DNS、ルールを一貫した経路として成立させることです。まず仮想ネットワークアダプターが正常に作成されたことを確認し、次にログで通信がカーネルへ入っているかを判断し、最後に適用されたルールと出口を確認します。この順番で進めれば、ブラウザーは使えるのにデスクトップアプリだけ通信できない、TUN有効化後にドメインが使えない、LAN機器が見えなくなるといった問題も、明確な確認手順に分解できます。