문서 설정 해석 과정

해석 과정

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가 설정되어 있는 경우: 아래의 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 모드에서만).