文件 設定 解析流程

解析流程

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 模組本身的處理過程,按流量類型分兩條路徑:

  1. 先看規則命中的是網域規則還是目標 IP 規則。如果是 DOMAIN-SUFFIX/GEOSITE 這類網域規則,直接進入解析環節;如果是 IP-CIDR/GEOIP 這類目標 IP 規則,需要先解析網域得到 IP 才能繼續判斷,也會進入解析環節。
  2. 網域規則命中直連,且設定了 direct-nameserver直接用 direct-nameserver 解析,不走下面的 nameserver-policy/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 模式)。