TUNモードとは:アプリ限定プロキシからシステム全体の透明プロキシへ
従来のプロキシモードでは、ブラウザの設定(HTTP/SOCKS5)やシステムの環境変数に頼って、アプリケーションの通信をプロキシ経由にする必要がありました。しかし、多くのアプリケーション(各種ターミナルツール、ゲームクライアント、バックグラウンドサービスなど)は、システムのプロキシ設定に従わないことがあります。これにより、「ブラウザは見れるのに、ターミナルでエラーが出る」という不便な状況が発生しがちでした。
TUNモード(TUN Device Mode)は、この問題を解決する究極のソリューションです。アプリケーション層のプロキシプロトコルに依存するのではなく、OSのカーネル層で仮想ネットワークカード(TUNインターフェース)を直接作成します。このモードを有効にすると、OSを流れるすべてのネットワークパケットがこの仮想NICを通過するようになります。ClashはこのNICが受け取ったレイヤー3(IP層)のパケットを接管し、ルールに基づいて転送を行います。
技術原理:仮想NICとレイヤー3トラフィックの制御
TUNモードを理解するには、OSのネットワークプロトコルスタックの仕組みを知る必要があります。
通常、アプリケーションがインターネットにアクセスしようとすると、パケットが構築されカーネルに渡されます。TUNモードがない場合、カーネルはルーティングテーブルを確認し、Wi-Fiやイーサネットなどの物理NICへパケットを送ります。
TUNモードを有効にすると、Clashは以下の操作を実行します:
- 仮想デバイスの作成:OSカーネル内にTUNデバイスを作成し、特定のIPレンジを割り当てます。
- ルーティングテーブルの変更:システムのデフォルトルート(0.0.0.0/0)をこの仮想デバイスに向けます。
- パケットのキャプチャ:カーネルは物理NICに向かうはずだったパケットを、仮想NICにリダイレクトします。Clashはユーザー空間のプログラムとして、ファイル記述子を介してこれらの生(Raw)のIPパケットを読み取ります。
- プロトコルスタックの再構築:Clash内部に実装された軽量なTCP/IPプロトコルスタックが、キャプチャした生のパケットを論理的な接続に戻し、ルールに基づいて適切なノードへ転送します。
システムプロキシ vs TUNモード:徹底比較
| 比較項目 | システムプロキシ (HTTP/SOCKS5) | TUNモード (レイヤー3接管) |
|---|---|---|
| 制御範囲 | 設定に従うアプリのみ | システム全体の全トラフィック |
| UDPサポート | 不完全(特別な対応が必要) | ネイティブで完全サポート |
| DNSハイジャック | ブラウザやアプリの設定に依存 | 全DNSリクエストを強制接管 |
| リソース負荷 | 極めて低い | 中程度(カーネルとのやり取り発生) |
| 設定の難易度 | 簡単 | 管理者権限が必要 |
実践設定:究極の透明プロキシ体験を実現する
Clash.Meta (mihomo) カーネルでは、TUNモードの機能が大幅に強化されています。以下は、高い安定性と漏洩防止を両立するための推奨設定です。
config.yaml - TUNモードのコア設定tun:
enable: true
stack: mixed # ネットワークスタックの選択(mixed推奨)
auto-route: true # システムルートを自動設定し、全トラフィックを接管
auto-detect-interface: true # 物理NICを自動検出し、ルーティングループを防止
dns-hijack:
- 'any:53' # ポート53へのすべてのDNSリクエストをハイジャック
strict-route: true # 厳格なルートモードで、TUNをバイパスする通信を遮断
device: Meta # 仮想NICの名前を定義
mtu: 1500 # デフォルト値、または環境に合わせて微調整
ネットワークスタックの選択:System、gVisor、Mixed
stackフィールドは、ClashがキャプチャしたIPパケットをどのように処理するかを決定する、パフォーマンスと安定性の鍵となる設定です。
- System:OS自体のネットワークスタックを使用します。互換性は最高ですが、大量の短時間接続を処理する際のオーバーヘッドが大きく、一部のOSでUDP性能が不安定になることがあります。
- gVisor:Googleが開発したユーザー空間ネットワークスタックを使用します。ユーザー空間でプロトコル解析を完結させるため安全性が高く、接続状態を完全に制御できますが、CPU負荷はSystemよりやや高くなります。
- Mixed:現在最も推奨される選択肢です。TCPをカーネル(または効率的なスキーム)で処理し、UDPをgVisorや専用モジュールで処理することで、スループットと低遅延(ゲームなど)を両立します。
落とし穴回避ガイド:DNS漏洩とバイパス問題
TUNモードを有効にしても、設定が不適切だとDNS漏洩(DNSリクエストがプロキシを通らずにプロバイダーのサーバーへ直接送信され、閲覧履歴が記録されたり検閲されたりすること)が発生する可能性があります。
DNS漏洩を確実に防ぐには、fake-ipモードの併用を強くお勧めします。
dns:
enable: true
enhanced-mode: fake-ip
nameserver:
- 'https://doh.pub/dns-query'
- 'https://dns.alidns.com/dns-query'
fallback:
- 'tls://8.8.8.8:853'
- 'tls://1.1.1.1:853'
fake-ipモードでは、アプリがDNS解決を要求すると、Clashが即座に仮想IP(198.18.x.xなど)を返します。アプリはその仮想IPに対して接続を試み、通信がTUNインターフェースに到達した時点で、Clashが内部キャッシュにある本当のドメインに基づいて転送を行います。これにより、OSレベルでの実際の名前解決試行を完全に回避できます。
パフォーマンス最適化のアドバイス
4K動画の視聴やギガビット回線を使用するユーザーなど、究極の速度を求める場合は以下の調整を検討してください。
- TCP並行接続の有効化:
tcp-concurrent: trueを設定すると、接続確立がスピードアップします。 - MTUの調整:一部のネットワーク環境で「サイトが半分しか読み込まれない」などの問題が発生する場合、
mtuを1400や1350に下げてみてください。 - 最新コアの使用:常に最新のmihomoコアを搭載したクライアントを使用してください。Clash V.COREなどは、TUNの読み書き性能が独自に最適化されており、ユーザー空間との切り替えに伴う遅延を最小限に抑えています。
結論として、TUNモードは現代の複雑なネットワーク環境において、真の透明プロキシを実現するための最良の手段です。設定には管理者権限が必要で少し複雑ですが、一度構築してしまえば、従来のプロキシでは得られない「設定を意識しない」シームレスな体験が得られます。
もし、TUNモードを完璧に使いこなしつつ、複雑なYAML設定ファイルを手動で編集したくないのであれば、Clash V.COREが最適です。洗練されたUIの裏側で高度な技術を自動処理し、ワンクリックでシステム全体の高性能な透明プロキシを実現します。