ChinaDNS 的上游 DNS 分为 国内 DNS
和 可信 DNS
。
- ChinaDNS 会同时向上游的 DNS 发送请求。
- 如果
可信 DNS
先返回,则直接采用可信 DNS
的结果。 - 如果
国内 DNS
先返回,分两种情况:如果返回的结果是国内的 IP, 则采用;否则丢弃并转而采用可信 DNS
的结果。
- 要确保
国内 DNS
的查询速度要比可信 DNS
快,才能达到线路优化的效果。 - 不能在
可信 DNS
下做缓存,否则可信 DNS
会一直先比国内 DNS
先返回,达不到线路优化的效果。
新想法:定期查询 DNS 并缓存的工具,轮询域名列表,查询并缓存其 IP, 允许设置 TTL.
希望可以解决当前 ChinaDNS 在可信 DNS 端做缓存而导致达不到线路优化效果的问题。
设置两个上游 DNS,一个国内 DNS,一个可信 DNS(国内自建或者代理转发国外的,是干净的 DNS)。 同时请求,如果任意一个先返回的 DNS 的 IP 是国内 IP,则立即采用; 如果不是国内的 IP,则等待另一个 DNS 返回数据,如果此时返回的 IP 如果是国内 IP,则采用,如果不是国内 IP,也采用可信 DNS 的结果。
同时向两个上游 DNS 查询,如果先获得的响应中的 IP 是国内的,即采用;否则,采用可信 DNS 的。
最近玩了一下 CleanDNS 和 overture, 看到一些比较好的特性,如果把这些特性搬到 ChinaDNS 上面,那可以总结一下:
- 先额外准备好以下两个列表:chinalist.txt 中国域名列表、gfwlist.txt 黑名单域名列表。
- 当接收到请求的时候,先去匹配请求的域名是否在 chinalist 列表里。如果存在,则直接使用
国内 DNS
解析;如果不存在,则去匹配 gfwlist 列表。如果在 gfwlist 里,则直接使用可信 DNS
解析;如果不存在,则继续当前版本的 ChinaDNS 的解析流程。 - 添加一个选项以支持 EDNS, 可以分别设置 EDNS 的 subnet 的 IP.
- 支持缓存查询结果和修改 TTL.
- 为了防止 UDP 丢包,在请求 DNS 的时候,连续(或者并发?)发送若干次(可自定义,默认不开启这个特性)请求,采用最先返回的结果。
# 看起来太臃肿了,还是用配置文件好...
chinadns \
-b 0.0.0.0 \
-p 5353 \
-c /etc/chinadns_chnroute.txt \
-m \
-s 119.29.29.29/113.109.35.70,127.0.0.1:5300/45.78.21.70 \ # 上游 DNS, 格式:DNS/Subnet,DNS/Subnet,..., 当不填写 Subnet 时禁用单个 DNS 的 EDNS.
-l /etc/chinadns_chinalist.txt \ # 中国域名列表,不填写时禁用
-g /etc/chinadns_gfwlist.txt \ # 黑名单域名列表,不填写时禁用
--min-ttl 600 \ # TTL 超时,不填写时禁用
--cache-size 1000 # 缓存大小,不填写时禁用
DNS Flow (ver. 2023 v1)