システムプロキシと TUN モードの境界線
SECTION / PROXY VS TUNシステムプロキシ(System Proxy)は OS レベルの設定であり、実質的にはシステムやアプリの実行環境に一組のプロキシアドレス(HTTP_PROXY / HTTPS_PROXY などの環境変数、あるいは Windows の WinINet/WinHTTP 設定項目、macOS のネットワーク環境設定)を書き込むものです。アプリがネットワークリクエストを送る際にこの設定を読み取り、自らトラフィックをプロキシポートへ転送して初めて「プロキシを経由した」ことになります。これは**協調的な**転送方式であり、プロキシが実際に機能するかどうかは対象アプリが協力するかどうかに依存します。
一方 TUN モードは全く異なる仕組みです。Clash Meta(mihomo)で TUN を有効にすると、システム内に仮想ネットワークアダプタが作成され(Windows では Wintun ドライバに依存し、macOS/Linux では utun/tun0 デバイスに対応)、システムのデフォルトルートがこの仮想アダプタへ向けられます。以降、ネットワーク層を通過するすべての IP パケットは——どのプロセスから発生したか、プロキシの存在を知っているかにかかわらず——まず仮想アダプタに捕捉され、その後 Clash コアがルールに基づいて処理します。これは**ネットワーク層での強制的な制御**であり、アプリ側の協力を必要としません。
違いを一言でまとめると、システムプロキシは「経由するかどうかはアプリの意思次第」、TUN モードは「経由するかどうかにかかわらず必ず通過させる」という点にあります。
TUN モードはシステムプロキシの「強化版」として置き換えるものではなく、まったく別の転送経路です。多くのクライアントでは両者を併用できますが、同時に有効化するとルーティングテーブルが互いに競合する場合があるため、トラブルシューティングの手間を減らすには片方だけを使うことを推奨します。
TUN が必須となるトラフィックの種類
SECTION / WHO NEEDS TUN以下のようなケースではシステムプロキシが機能せず、TUN モードでなければカバーできません。
- UDP を主体とするプロトコル。システムプロキシの仕組みは主に HTTP/HTTPS(TCP ベース)を想定して設計されており、多くのオンラインゲーム、音声通話(VoIP)、一部のビデオ会議ソフトは UDP による直接通信を行うため、システムプロキシの設定を参照しません。
- コマンドラインおよびバックグラウンドサービス。多くの CLI ツール(パッケージマネージャや一部のビルドスクリプト)やシステムデーモンはプロキシ環境変数を確認しない、あるいは追加の --proxy パラメータを指定しなければプロキシを経由せず、設定が煩雑で見落としやすくなります。
- Socket 接続をハードコードしたアプリ。一部のデスクトップクライアントやモバイルアプリは低レベルの Socket API を直接呼び出しており、システムプロキシの設定を完全に無視します。一部のチャットツールやクラウド同期ツールでよく見られます。
- ICMP や特殊なプロトコル。 Ping や Traceroute など ICMP をベースとした探索トラフィック、および一部の P2P プロトコルも、システムプロキシの処理対象には含まれません。
- 仮想マシンやコンテナ内のトラフィック。ホスト側のシステムプロキシは通常、仮想マシンやコンテナには自動的に引き継がれませんが、TUN モードはホストのルーティング層で捕捉するため、ネットワークモードの設定次第でこれらのトラフィックもカバーできます。
「プロキシを有効にしているのに直接接続されている」というアプリを見つけた場合、たいてい上記のいずれかに該当します。TUN モードを有効にするのが最も直接的な解決策です。
各プラットフォームでの有効化方法と権限要件
SECTION / PLATFORM SETUPTUN モードは仮想ネットワークアダプタの作成やシステムルーティングテーブルの変更を伴うため、いずれのプラットフォームでも高い権限が必要ですが、詳細な手順は異なります。
Windows で仮想ネットワークアダプタを作成するには Wintun ドライバが必要で、主要なクライアント(Clash Verge、Clash for Windows 系派生版)はインストール時または初回の TUN 有効化時に自動でこのドライバをインストールします。有効化の手順:
- クライアントを管理者権限で実行する(右クリックで「管理者として実行」を選択するか、設定内で「管理者権限で起動」を有効にする)。
- 設定パネルで TUN モードのスイッチを見つけて有効にする。初回有効化時にはドライバのインストールやネットワークアダプタの許可を求めるダイアログが表示されるので、許可を選択する。
- システムのファイアウォールが仮想アダプタの送信規則をブロックしている場合は、Windows Defender ファイアウォールで該当するネットワークカテゴリを手動で許可する(通常は初回のダイアログで「プライベートネットワーク」を選択すれば問題ない)。
管理者権限で実行していないことが、Windows で TUN モードを有効化できない最も多い原因です。スイッチを ON にしても自動的に OFF に戻ってしまうのが典型的な症状です。
macOS で utun デバイスを作成するには root 権限またはシステムネットワーク拡張の許可が必要です。近年のクライアントは毎回パスワードを入力する手間を避けるため、システムネットワーク拡張(System Extension)方式を採用することが多くなっています。
- 初回に TUN モードを有効にすると、「システム拡張がブロックされました」というダイアログが表示されます。
- 「システム設定 → プライバシーとセキュリティ → ネットワーク拡張機能」を開き、対象クライアントの拡張機能を見つけて許可します。
- 一部のクライアントは従来の方式を採用しており、設定内で「コアを管理者権限で実行」を許可する必要があります。一度システムパスワードを入力すれば、バックグラウンドプロセスが権限を長期間保持します。
有効化後にネットワーク拡張機能の一覧に該当項目が見つからない場合、通常はシステムのセキュリティポリシーによってインストールがブロックされています。クライアントまたはシステムを再起動してから再度試してください。
Linux で tun0 デバイスを作成するには CAP_NET_ADMIN 権限が必要です。最も簡単な方法はカーネルプロセスを root 権限で実行することですが、バイナリに個別にこの権限を付与することもできます。
sudo modprobe tun
sudo setcap cap_net_admin=eip /path/to/mihomo
setcap 方式のメリットは、クライアント全体を root 権限で起動する必要がなく、コアプロセスだけがネットワーク管理権限を得られる点にあり、最小権限の原則に適合します。GUI クライアント(一部の GTK/Qt ベースのラッパーなど)では設定内に「TUN を許可」ボタンが用意されていることが多く、内部的には上記のコマンドが実行されます。
TUN モードはクライアントにグローバルなルーティングを制御する権限を与えます。クライアントは必ず公式ルートから入手し、ダウンロード元を確認したうえで使用してください。出所不明のプログラムに管理者権限や CAP_NET_ADMIN を付与しないでください。
DNS の処理:fake-ip、ハイジャック、ルーティングループ
SECTION / DNS BEHAVIORTUN モードを有効にすると、DNS クエリも仮想アダプタによって捕捉されます。これは TUN モードにおいて最もトラブルが起きやすい部分でもあります。設定ファイルでは通常、DNS ハイジャックと解決ポリシーを明示的に指定する必要があります。
tun:
enable: true
stack: system
dns-hijack:
- "any:53"
auto-route: true
auto-detect-interface: true
dns:
enable: true
fake-ip-range: 198.18.0.1/16
nameserver:
- 223.5.5.5
- 1.1.1.1
dns-hijack は、外部への 53 番ポートの DNS リクエストをすべて強制的に捕捉し Clash コアに処理させる設定で、ルールを迂回して海外や汚染された DNS サーバーへ直接アクセスしてしまうことを防ぎます。fake-ip モードは各ドメインに対してプライベートアドレス帯の仮の IP を割り当てる仕組みで、アプリ側にはこの仮 IP が見え、実際の接続が確立される際にコアが本来の宛先へ差し替えます。これにより実際の名前解決結果を待たずにドメイン名でルールを判定できるという利点があります。
よくある問題の切り分け方向:
- DNS リーク。直接接続のトラフィックで DNS リクエストが捕捉されていない場合(例えばブラウザが依然としてシステム標準の DNS を使用している場合)、dns-hijack が該当ポートをカバーしているか、システムのネットワーク設定で固定 DNS サーバーが手動指定されて競合していないかを確認してください。
- ルーティングループ。 TUN モードでは、プロキシサーバー自身への接続が再び TUN アダプタを経由してはいけません。そうなると「プロキシ自身への接続がループする」状態に陥ります。クライアントは通常 auto-detect-interface や明示的なプロセス除外ルールでこの問題を回避しているため、手動設定時は必ず該当項目が有効になっているか確認してください。
- VPN クライアントとの競合。 TUN モードを他の VPN ソフトと同時に実行すると、両者がデフォルトルートを取り合い、いずれかが断続的に機能しなくなることがあります。両者を同時に有効化しないことを推奨します。
TUN モードが正しく機能しているかを確認する
SECTION / VERIFICATIONTUN モードを有効にした後は、クライアントのスイッチの状態だけで判断せず、以下の順序で確認することを推奨します。
- 仮想ネットワークアダプタが存在するか確認する。 Windows では「ネットワーク接続」を開き、「Mihomo」や「Clash」といった名称のアダプタが追加されているか確認します。macOS/Linux では ifconfig または
ip addr を実行し、utun / tun0 デバイスが存在するか確認します。 - デフォルトルートを確認する。 Windows では route print、macOS/Linux では netstat -rn または ip route を使用し、デフォルトルートが物理アダプタではなく仮想アダプタに向けられていることを確認します。
- システムプロキシに依存しないツールでテストする。例えばターミナルでプロキシパラメータを何も指定せずに curl を実行したり、ルール上「プロキシが必要」と判定されるドメインをコマンドラインで Ping し、想定した出口にヒットしているかを確認します。
- クライアントの接続ログを確認する。多くのクライアントは「接続」や「ログ」パネルで各接続のインバウンドタイプを表示しており、TUN モードでの接続は通常 HTTP/SOCKS ではなく TUN と表示されます。これによりどの経路が実際に機能しているかを確認できます。
上記の確認をすべて通過しても特定のアプリだけがプロキシを経由しない場合、そのアプリがシステム上で特定のネットワークインターフェースに固定されていたり、独自の DNS を使用している可能性が高く、Clash の設定をさらに調整するのではなく、そのアプリ自体のネットワーク設定を個別に確認する必要があります。