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