DNSの設定が不十分だと何が起きるか

クライアントが通信の転送だけを引き継ぎ、DNSクエリまでは引き継いでいない場合、ドメイン解決のリクエストはそのままローカルの回線事業者のDNSに送られてしまうことがあります。これには2つの問題があります。1つは解決結果が汚染されて誤ったIPが返され、本来プロキシ経由になるはずのサイトに接続できなくなること。もう1つは、通信自体はプロキシを通っていても、DNSクエリそのものによってどのドメインにアクセスしているかが漏れてしまうこと――いわゆる「DNS漏洩」です。

fake-ip:現在もっとも主流な解決方法

enhanced-mode: fake-ipの考え方はこうです。クライアントはDNSクエリを横取りし、実際のIPを返す代わりに専用の仮想アドレス帯(fake-ip-range)から仮のIPをアプリケーションに割り当てます。アプリケーションがこの仮IPで接続を試みると、クライアントはネットワーク層で実際のドメインを復元し、ルールに従ってプロキシか直接接続かを判断します。この処理はアプリケーションに対して完全に透過的で、互換性と速度の両面で現時点では最も優れた方式です。

dns:
  enable: true
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  fake-ip-filter:
    - "*.lan"
    - "localhost.ptlogin2.qq.com"

fake-ip-filterは、仮IPの仕組みを使う必要がないドメインを除外するためのものです。代表的なのはLAN内のデバイス探索や内部サービスなど、実際のIPを取得しないと正常に動作しないケースで、フィルタに一致したドメインはそのまま本来の解決結果が返されます。

ドメインごとに解決先を振り分ける:nameserver-policy

1組のDNSサーバーだけで全てのドメインを解決するのは最適とは言えません。国内・地域内向けのドメインは近いDNSの方が速く解決できることが多く、それ以外のドメインは汚染されにくいDNSサーバーに任せた方が安全です。nameserver-policyを使うと、ドメインの分類(GeoSiteと組み合わせる)に応じて解決先を個別に指定できます。

dns:
  nameserver:
    - https://dns.google/dns-query
    - https://1.1.1.1/dns-query
  fallback:
    - https://1.0.0.1/dns-query
    - https://dns.quad9.net/dns-query
  nameserver-policy:
    "geosite:private": [192.168.1.1]
    "geosite:geolocation-!cn": [https://1.1.1.1/dns-query]

nameserver-policyに一致しないドメインは、既定のnameserverリストで解決されます。さらに解決結果が信頼できるかどうかを判定したい場合は、fallbackと後述のfallback-filterを組み合わせて使います。

fallback-filter:解決結果が信頼できるか判定する

fallback-filterは、どのような場合に既定のDNSの結果を見送ってfallbackリストで再解決するかを決めるための項目で、最も一般的な判定基準はgeoipです。

dns:
  fallback-filter:
    geoip: true
    geoip-code: JP

これを有効にすると、既定のDNSが返したIPがgeoip-codeで指定した地域(ここでは日本)に属していない場合、クライアントはその結果を信頼できないと判断し(汚染された環境で誤った海外IPが返されるケースなどで発生します)、fallbackリストのより信頼できるDNSサーバーで再解決を試みます。

ヒント: 多くのクライアントの初期設定にはすでに妥当なDNS設定が含まれているため、通常はここを手動で変更する必要はありません。自分で設定を書いている場合や、解決結果に異常があると感じたときに、この記事の順序で一つずつ確認してみてください。

確認すべきチェックリスト

  • dns.enabletrueになっているか確認する。これがオフだとDNS設定全体が無効になります;
  • enhanced-modefake-ipに設定されているか確認する(他のモードを使う明確な理由がある場合は別です);
  • LAN内のデバイス探索がうまく動かないときは、該当ドメインをfake-ip-filterに追加する必要がないか確認する;
  • 解決結果の汚染が疑われるときは、fallbackfallback-filterが正しく設定されているか確認する。

DNS設定が完全なconfig.yamlのどこに位置づけられるかをもっと詳しく知りたい方は、上級者向けドキュメントをご覧ください。Clashを使い始めたばかりであれば、多くのクライアントの初期DNS設定で十分に安定して動作するため、手動で変更する必要はありません。

DNSの設定が済んだら、あとは使い始めるだけ

Clashクライアントをダウンロードしてサブスクリプションリンクを貼り付ければ、数分でインストールから接続まで完了します。