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