Docker安装smartdns实现dns分流

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

发表评论

邮箱地址不会被公开。 必填项已用*标注