dae
dae copied to clipboard
[Feature Request] routing可以按照dns请求的qname分流
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解析。
Thanks for opening this issue!