ドキュメント 設定 解決フロー

解決フロー

DNS 関連のフィールドは数が多く、どちらの優先度が高いのか分かりにくいものです。ここでは例を使って解決フロー全体を順番に解説します。

設定例

config.yaml YAML
dns:
  nameserver:
    - https://doh.pub/dns-query
  fallback:
    - https://8.8.8.8/dns-query
  direct-nameserver:
    - system
  nameserver-policy:
    "geosite:cn,private":
      - https://doh.pub/dns-query
      - https://dns.alidns.com/dns-query
  fallback-filter:
    geoip: true
    geoip-code: CN
    geosite:
      - gfw
    ipcidr:
      - 240.0.0.0/4
    domain:
      - '+.google.com'

rules:
  - DOMAIN-SUFFIX,google.com,PROXY
  - GEOIP,CN,DIRECT
  - MATCH,PROXY

全体のフロー

ここでは dns モジュール自体の処理過程のみを説明し、トラフィックの種類によって2つの経路に分かれます:

  1. まず、ヒットしたルールがドメインルールか宛先IPルールかを確認します。DOMAIN-SUFFIX/GEOSITE のようなドメインルールであれば、そのまま解決フェーズに進みます。IP-CIDR/GEOIP のような宛先IPルールであれば、判定を続けるためにまずドメインを解決してIPを取得する必要があるため、こちらも解決フェーズに進みます。
  2. ドメインルールが直接接続にヒットし、かつ direct-nameserver が設定されている場合:下記の nameserver-policy/nameserver のフローを経由せず、direct-nameserver で直接解決します。
  3. それ以外の場合はまず nameserver-policy が設定されているか確認します:ドメインが何らかのポリシー(例では geosite:cn,private)にヒットした場合は、そのポリシーで指定されたサーバーで解決します。ポリシーにマッチしない場合、または nameserver-policy が設定されていない場合は、次のステップで nameserver を使用します。
  4. nameserver で問い合わせる:fallback も設定されている場合は、nameserverfallback に同時に問い合わせを行い、両方の結果を fallback-filter で照合します(例えば取得したIPが geoip-code: CN にヒットしたのにドメインがホワイトリスト domain に含まれていない場合、結果が汚染されている可能性があります)。条件に合致すれば fallback の結果を採用し、そうでなければ nameserver の結果を使用します。fallback が設定されていない場合は nameserver の結果をそのまま使用します。
  5. IPを取得した後、再度ルール判定を行う:ドメインルールが既にプロキシにヒットしている場合は、ドメインと解決結果を合わせてプロキシに送信します(プロキシサーバー側で再解決される場合もあります)。宛先IPルールが直接接続にヒットし、direct-nameserver が設定されている場合は、それを使って再度解決してから直接接続します。それ以外はすでに取得したIPでそのまま接続します。

direct-nameserver による再解決は現在 TCP 接続にのみ対応しています。より新しいバージョンのコアでは UDP 接続にも適用されています(TUN 経由の fake-ip モードのみ)。