DNS モジュールが Clash の中で担う役割
Clash の振り分けルールは、ドメイン名で判定するタイプ(DOMAIN、DOMAIN-SUFFIX、DOMAIN-KEYWORD)と IP で判定するタイプ(IP-CIDR、GEOIP)の2種類に分かれます。IP 判定型のルールはドメイン名に対応するアドレスを先に取得しないと振り分け先を決められないため、Clash はOSに解析を任せず、独自の完全な DNS 解析モジュールを内蔵しています。ドメイン名ルールは接続発生時点で判定できますが、IP ルールは DNS モジュールが返す解析結果に依存し、両者が組み合わさって1つの接続がどのポリシーグループに入るかを決定します。
OS標準の DNS は通信事業者側が配布する平文の UDP 53 サービスであることが多く、クエリ内容は経路上で丸見えのうえ、途中の機器に書き換えられる恐れがあります。Clash が DNS を代行するようになると、クエリがどの経路を通り、どのプロトコルを使い、どの結果を採用するかをすべて設定で固定できます。これが nameserver、fallback、enhanced-mode といった項目が存在する理由です。
dns セクションの全体スイッチは enable です。listen は Clash がどのアドレス・ポートでクエリに応答するかを決め、よく使われる書き方は 0.0.0.0:53 です。デスクトップ版クライアントでシステムプロキシや TUN モードを有効にすると、通常システム DNS が自動的にこのリスニングアドレスに切り替わり、LAN内の他デバイスも DNS をここに手動で向けることでクエリを一括管理できます。
nameserver:メインアップストリームと記述方法
nameserver は Clash のメイン解析経路で、リスト内の各項目は3つの形式に対応しています。
- IPアドレス単体、例:
223.5.5.5。従来の平文 UDP 53 で通信し、レイテンシが最も低い。 tls://1.1.1.1:853。DNS over TLS で、暗号化された 853 番ポートを使ってクエリを送る。https://doh.pub/dns-query。DNS over HTTPS で、クエリを HTTPS リクエストに包んで送る。
リストの意味は「並行して競わせる」ことであり、メイン・バックアップの関係ではありません。Clash はリスト内の全アップストリームに同時にクエリを送り、最初に返ってきた結果を採用します。そのため nameserver には低遅延なアップストリームを2〜3個並べれば十分で、項目を増やしても信頼性は上がらず、送信トラフィックが増えるだけです。
nameserver とセットで使うのが default-nameserver で、これは解析チェーン全体を起動するための起点となる解析サーバーです。DoH や DoT のアップストリームはドメイン名で指定されるため、その「解析サーバー自身のドメイン名」を解決する際に同じアップストリームに頼ると循環依存が生じます。default-nameserver には直接 UDP でアクセスできる純粋な IP、例えば 223.5.5.5、119.29.29.29 を指定し、起動時のみ使用され、通常のクエリはここを経由しません。
default-nameserver には純粋な IP のみを指定する
default-nameserver に https:// や tls:// 形式を記入してはいけません。これは DNS チェーンの起点であり、DoH・DoT サーバーのドメイン名を解決する役割を担うため、自身がいかなる暗号化アップストリームにも依存できない必要があります。
fallback と fallback-filter:バックアップ結果の判定ロジック
fallback について最もよくある誤解は「メインのアップストリームが落ちたときだけ有効になる」というものです。実際の挙動はこうです:fallback を設定すると、Clash は同じドメイン名について nameserver と fallback の両グループに同時にクエリを送り、fallback-filter のルールに従ってどちらの結果を採用するか判定します。fallback は結果を選別する仕組みであり、フェイルオーバーの仕組みではありません。
デフォルトの判定条件は geoip: true と geoip-code: CN の組み合わせです。nameserver が返した IP が中国本土に属していれば nameserver の結果を採用し、それ以外は fallback の結果に切り替えます。この仕組みの意図は明確で、中国本土のドメイン名は本土の低遅延なアップストリームを信頼し、それ以外のドメイン名の解析結果は暗号化して国外に出るアップストリームだけを信頼するというものです。
fallback-filter にはさらに2つの補助条件があります。ipcidr は信頼できないネットワークセグメントを列挙するもので、返ってきた IP がこれに該当する場合(例えば予約セグメント 240.0.0.0/4)は結果が汚染されたと判定し、強制的に fallback を採用します。domain は fallback の結果を直接使うドメイン名を列挙するもので、汚染が確認済みの個別対象に向いています。
省けない前提が1つあります。fallback のアップストリームはすべて DoH または DoT を使う必要があります。fallback に平文 UDP のアドレスを入れると、それ以外のドメイン名のクエリは依然として平文で外部に出てしまい、ハイジャックや汚染の問題がそのまま残るため、fallback の仕組みが意味をなさなくなります。
enhanced-mode:fake-ip と redir-host の違い
enhanced-mode はアプリケーションが発行する DNS リクエストに対して Clash がどう応答するかを決める項目で、2つの値がそれぞれ異なる方式に対応します。
redir-host は従来型のモードです。Clash はドメイン名への接続を受け取ると、まず実際の解析を1回行い、得られた IP に対してルールに従って転送します。挙動が直感的で互換性も最も高い一方、ローカルで実際の DNS クエリが発生するため、そのクエリが経路上でハイジャックや記録の対象になる余地が残ります。
fake-ip はデフォルトで推奨される方式です。Clash は解析が必要なドメイン名に対して、fake-ip-range(デフォルトは 198.18.0.1/16)の範囲内にある偽の IP をそのまま返します。アプリケーションがこの偽アドレスに接続しようとすると、Clash は元のドメイン名を逆引きしてドメイン名ルールに従って振り分け、実際の解析はプロキシの出口側で行われます。ローカルではほぼ実際のドメイン名クエリが発生しないため、ハイジャック側は書き換えられる平文リクエストを取得できず、往復1回分のレイテンシも削減できます。
fake-ip-filter には偽アドレスを返してはいけないドメイン名を列挙します。LAN 内のドメイン名(*.lan、*.local)、NTP 時刻同期、STUN による NAT 越えなどのサービスは実際の IP を取得しないと動作しないため、偽アドレスを受け取るとすぐに異常になります。これらは必ずフィルターリストに残しておく必要があります。fake-ip は LAN 経由のプロキシ共有や一部の P2P 対戦系サービスとの互換性に問題が出ることがあり、異常が発生した場合は redir-host に戻せばよく、2つのモードはいつでも切り替えて比較できます。
dns セクションの項目一覧
| 項目 | 役割 | よくある設定値 |
|---|---|---|
enable | DNS モジュールの全体スイッチ | true |
listen | クエリに応答するリスニングアドレスとポート | 0.0.0.0:53 |
ipv6 | AAAA レコードを返すかどうか | false |
enhanced-mode | 応答モード | fake-ip / redir-host |
fake-ip-range | 偽アドレスの割り当てセグメント | 198.18.0.1/16 |
fake-ip-filter | 偽アドレスを返さないドメイン名 | *.lan、*.local など |
default-nameserver | 起点となる解析サーバー(アップストリームのドメイン名を解決) | 223.5.5.5 |
nameserver | メインアップストリーム、並行競争方式 | DoH / DoT / 純粋な IP |
fallback | バックアップアップストリーム、filter で採用判定 | DoH / DoT |
fallback-filter | 結果採用の判定条件 | geoip、ipcidr、domain |
DNS ハイジャックの仕組みと設定での対策
DNS ハイジャックの典型的な仕組みはこうです。平文の UDP 53 クエリが通信事業者のゲートウェイを経由する際、ゲートウェイが本来のアップストリームより先に偽の応答を返し、ドメイン名を間違った IP に紐付けます。表面的には、正常なサイトにアクセスしたのに無関係なページに飛ばされたり、同じドメイン名でもネットワークが異なると解析結果が大きく変わったりします。ハイジャックが狙うのは「平文であること」と「53番ポートであること」の2点であり、対策もこの2点を軸に組み立てます。
以下の4条件がすべて成立して初めて、ハイジャック対策として完結します。
- nameserver と fallback はすべて DoH か DoT を使い、クエリ内容を暗号化することで、途中の機器がパケットを読み取ることも書き換えることもできない状態にする。
- enhanced-mode は fake-ip を使い、プロキシ経由になるドメイン名についてローカルで実際の解析リクエストを発行しないようにすることで、攻撃対象をさらに減らす。
- システム DNS を Clash の listen アドレスに向ける、または TUN モードを有効にして全トラフィックを代行させ、すべてのクエリを Clash 内部に一元化する。
- fallback-filter で geoip 判定を維持し、中国本土以外のドメイン名の結果は暗号化されたアップストリームからのみ、中国本土のドメイン名の結果は低遅延なローカルアップストリームから得るようにする。
設定が有効になっているかを確認する
クライアントのログレベルを debug に切り替え、dns 関連の出力を確認します。次に dig @127.0.0.1 ドメイン名 を使って中国本土向けと国外向けのドメイン名をそれぞれテストし、返ってきた IP が振り分けの想定どおりか比較します。中国本土向けドメイン名なら現地の通信事業者に近いアドレスが返るはずで、プロキシ経由のドメイン名は fake-ip モードなら 198.18 セグメントのアドレスが返るはずです。
そのまま使える設定例
以下の dns 設定は、これまで解説した項目を1つの実用テンプレートにまとめたものです。上記の解説と1行ずつ対応しているので、アップストリームのアドレスを好みのものに置き換えるだけで使えます。
dns:
enable: true
listen: 0.0.0.0:53
ipv6: false
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
fake-ip-filter:
- "*.lan"
- "*.local"
- "localhost.ptlogin2.qq.com"
default-nameserver:
- 223.5.5.5
- 119.29.29.29
nameserver:
- https://doh.pub/dns-query
- https://dns.alidns.com/dns-query
fallback:
- https://dns.google/dns-query
- tls://1.1.1.1:853
fallback-filter:
geoip: true
geoip-code: CN
ipcidr:
- 240.0.0.0/4
domain:
- "+.example.com"
ポイントの振り返り:default-nameserver には純粋な IP を2つ指定して起動を担わせる。nameserver には中国本土向け DoH を2つ並べて並行競争させる。fallback には暗号化された国外アップストリームを2つ指定する。fallback-filter は geoip-code CN を基準に採用を判定し、ipcidr で予約セグメントによる汚染を防ぎ、domain リストで個別のドメイン名を必要に応じて追加・削除する。fake-ip-filter の項目は実際の LAN 環境に合わせて追加し、何らかのサービスで異常が出た場合はまずフィルター漏れを疑う。
mihomo(Clash Meta)での進化
mihomo カーネルは上記の項目に完全対応しているため、既存の dns 設定はそのまま移行できます。それに加えて、より細かい制御が可能な新しい項目がいくつか追加されており、段階的な移行に向いています。
nameserver-policy:ドメイン名のサフィックスルールに応じてアップストリームを指定でき、fallback の二択的な判定より細かい制御が可能。特定のドメイン名グループを指定の DoH に固定して振り分け、複数の解析経路を併存させられる。proxy-server-nameserver:設定内のノードサーバーのドメイン名を専用に解析するもので、ノードのドメイン名が汚染されてプロキシグループ全体が使えなくなる事態を防げる。direct-nameserver:直接接続トラフィック専用の解析経路を指定でき、プロキシ用のドメイン名解析から切り離せる。respect-rules:DNS クエリ自体も振り分けルールに従って出口を選ぶようにする機能。国外アップストリーム向けの DoH リクエストがプロキシを経由するようになり、干渉を受ける確率をさらに下げられる。
移行のおすすめ:新規に書く mihomo 設定では nameserver-policy を優先して振り分けの意図を表現し、fallback は最終的な保険として残しておく。既存の設定を急いで書き換える必要はなく、まず fallback-filter の挙動が想定どおりか確認してから、1項目ずつ移行していくとよい。
クライアントをダウンロードして DNS を設定する
dns セクションの書き方は各社の Clash クライアントで共通です。まずダウンロードセンターでお使いのプラットフォーム向けのクライアントを入手し、本記事の内容に沿って nameserver、fallback、enhanced-mode を調整してください。