dae icon indicating copy to clipboard operation
dae copied to clipboard

[Feature Request] routing可以按照dns请求的qname分流

Open ppdragon16 opened this issue 5 months ago • 1 comments

Greetings

这个FR据说有人一年前提出的,但我没找到issue,故报此FR。

Feature Request

考虑这个简单的case:youtube走hk,chatgpt走jp。 当dial_mode: domain时,由于域名会在节点再次解析,所以还好。 但dial_mode: ip时,发往dns upstream的数据包无法正确按qname分流。唯一的做法是设置多个upstream:

dns {
 upstream {
   ai_dns: 'tcp://dns.google:53'
   video_dns: 'tcp://dns.quad9.net:53'
 }
 routing {
   request {
     qname(suffix:openai.com, suffix:chatgpt.com, suffix:gemini.google.com) -> ai_dns
     qname(suffix:youtube.com, suffix:googlevideo.com) -> video_dns
     fallback: asis
   }
 }
}
routing {
   pname(dnsmasq) -> must_direct
   dip(geoip:private) -> direct

   domain(full:dns.quad9.net) -> hk
   domain(suffix:youtube.com, suffix:googlevideo.com) -> hk
   domain(full:dns.google) -> jp
   domain(suffix:openai.com, suffix:chatgpt.com, suffix:gemini.google.com) -> jp
   fallback: direct
}

可以看出dns分流的数量增多时会导致upstream不太够用的情况。 此FR希望routing中的规则可以处理dns qname的分流。

方案1:直接在routing的语法中支持dns/qname的条件判断,比如:

    l7proto(dns) && qname(suffix:youtube.com, suffix:googlevideo.com) -> hk

此方案要实现判断数据包为dns请求并提取qname。此方案的不足之处在于配置文件对qname的判断会在dns和routing中都出现,当qname(..)中的各种匹配比较复杂时,配置文件会比较杂乱。

方案2:加入DNS标记语法,像这样:

dns {
  upstream {
    proxy_dns: 'tcp://dns.google:53'
  }
  routing {
    request {
      qname(suffix:openai.com, suffix:chatgpt.com, suffix:gemini.google.com) -> proxy_dns(dns_mark_ai)
      qname(suffix:youtube.com, suffix:googlevideo.com) -> proxy_dns(dns_mark_youtube)
      fallback: asis
    }
  }
}
routing {
    ...
    dnsmark(dns_mark_youtube) -> hk
    dnsmark(dns_mark_ai) -> jp
    domain(suffix:youtube.com, suffix:googlevideo.com) -> hk
    domain(suffix:openai.com, suffix:chatgpt.com, suffix:gemini.google.com) -> jp
    ...
}

此方案可能需要dns模块和ebpf程序之间传递标记信息,代码复杂度增加,但配置文件简洁不少。

Use Cases

如上所述,一个简单的case:dial_mode: ip,youtube走hk,chatgpt走jp。

Potential Benefits

灵活且正确地配置分流,包括DNS解析。

ppdragon16 avatar Jul 21 '25 04:07 ppdragon16

Thanks for opening this issue!

dae-prow[bot] avatar Jul 21 '25 04:07 dae-prow[bot]