ChinaDNS 的上游 DNS 分为 国内 DNS 和 可信 DNS。
- ChinaDNS 会同时向上游的 DNS 发送请求。
- 如果
可信 DNS先返回,则直接采用可信 DNS的结果。 - 如果
国内 DNS先返回,分两种情况:如果返回的结果是国内的 IP, 则采用;否则丢弃并转而采用可信 DNS的结果。
- 要确保
国内 DNS的查询速度要比可信 DNS快,才能达到线路优化的效果。 - 不能在
可信 DNS下做缓存,否则可信 DNS会一直先比国内 DNS先返回,达不到线路优化的效果。
最近玩了一下 CleanDNS 和 overture, 看到一些比较好的特性,如果把这些特性搬到 ChinaDNS 上面,那可以总结一下:
- 先额外准备好以下两个列表:chinalist.txt 中国域名列表、gfwlist.txt 黑名单域名列表。
- 当接收到请求的时候,先去匹配请求的域名是否在 chinalist 列表里。如果存在,则直接使用
国内 DNS解析;如果不存在,则去匹配 gfwlist 列表。如果在 gfwlist 里,则直接使用可信 DNS解析;如果不存在,则继续当前版本的 ChinaDNS 的解析流程。 - 添加一个选项以支持 EDNS, 可以分别设置 EDNS 的 subnet 的 IP.
- 支持缓存查询结果和修改 TTL.
# 看起来太臃肿了,还是用配置文件好...
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 # 缓存大小,不填写时禁用
用了很长时间但一直没弄明白chinadns的控制流程,现在终于明白了,非常感谢分享心得!但为什么可信dns缓存就达不到线路优化呢?