Clash DNS設定を徹底解説:nameserver・fallback・DNSハイジャックの仕組み
Clashの dns 設定にある nameserver、fallback、fallback-filter、enhanced-mode の各パラメータを個別に解説し、中国本土/海外を分ける名前解決の仕組みと、そのまま使える推奨設定を紹介します。
Clashの dns 設定にある nameserver、fallback、fallback-filter、enhanced-mode の各パラメータを個別に解説し、中国本土/海外を分ける名前解決の仕組みと、そのまま使える推奨設定を紹介します。
Clashの設定ファイルに初めて触れる人は、proxies と rules の2セクションばかりに注目しがちです。ノードと振り分けルールこそが「使えるかどうか」を決めているように見えるからです。しかし実際のトラブル対処では、「特定のサイトが開かない」「プロキシを使っているのに国内CDNが読み込まれる」「ノードを切り替えるとページが遅くなる」といった問題の多くが、dns セクションの設定不足に起因しています。
理由は単純です。プロキシのルールは基本的にドメイン名でマッチしますが、実際の通信は最終的にIPアドレスに落ち着きます。名前解決の段階で汚染されたり誤ったルートを通ったりすれば、その後のルールをどれだけ細かく書いても手遅れです。DNS設定の核心的な役割は、「プロキシ経由にすべきドメインは実際のIPを、直結すべきドメインは国内CDNの最寄りIPを返す」という2つの経路を、互いに干渉させずに両立させることにあります。
ClashおよびClash Meta(mihomoコア)のDNSモジュールは構造がほぼ共通しており、よく使うフィールドは大きく3層に分けて理解できます。
最も基本的な骨格は次のような形になります。
dns:
enable: true
ipv6: false
default-nameserver:
- 223.5.5.5
- 119.29.29.29
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
nameserver:
- 223.5.5.5
- 119.29.29.29
fallback:
- https://1.1.1.1/dns-query
- https://8.8.8.8/dns-query
fallback-filter:
geoip: true
geoip-code: CN
ipcidr:
- 240.0.0.0/4
default-nameserver は見落とされやすい項目です。これは nameserver や fallback にドメイン形式(DoHアドレスなど)で書かれたサーバー自体を解決するためだけに使われるもので、必ず純粋なIPで指定する必要があります。そうしないと「DNSサーバーのアドレスを解決するために別のDNSが必要」という循環参照が発生してしまいます。
nameserver が1グループしかない場合、すべてのドメインが同じサーバー群で解決されてしまい、明確な振り分け要件がある場面では不十分です。nameserver-policy を使えば、ルールマッチと同様の書き方でドメインごとに専用の解決サーバーを指定できます。
dns:
nameserver-policy:
"geosite:cn":
- 223.5.5.5
- 119.29.29.29
"geosite:geolocation-!cn":
- https://1.1.1.1/dns-query
- https://8.8.8.8/dns-query
この設定は次のような意味になります。geosite:cn(中国本土向けドメイン集)にマッチしたリクエストは常に中国本土のDNSで解決され、当然近隣のCDNノードが返ってきます。海外向けドメイン集にマッチしたリクエストは常に暗号化された海外DNSで解決され、中国本土の通信事業者のDNSが途中で誤った結果を返す事態を避けられます。こう設定しておけば、中国本土向けサイトが海外解決を経由して遠回りになり遅くなることもなく、海外サイトが中国本土のDNSでアクセスできないIPを引いてしまうこともありません。
注意すべき点として、nameserver-policy のマッチ優先度は通常の nameserver より高く、ルールに一致すればそのまま即座に適用され、fallbackの判定処理を経由しません。これが後述するfallback機構との最大の違いです。一方は「事前振り分け」、もう一方は「事後の誤り訂正」という位置付けになります。
fallback機構は元々、「中国本土DNSと海外DNSのどちらを使うべきか判別できない」ドメイン、特に nameserver-policy の振り分けルールに含まれていないドメインへの対策として設計されています。判定の流れはおおむね次のようになります。
nameserver と fallback の両グループに送られる。nameserver から返ってきたIPを、fallback-filter の条件と照合する。geoip-code: CN(中国本土のIPと判定される)に一致するか、ipcidr リストのアドレス範囲に含まれる場合は、その結果を「信頼できる」と判断してそのまま採用する。fallback サーバーの解決結果を代わりに採用する。ipcidr によく登場する 240.0.0.0/4 は予約アドレス帯で、一部の通信事業者はDNS汚染時にこの範囲に含まれる偽のアドレスを返すことがあります。これをフィルターリストに追加しておくと、Clashが汚染された結果を早期に検知できます。fallback-filter には domain フィールドもあり、特定のドメインをホワイトリスト形式で強制的にfallbackに回すことができ、汚染されやすい個別サイトへの対策として使われます。
enhanced-mode は、Clashがドメインへのリクエストをどのように「横取り」してルールに沿って振り分けるかを決めるもので、代表的な2つの値は挙動が大きく異なります。
Clashが端末側でDNSリクエストを横取りし、各ドメインに対して fake-ip-range 範囲内の仮のIPを一時的に割り当ててアプリケーションに返します。アプリケーションがこの仮IPで接続を試みると、Clashコアが内部でこれを元のドメイン名に戻し、実際の名前解決と転送を行います。この方式のメリットは、名前解決のリクエストが端末外に一切出ないため通信事業者に捕捉されない点で、TUNモードと組み合わせた際に最も完成度の高い体験になります。デメリットは、実IPによる照合が必要な一部の場面(LAN内デバイス探索やP2P直接接続など)で不具合が出ることがあり、fake-ip-filter で対象ドメインを除外する必要がある点です。
このモードでは、Clashが設定済みのDNSサーバーを使ってまずドメインを実際のIPに解決し、そのIPまたはドメインのルールに基づいて振り分けます。互換性が高く「仮IPによってアプリが誤動作する」問題は起きにくい一方、解決の過程で1回分の完全なDNSクエリを経るため若干速度が落ち、IPレンジのルールも併用している場合、解決結果と実際のルーティング先が完全には一致せず誤判定が起きることがあります。
特別な互換性要件がなければ、TUNモード使用時は fake-ip を優先的に選び、社内ツールやゲーム、デバイス探索機能に異常が出た場合は該当ドメインを fake-ip-filter に追加する方が、全体を redir-host に切り替えて体験を犠牲にするより合理的です。
以上のフィールドを踏まえ、次の設定は「中国本土は直結、海外はプロキシ経由」という一般的な使い方に適したもので、設定ファイルの dns セクションをそのまま置き換えて使えます。
dns:
enable: true
ipv6: false
default-nameserver:
- 223.5.5.5
- 119.29.29.29
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
fake-ip-filter:
- "*.lan"
- "*.local"
- "+.stun.*.*"
- "+.stun.*.*.*"
nameserver:
- 223.5.5.5
- 119.29.29.29
fallback:
- https://1.1.1.1/dns-query
- https://8.8.8.8/dns-query
fallback-filter:
geoip: true
geoip-code: CN
ipcidr:
- 240.0.0.0/4
nameserver-policy:
"geosite:cn":
- 223.5.5.5
- 119.29.29.29
"geosite:geolocation-!cn":
- https://1.1.1.1/dns-query
- https://8.8.8.8/dns-query
この設定の振り分けロジックは次の通りです。まず nameserver-policy にマッチするか確認し、マッチすれば対応するサーバーで即座に解決します。マッチしない場合は nameserver によるデフォルト解決が行われ、fallback-filter がその結果の信頼性を判定し、信頼できない場合のみ fallback に切り替わります。全体を通して fake-ip が端末側で処理を横取りするため、クエリのリクエストが通信事業者のDNSに捕捉されることはありません。契約しているサービスに独自のDNS最適化設定が付属している場合は、デフォルト設定を残したまま項目ごとに見比べて置き換えるのがよく、丸ごと上書きする必要はありません。
設定後も問題が残る場合は、次の方向で確認してみてください。
nameserver-policy が該当ドメインをカバーしていない、あるいは中国本土向けDNSリストに1台しか登録されておらず応答が遅いことが原因です。異なる通信事業者系の公共DNSを2つほど追加することをおすすめします。fake-ip-filter に追加すればよく、全体を redir-host に変更する必要はありません。fallback-filter の ipcidr に、お使いの通信事業者がよく使う汚染アドレス帯が含まれているか確認してください。必要であれば該当ドメインを fallback-filter.domain に追加し、強制的にfallbackへ回します。