範例設定
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 模組本身的處理過程,按流量類型分兩條路徑:
- 先看規則命中的是網域規則還是目標 IP 規則。如果是
DOMAIN-SUFFIX/GEOSITE這類網域規則,直接進入解析環節;如果是IP-CIDR/GEOIP這類目標 IP 規則,需要先解析網域得到 IP 才能繼續判斷,也會進入解析環節。 - 網域規則命中直連,且設定了
direct-nameserver:直接用direct-nameserver解析,不走下面的 nameserver-policy/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 模式)。