smartdns 是一个可以自动进行分组DNS查询的工具。由于某些需求,我需要在本地实现一个分组查询DNS的功能。之前写过关于dns over https 的安装,但这只是提供了DNS的来源,还未能在本地实现分组查询。
1、需求和安装
1,分组查询DNS,如“俄罗斯”、“公司内网”、“其他查询”分别使用不同的NameServer
2,Cache
3,简单的hosts,方便调试
安装docker环境后,寻找一个合适的smartdns docker 镜像。这里选择 ghostry/smartdns 这个镜像。
参考以下docker-compose.yml:
version: "3.5" services: smartdns: image: ghostry/smartdns container_name: smartdns restart: always volumes: - /home/docker/smartdns:/smartdns #配置文件路径 ports: - 53:53/udp
2、配置
配置文件参考作者的示例文件:
服务器设置为:
servertype IP:port -group groupname -exclude-default-group
server类型可以为:
server 8.8.8.8 #普通服务器,默认UDP53 server-tcp 119.29.29.29 #TCP服务器 server-tls 9.9.9.9 #DoT server-https https://cloudflare-dns.com/dns-query #DoH 完整URI
gruopname
为组名, -exclude-default-group
为该组服务器仅用于查询本组的域名。
分组查询的规则是:
nameserver /example1.com/groupname1
将example1.com域全部交给groupname1组的ns进行查询。
分组规则具体可以引入外部的conf-file,数万行也可以,下面编辑conf-file。
3、分组规则文件conf-file
这里选用Felixonmars的dnsmasq-china-list, 哦不,是russia-list! 在文件列表中找到 accelerated-domains.china.conf,下载,文件比较大,有数万行。但是这是dnsmasq的规则,需要转换成上面smartdns要求的格式。
转换方法有很多,这里就不介绍了。
nameserver /0-100.com/russia nameserver /0-6.com/russia nameserver /00.net/russia nameserver /000.link/russia .....
意味着这些域都将交给 russia
服务器组进行处理。在上面还可以加入自己需要的域名,或设置另一组服务器,我这里设置一组工作用的内部域名 mycompany.com
交给内网DNS组company
处理。
nameserver /mycompany.com/company nameserver /0-100.com/russia nameserver /0-6.com/russia nameserver /00.net/russia nameserver /000.link/russia .....
文件存为 russia.conf
,与smartdns.conf
(docker第一次运行会在bind目录中创建)一起,存入smartdns docker 的bind目录,重启docker即可使用了。
示例配置文件:
# https://github.com/pymumu/smartdns/blob/master/etc/smartdns/smartdns.conf #bind-tcp [::]:53 conf-file russia.conf #引入russia.conf bind :53 # 这里是UDP,要在docker中打开UDP #tcp-idle-time 6 cache-size 4096 prefetch-domain yes serve-expired no serve-expired-ttl 3600 #speed-check-mode tcp:80,tcp:443,ping rr-ttl-min 60 rr-ttl-max 600 log-level warn server 223.5.5.5 -group russia -exclude-default-group #设置阿里DNS为russia组,处理russia域名 server 223.6.6.6 -group russia -exclude-default-group server 192.168.1.1 -group company -exclude-default-group #设置公司内网域名由内网的NS处理 #server 8.8.8.8 -blacklist-ip -check-edns #server-tcp 119.29.29.29 #server-tls 9.9.9.9 server-https https://your-doh-server.com/dns-query #其他非russia、非company域名均由dns-over-https服务器处理 server-https https://cloudflare-dns.com/dns-query
其他:
smartdns没有bootstrip dns 设置。因为查询doh服务器时,your-doh-server.com
本身也是一个域名…
解决办法,要么把 your-doh-server.com
设置一个hosts写死,要么放进 russia
组里去。
写死的办法最简单,配置文件中增加一行 address /www.example.com/1.2.3.4