SmartDNS配置相关
转载自:https://pymumu.github.io/smartdns/
SmartDNS 是一个运行在本地的 DNS 服务器,它接受来自本地客户端的 DNS 查询请求,然后从多个上游 DNS 服务器获取 DNS 查询结果,并将访问速度最快的结果返回给客户端,以此提高网络访问速度。 SmartDNS 同时支持指定特定域名 IP 地址,并高性匹配,可达到过滤广告的效果; 支持DOT(DNS over TLS)和DOH(DNS over HTTPS),更好的保护隐私。
与 DNSmasq 的 all-servers 不同,SmartDNS 返回的是访问速度最快的解析结果。
支持树莓派、OpenWrt、华硕路由器原生固件和 Windows 系统等。
特性
- 多虚拟DNS服务器
支持多个虚拟DNS服务器,不同虚拟DNS服务器不同的端口,规则,客户端。 - 多 DNS 上游服务器
支持配置多个上游 DNS 服务器,并同时进行查询,即使其中有 DNS 服务器异常,也不会影响查询。 - 支持每个客户端独立控制
支持基于MAC,IP地址控制客户端使用不同查询规则,可实现家长控制等功能。 - 返回最快 IP 地址
支持从域名所属 IP 地址列表中查找到访问速度最快的 IP 地址,并返回给客户端,提高网络访问速度。 - 支持多种查询协议
支持 UDP、TCP、DOT 和 DOH 查询及服务,以及非 53 端口查询;支持通过socks5,HTTP代理查询; - 特定域名 IP 地址指定
支持指定域名的 IP 地址,达到广告过滤效果、避免恶意网站的效果。 - 域名高性能后缀匹配
支持域名后缀匹配模式,简化过滤配置,过滤 20 万条记录时间 < 1ms。 - 域名分流
支持域名分流,不同类型的域名向不同的 DNS 服务器查询,支持iptable和nftable更好的分流;支持测速失败的情况下设置域名结果到对应ipset和nftset集合。 - Windows / Linux 多平台支持
支持标准 Linux 系统(树莓派)、OpenWrt 系统各种固件和华硕路由器原生固件。同时还支持 WSL(Windows Subsystem for Linux,适用于 Linux 的 Windows 子系统)。 - 支持 IPv4、IPv6 双栈
支持 IPv4 和 IPV 6网络,支持查询 A 和 AAAA 记录,支持双栈 IP 速度优化,并支持完全禁用 IPv6 AAAA 解析。 - 支持DNS64
支持DNS64转换。 - 高性能、占用资源少
多线程异步 IO 模式,cache 缓存查询结果。 - 主流系统官方支持
主流路由系统官方软件源安装smartdns。
基础配置
smartdns配置的选项,功能比较丰富,但作为最基本的DNS服务,只需要配置服务端口号和上游服务器即可,其他参数默认情况下,对于家庭本地网络已经是最佳配置,无需做过多的修改。
配置样例
-
在smartdns.conf配置文件中,包含配置如下即可提供服务并对DNS查询加速:
# 监听53端口 bind [::]:53 # 配置上游服务器 server 8.8.8.8 server 114.114.114.114 server 202.96.128.166:53 server-tls 1.1.1.1
选项中:
- bind表示开启服务端,并监听对应的端口,
:53
表示绑定IPV4的53端口,[::]:53
表示绑定IPV6的53端口,后者在大部分系统中,同时也绑定了IPV4端口。 - server表示上游服务器IP地址,端口可以省略。如需要安全访问上游,可以使用server-tls, server-https。也可以使用URI方式,如server tls://1.1.1.1:853
- server不指定的情况下,将会自动读取
/etc/resolv.conf
文件中的系统DNS地址。
- bind表示开启服务端,并监听对应的端口,
服务端配置
smartdns目前提供了UDP, TCP, DOT, DOH四种服务端模式。
UDP服务端
-
通过
bind
参数配置,配置例子如下:bind 0.0.0.0:53@eth0 bind [::]:53@eth0 bind :53@eth0
选项中:
- @eth0,表示仅在对应的网口上提供服务。
- [::]:53, 表示监听IPV6和IPV4地址。
- :53,表示监听IPV4地址
TCP服务端
-
通过
bind-tcp
参数配置,配置例子如下:bind-tcp 0.0.0.0:53@eth0 bind-tcp [::]:53@eth0 bind-tcp :53@eth0
-
可选,参数tcp-idle-time控制TCP空闲断链时间
tcp-idle-time 120
DOT,DOH服务端
-
通过
bind-tls
,bind-https
参数配置,配置例子如下:# DOT 服务器 bind-tls 0.0.0.0:853@eth0 bind-tls [::]:853@eth0 bind-tls :853@eth0 # DOH 服务器 bind-https 0.0.0.0:443@eth0 bind-https [::]:443@eth0 bind-https :443@eth0
-
设置证书和密钥文件
bind-cert-file smartdns-cert.pem bind-cert-key-file smartdns-key.pem bind-cert-key-pass pass
选项中:
- bind-cert-file: 表示证书文件路径。
- bind-cert-key-file:表示证书密钥文件路径。
- bind-cert-key-pass: 表示证书密钥文件密码,可选。
注意:
上述三个参数如果不指定的情况下,smartdns将会自动在/etc/smartdns目录自动生成自签名证书
smartdns-cert.pem
和smartdns-key.pem
key文件,CN为smartdns。 -
可选,参数tcp-idle-time控制TCP空闲断链时间
tcp-idle-time 120
第二DNS服务
bind-*参数除了支持基本的启用服务外,还支持更多的附加特性,可以作为特殊因为的第二DNS服务器使用。对应的可以启用的功能为:
-
配置样例:
bind :53 -no-rule-addr -no-speed-check -no-cache
-
参数介绍:
参数 功能 -group
设置对应的上游服务器组 -no-rule-addr
跳过 address 规则 -no-rule-nameserver
跳过 Nameserver 规则 -no-rule-ipset
跳过 ipset 和 nftset 规则 -no-rule-soa
跳过 SOA(#) 规则 -no-dualstack-selection
停用双栈测速 -no-speed-check
停用测速 -no-cache
停止缓存 -force-aaaa-soa
禁用IPV6查询 -no-ip-alias
忽略ip集合规则 -ipset [ipsetname]
将对应请求的结果放入指定ipset -nftset [nftsetname]
将对应的请求结果放入指定的nftset
缓存
SmartDNS提供了缓存能力,开启缓存的情况下,能提供更好的DNS查询请求;smartdns提供的过期缓存功能会将体验更进一步提升。
缓存配置
SmartDNS可以通过cache-size
配置缓存的条数,同时也可以通过cache-persist
来配置是否持久化缓存,也可以通过cache-file
来指定缓存文件存储路径
cache-size 32768
cache-persist yes
cache-file /path/to/cache/file
注意:
- smartdns默认自动根据磁盘空间是否启用缓存。
- 缓存文件只有在进程正常退出的时候才会保存供下次使用。
- 缓存大小cache-size一般情况无需设置,smartdns会根据系统内存情况自动设置。
缓存预获取
Smartdns可以设置缓存预获取,避免缓存超时,配置预先获取后,smartdns将在域名超时前的5s内,重新进行域名查询。并对域名的热度进行排序。
prefetch-domain yes
注意:
- 此功能将会导致smartdns消耗更多的CPU。
过期缓存
过期缓存,也要乐观缓存,其功能指定是,当DNS域名的TTL到0时,其结果仍然存储在缓存中,等下次查询时,仍然将缓存的结果返回给客户端,避免客户端等待。乐观缓存的前提时,DNS的对应的IP地址不会频繁变化。
具体乐观缓存的原理可以参考(RFC 8767) (https://www.rfc-editor.org/rfc/rfc8767)
smartdns过期缓存处理流程
通过上述序列图可以看到,当缓存过期时,smartdns仍然将过期的IP地址发给客户端,这样客户端就能很快的进行连接服务器,这种机制的前提是服务器IP地址没有变化。
现实中,大部分情况下,修改域名IP地址后,是不会立即生效到千家万户的,因为一般IP变化域名后,全球域名系统刷新完成最长可能要72小时。
即时出现过期缓存中的IP地址,故障失效,smartdns返回给客户端过期IP的TTL只有3s,那么3s后,客户端就会重新使用新的IP,表现在客户端程序中,可能就是要刷新页面重试一次。
并且,针对实现场景,smartdns可以设置预获取prefetch-domain yes
来尽量避免此问题发生。
所以,主要场景下开启过期缓存是比较好的实践。
注意:prefetch-domain yes
功能,在开启过期缓存功能的情况下,行为和未开启有差别,开启过期缓存的情况下,仅当域名要从缓存中过期时,才进行预读取,而不是TTL超时获取。 所以,开启了过期缓存的情况下,推荐开启域名预获取功能。
配置步骤
-
开启过期缓存
serve-expired yes
-
配置过期缓存超时时间
此时间表示过期缓存多长时间未访问,则从缓存中释放。
serve-expired-ttl 259200
-
配置过期缓存响应TTL
此时间表示当缓存中域名TTL超时时,返回给客户端的TTL时间,让客户端在下列TTL时间后再次查询。
serve-expired-reply-ttl 3
-
过期缓存预获取时间
此时间表示,过期缓存在多长时间未访问,主动进行预先获取,以避免IP无效;开启过期缓存后,prefetch的功能将和未开启不同。
prefetch-domain yes serve-expired-prefetch-time 21600
关闭特定域名的缓存
-
某些情况下,可能需要关闭特定域名的缓存,比如DDNS。可以使用下面的配置关闭。
domain-rules /example.com/ -no-cache
设置cache定时保存
-
为避免cache因为系统或进程复位丢失,可以设置smartdns周期保存cache文件。
cache-checkpoint-time 86400
广告屏蔽
smartdns可以通过address选项来屏蔽广告。
注意:openwrt有luci的方式,请参考openwrt屏蔽域名配置方法。
基本配置方法
-
通过
address /domain/#
选项屏蔽广告,如。address /example.com/#
address选项中:
- /domain/为后缀匹配算法,范围包含其子域名。
- 单独
#
表示同时屏蔽IPV4, IPV6, - 使用
#6
表示屏蔽IPV6 - 使用
#4
表示屏蔽IPV4。 - 使用
-
表示不屏蔽此域名。
-
如单独屏蔽IPV6
address /example.com/#6
-
如果想不屏蔽某个子域名
address /sub.example.com/-
-
前缀通配与主域名匹配
// 通配 *-a.example.com // 仅匹配子域名 *.example.com // 仅匹配主域名 -.example.com
注意:* 和 - 仅支持写在域名开头。其他位置的写法均不支持。
使用域名集合
对于单个域名屏蔽,可以方便使用address参数屏蔽,对于较多的域名,可通过域名集合屏蔽,更加方便管理广告域名列表。
domain-set -name ad -file /path/to/adblock.list
address /domain-set:ad/#
adlobck.list的内容为每行一个域名。
a.com
b.com
...
使用社区已有smartdns广告过滤列表
社区针对smartdns提供了每日更新的广告列表文件,可以直接使用这些广告列表文件,smartdns可以通过conf-file选项包含广告屏蔽文件。另外在使用这些广告列表文件时,可以定期下载更新文件,并重启smartdns生效。
-
下载配置文件到
/etc/smartdns
目录wget https://anti-ad.net/anti-ad-for-smartdns.conf -O /etc/smartdns/anti-ad-smartdns.conf
-
修改/etc/smartdns/smartdns.conf文件,包含上述配置文件
conf-file /etc/smartdns/anti-ad-smartdns.conf
广告列表
项目 | 说明 | 配置文件 |
---|---|---|
anti-AD | Anti Advertising for smartdns | https://anti-ad.net/anti-ad-for-smartdns.conf |
adrules | AdRules SmartDNS List | https://adrules.top/smart-dns.conf |
neodevhost | neodevhost SmartDNS List | https://raw.githubusercontent.com/neodevpro/neodevhost/master/lite_smartdns.conf |
非smartdns列表
对于非smartdns的数据,可以通过简单的shell命令进行转换。
hosts格式
如下面命令,可以使用hosts-file
来指定hosts格式文件
hosts-file /etc/smartdns/anti-ad-smartdns.hosts
也可以通过如下命令将hosts文件转换为smartdns特有格式。
cat /path/to/hosts/file | grep -v "^#" | awk '{print "address /"$2"/#"}' > anti-ad-smartdns.conf
dnsmasq格式
dnsmasq格式和smartdns类似,但不兼容,可以通过如下命令转换
cat /path/to/dnsmasq/file | grep address | awk -F= '{print "address "$2"#"}' > anti-ad-smartdns.conf
双栈优选
目前大部分家庭用户已经有IPV6,IPV4双栈网络,目前大部分操作系统都会优先使用IPV6网络,但某些域名会出现IPV4网络好于IPV6的情况,另外一些域名会出现IPV6网络好于IPV4的情况。
SmartDNS提供了双栈优选的功能,会自动进行测速,优先让客户端操作系统使用速度快的IP地址。
配置步骤
-
使用
dualstack-ip-selection
配置启用双栈优选dualstack-ip-selection yes
-
如需要倾向使用IPV6,则可以使用
dualstack-ip-selection-threshold
进行阈值调整dualstack-ip-selection-threshold 10
注意:
- 单位为ms,两个IP地址的速度阈值大于配置值时,才会进行优选。
-
允许纯IPV6地址。
smartdns默认情况下总是会返回IPV4地址,原因是某些软件不具备IPV6的访问能力,但如果确实需要使用纯IPV6地址,可以设置允许smartdns仅优选IPV6。
dualstack-ip-allow-force-AAAA yes
特殊应用
某些情况下,可能要临时关闭某些域名的双栈优选,可以通过如下两种方式:
-
对指定端口查询的域名关闭优选
bind [::]:53 -no-dualstack-selection
-
对特定域名关闭优选
domain-rules /example.com/ -dualstack-ip-selection no
禁用IPV6
目前IPV6已经进入千家万户,但有时需要禁用IPV6地址,smartdns支持如下方式禁用IPV6地址。
-
方法一:完全禁用IPV6
force-AAAA-SOA yes
-
方法二:禁用特定域名的IPV6
address /example.com/#6
-
方法三:如需禁用特定查询端口的IPV6查询(比如第二DNS),可以配置如下
bind :53 -force-aaaa-soa
-
例外配置:
在开启禁用AAAA记录时,如果需要特定的例外域名,可以通过下面方式添加例外
address /example.com/- address /example.com/-6
其他查询请求的禁用
-
smartdns支持对其他查询请求的禁用,对应参数为force-qtype-SOA
force-qtype-SOA 28
force-qtype-SOA参数后为DNS的类型。具体的类型,可以查询IANA说明
清除指定的类型
force-qtype-SOA -,28
清除所有类型
force-qtype-SOA -
附加说明
smartdns具备自动检测IPV6环境的能力,如果网络环境不支持IPV6,则会自动禁用IPV6相关的优化功能。
DNS分流
smartdns可以支持将特定域名使用特定的 DNS 服务器来查询来做到 DNS 分流。比如
.home -> 192.168.1.1 # .home 结尾的域名发送到 192.168.1.1 解析
.office -> 10.0.0.1 # .office 结尾的域名发送到 10.0.0.1 解析
其他域名采用默认的模式解析,这种情况的分流配置如下:
配置步骤
-
配置上游服务器组,并对上游使用
-group
进行分组# 配置上游,用 -group 指定组名,用 -exclude-default-group 将服务器从默认组中排除。 server 192.168.1.1 -group home -exclude-default-group server 10.0.0.1 -group office -exclude-default-group server 8.8.8.8
-
配置对应域名解析时使用的服务器组
# 上游服务器规则,.home结尾的域名全部使用home组的服务器查询 nameserver /home/home # 上游服务器规则,.office结尾的域名全部使用office组查询。 nameserver /office/office
类似的,home可以换成domestic,office可以换成oversea
更多能力
通过上述配置即可实现 DNS 解析分流后,如果需要实现按请求端端口分流,可以配置第二 DNS 服务器,bind
配置增加 --group
参数指定分流服务器组名称。
bind :7053 -group office
bind :8053 -group home
通过上述配置,到7053端口查询的请求,全部使用office查询,到8053端口查询的请求,全部使用home查询。
测速模式
smartdns可修改测速模式,和数据响应模式。这两种模式影响查询的性能和效果。
模式 | 参数 | 说明 |
---|---|---|
测速模式 | speed-check-mode | smartdns速度检测模式 |
响应模式 | response-mode | 结果回应模式 |
速度检测模式
SmartDNS提供了两种测速模式,分别是ping和tcp。smartdns默认使用三次测速。第一次为ping,第二次为tcp的80端口,第三次为tcp的443端口,可通过speed-check-mode修改测速模式
-
全局测速模式配置
speed-check-mode ping,tcp:80,tcp:443 speed-check-mode tcp:443,ping speed-check-mode none
选项中:
- ping表示使用ping模式,tcp:端口号,表示使用tcp链接对应的端口
- none表示不进行测速
- 测速选项的触发: 当配置3种测速模式后,smartdns首先用第一种,200ms后,用第二种,400ms后用第三种。
-
单域名测速模式配置
domain-rules /example.com/ -speed-check-mode ping,tcp:80,tcp:443
-
对应端口查询时关闭测速
bind [::]:53 -no-speed-check
-
额外的
如果分流的域名通过转发程序转发,则考虑关闭转发域名的测速功能,避免测速和出口不一致导致的体验反作用,关闭特定域名的测速方式如下:
domain-rules /example.com/ -speed-check-mode none
响应模式配置
Smartdns支持通过response-mode
设置首次请求响应模式,这三种模式影响查询结果和响应时间,smartdns默认使用了优化方案,但用户也可根据需要进行修改;这三种模式对应的功能和性能如下:
模式 | 配置项 | 时延 | 结果 | 说明 |
---|---|---|---|---|
最快ping响应地址模式 | first-ping | 适中 | 可能次佳 | DNS上游最快查询时延+ping时延最短,查询等待与链接体验最佳。(当前默认) |
最快IP地址模式 | fastest-ip | 长 | 最佳 | 查询到的所有IP地址中ping最短的IP。DNS查询时间最长,IP链接最短。(之前模式) |
最快响应的DNS模式 | fastest-response | 短 | 可能最差 | DNS查询等待时间最短。 |
对于开启了缓存功能后,缓存后的数据,无论使用哪种方式,smartdns都会将最佳结果保存到缓存中,所以不建议关闭缓存。
对指定域名设置返回模式
-
某些情况下,可能需要设置特定域名的响应模式,以提高上网体验,可以配置下面参数
domain-rules /example.com/ -r first-ping domain-rules /example.com/ -response-mode fastest-response
域名规则
为方便对同一个域名设置多个规则,smartdns提供了domain-rules
参数,可以对域名设置多个规则。
规则设置
使用domain-rules
设置多个规则,如:
domain-rules /a.com/ -g group -address #6 -ipset ipset
# 设置全局规则。
domain-rules /./ -no-cache
domain-rules的选项请阅读配置选项。常用选项:
参数 | 功能 |
---|---|
-group |
设置对应的规则组 |
-address |
指定域名地址 |
-nameserver |
指定上游服务器组 |
-speed-check-mode |
测速模式 |
-dualstack-ip-selection |
双栈优选 |
-no-cache |
停止缓存 |
-no-ip-alias |
忽略ip集合规则 |
-ipset [ipsetname] |
将对应请求的结果放入指定ipset |
-nftset [nftsetname] |
将对应的请求结果放入指定的nftset |
域名通配
/domain/域名匹配规则符号。
// 通配
*-a.example.com
// 仅匹配子域名
*.example.com
// 仅匹配主域名
-.example.com
注意:* 和 - 仅支持写在域名开头。其他位置的写法均不支持。
域名集合
在有/domain/配置的选项使用域名集合,只需要将/domain/
配置为/domain-set:[集合名称]/
即可,如:
domain-set -name ad -file /etc/smartdns/ad-list.conf
domain-rules /domain-set:ad/ -a #
客户端规则
smartdns支持根据客户端IP,MAC地址,对客户端设置不同的规则,可以实现:
- 家长控制:限制特定客户端可访问的网站。
- 访问控制:禁止未经允许的客户端查询。
- 基于客户端域名分流查询:设置规则组和上游组绑定,不同的客户端查询不同的上游。
家长控制
设置smartdns针对特定的客户端使用特定的上游查询,也可以设置禁止访问特定的域名或IP地址,来实现家长控制。
# 启用规则组
group-begin child
# 设置规则组对应的客户端IP
client-rules 192.168.1.13
# 设置规则对应的客户端MAC地址
client-rules 01:02:03:04:05:06
# 设置规则组使用的上游服务器
server 1.2.3.4 -e
# 禁止特定域名
address /block.com/#
# 禁止特定IP
ignore-ip 2.2.2.2
group-end
为方便管理,也可采用多配置文件的方式,如
-
主配置文件
conf-file child.conf -group child
-
包含的配置文件
# 设置规则组对应的客户端IP client-rules 192.168.1.13 # 设置规则组使用的上游服务器 server 1.2.3.4 -e # 禁止特定域名 address /block.com/# # 禁止特定IP ignore-ip 2.2.2.2
其中group-begin和group-end的配置块,等价于conf-file -group 包含的配置文件,
访问控制
smartdns支持基本的ACL功能,可以通过如下参数开启和设置允许访问的主机。
# 启用ACL
acl-enable yes
# 设置允许访问的主机
client-rules 192.168.1.2/24
基于客户端域名分流查询
类似家长控制,smartdns可以将特定需要分流和配合ipset/nftset访问的主机,进行分流。
-
主配置文件
conf-file oversea.conf -group oversea
-
包含的配置文件
# 设置规则组对应的客户端IP client-rules 192.168.1.13 # 设置规则组使用的上游服务器 server-https https://1.2.3.4 -e server-tls tls://1.2.3.4 -e # 禁止测速 speed-check-mode none # 禁止IPV6和HTTPS记录 force-qtype-SOA 28 65 # 设置ipset ipset oversea
指定域名地址
address除了可以设置屏蔽广告外,还可以指定域名的IP地址。
基本配置方法
-
通过
address /domain/ip
选项指定IP,如。address /example.com/1.2.3.4 address /example.com/4.5.6.7,8.9.10.11,12.13.14.15
address选项中:
- /domain/为后缀匹配算法,范围包含其子域名。
- ip: 可以为IPV6,或IPV4地址,可以指定多个IP地址,如果有多个IP地址,查询的时候,将会进行随机排序。
-
设置全局屏蔽IPV6
address #6
当不指定域名时,设置全局规则。
-
指定IPV6
address /example.com/::1
-
前缀通配与主域名匹配
// 通配 *-a.example.com // 仅匹配子域名 *.example.com // 仅匹配主域名 -.example.com
注意:* 和 - 仅支持写在域名开头。其他位置的写法均不支持。
自动扩展address对应的PTR记录
如果想扩展上述address对应的PTR记录,可以使用expand-ptr-from-address
开关开启自动扩展。expand-ptr-from-address
参数可以重复设置,参数对设置后的address
生效。
expand-ptr-from-address yes
address /example.com/1.2.3.4
expand-ptr-from-address no
读取hosts文件指定域名地址
smartdns可以读取hosts格式文件来解析域名,通过hosts-file [path]
参数配置。
hosts-file /etc/hosts
cname别名查询
某些情况下,需要将a域名的查询,使用b域名的结果,比如某些CDN速度的优化,此时可以使用cname别名查询功能。
配置步骤
-
使用
cname /a.com/b.com
配置别名。cname /a.com/b.com
上述例子,查询a.com时,将会使用b.com的查询结果。
域名集合的使用
为方便按集合配置域名,对于有/domain/的配置,可以指定域名集合,方便维护。具体方法为:
-
使用
domain-set
配置集合文件,如domain-set -name ad -file /etc/smartdns/ad-list.conf
ad-list.conf的格式为一个域名一行,如
ad.com site.com
-
在有/domain/配置的选项使用域名集合,只需要将
/domain/
配置为/domain-set:[集合名称]/
即可,如:address /domain-set:ad/# domain-rules /domain-set:ad/ -a # nameserver /domain-set:ad/server
规则组
smartdns支持规则组,不同的规则组之间隔离,方便按照域名或客户端匹配过滤规则。
相关的参数有
参数 | 功能 |
---|---|
group-begin [-g|group group-name] | 规则组开始 |
group-end | 规则组结束 |
group-match | 匹配规则组条件,可以设置域名或客户端IP。 |
conf-file -group | 以指定规则组包含文件,等价group-begin, group-end |
通过group-match可以指定匹配规则,有客户端IP:-client-ip cidr|ip-set|mac
,域名:-domain
。
按域名或客户端IP匹配规则组
# 规则开始,指定名称为rule。
group-begin rule
# 设置匹配规则,如下为匹配IP、MAC或者域名。
group-match -client-ip 192.168.1.1/24 -domain a.com
group-match -client-ip 01:02:03:04:05:06
group-match -client-ip ip-set:clien-ip
group-match -domain domain-set:domain-list
# 设置相关的规则
address #
# 规则结束
group-end
包含文件规则组
也可以包含外部文件处理规则组,方便维护管理。
主要文件包含外部文件,并且-group
指定规则组名称
conf-file client.conf -group rule
包含的规则文件,指定匹配条件
group-match -client-ip 192.168.1.1/24 -domain a.com
address #
使用ipset和nftset
和Dnsmasq类似,smartdns支持ipset和nftset,可以将特定的域名通过TPROXY进行透明转发,透明转发涉工具模式对比如下:
-
工具:iptable,nftable
iptable:成熟的路由规则配置工具。
nftable:更加强大的规则配置工具,正在成为主流。
ipset配置
-
基本配置
通过如下参数可以配置指定域名的NFTSet规则
# 全局配置ipset ipset ipsetname # 指定域名配置ipset ipset /domain/ipset # 指定IP类型配置ipset ipset /domain/[#4:ipsetv4,#6:ipsetv6] # 忽略ipset规则 ipset /domain/-
-
超时
SmartDNS设置IPSet,支持设置是否启用超时功能,这样可以避免NFTSet中过多IP地址,网关性能下降。启用方式为
ipset-timeout yes
-
测速失败后,自动添加到IPSet
SmartDNS可以将测速失败的IP地址,加入IPSet,再由相关IP规则转发
ipset-no-speed ipsetname
nftset配置
-
基本配置
通过如下参数可以配置指定域名的IPSet规则
# 全局配置nftset nftset [#4:ip#table#set,#6:ipv6#table#setv6] # 指定域名配置nftset nftset /domain/[#4:ip#table#set,#6:ipv6#table#setv6] # 忽略nftset规则 nftset /domain/#4:-,#6:-
-
超时
SmartDNS设置IPSet,支持设置是否启用超时功能,这样可以避免IPSet中过多IP地址,网关性能下降。启用方式为
nftset-timeout yes
-
测速失败后,自动添加到IPSet
SmartDNS可以将测速失败的IP地址,加入IPSet,再由相关IP规则转发
nftset-no-speed ipsetname
-
DEBUG调试
如需要Debug调试,可以开启nftset的调试功能。
nftset-debug yes
对特定的服务端口设置ipset和nftset
smartdns的bind参数,支持设置ipset和nftset,当设置了ipset和nftset的端口接收到请求后,将对此端口的查询请求设置ipset和nftset。
通过如下配置,可以将对于端口的查询请求,全部设置到ipset中,比如将第二DNS的所有查询结果,放入ipset。
bind [::]:6053 -ipset [ipset] -nftset [nftset]
- -ipset:参数选项参考ipset选项。
- -nftset:选项参考nftset。
注意,bind配置ipset或nftset后,将自动禁用域名预查询
、过期缓存
和双栈优选
功能。
通过代理查询
smartdns支持通过代理服务器进行查询,支持的代理服务器有socks5和http代理服务器。socks5支持udp和tcp类型的代理,而http不支持udp代理,注意区分。
配置步骤
-
使用
proxy-server
配置代理服务器proxy-server socks5://1.2.3.4 -name socks5
-
使用
-proxy
参数,配置server使用代理服务器:server 8.8.8.8 -proxy socks5
注意proxy-server的-name
和server的-proxy
须为同一个名称。
DNS64
DNS64用于支持纯IPV6网络访问IPV4网站,smartdns对此也提供了支持,可使用dns64参数配置DNS64服务器。
配置步骤
-
使用
dns64 ip/mask
配置DNS64前缀。dns64 64:ff9b::/96
-
在纯IPV6的环境下,建议关闭双栈优选功能。
dualstack-ip-selection no
IP规则
smartdns提供了IP地址黑白名单和忽略相关的结果。
参数 | 功能 | 使用场景 |
---|---|---|
whitelist-ip | 白名单 IP 地址 | 接受在指定范围内的IP地址设置。 |
blacklist-ip | 黑名单 IP 地址 | 接受在指定范围外的IP地址设置。 |
ignore-ip | 忽略 IP 地址 | 不需要某个IP地址,或IP地址段时设置。 |
bogus-nxdomain | 假冒 IP 地址过滤 | 请求结果包含对应IP地址时,返回SOA。 |
ip-alias | IP别名规则 | IP地址映射,可用于具备Anycast IP的CDN加速,比如Cloudflare的CDN。参考IP别名。 |
白名单IP地址
如果想对某个上游限制其返回的IP地址在白名单范围,非白名单的地址全部丢弃,则可以设置如下:
方法1:
server -whitelist-ip
whitelist-ip 192.168.1.1/24
方法2:
server -whitelist-ip
ip-rules 192.168.1.1/24 -whitelist-ip
黑名单IP地址
如下想对某个上游限制其返回的IP地址,将指定范围的IP丢弃,则可设置黑名单如下:
方法1:
server -blacklist-ip
blacklist-ip 192.168.1.1/24
方法2:
server -blacklist-ip
ip-rules 192.168.1.1/24 -blacklist-ip
忽略IP地址
如果希望使用上游返回的某个IP地址,可以配置忽略此IP。
方法1:
ignore-ip 1.2.3.4
方法2:
ip-rules 192.168.1.1/24 -ignore-ip
假冒IP地址
如果网站不存在时,被ISP固定返回某个网段的IP地址的404页面,则可以使用此参数;比如电信的自定义404页面。则可以通过如下配置,让客户端接受到SOA,而不是被重定向的ISP的404页面。
方法1:
bogus-nxdomain 1.2.3.4
方法2:
ip-rules 1.2.3.4 -bogus-nxdomain
IP集合
如果有多个IP地址配置规则,可以使用IP集合,进行快速配置。
IP地址集合的使用
为方便按集合配置IP地址,对于使用到ip/subnet
的配置,可以指定IP地址集合,方便维护。具体方法为:
-
使用
ip-set
配置集合文件,如ip-set -name cloudflare -file /etc/smartdns/cloudflare-list.conf
cloudflare-list.conf的格式为一个IP地址一行,如
1.2.3.4 192.168.1.1/24
-
在有
ip/subnet
配置的选项使用IP地址集合,只需要将ip/subnet
配置为ip-set:[集合名称]/
即可,如:ignore-ip ip-set:cloudflare ip-rules ip-set:cloudflare -whitelist-ip ip-alias ip-set:cloudflare 192.168.1.1
P别名
smartdns提供了IP地址别名映射功能,可以将查询结果中的IP或IP段映射为特定IP地址;
此特性可用用于具有anycast IP的CDN网络加速。比如Cloudflare的CDN加速。
IP别名映射
映射指定的IP地址到目标地址,如将1.2.3.4的C类地址全部映射到192.168.1.1
ip-alias 1.2.3.4/24 192.168.1.1
设置特定域名忽略IP别名
某些情况下,需要设置特定域名的结果不进行IP别名转换,则可通过域名规则忽略IP别名。
domain-rules /example.com/ -no-ip-alias
Cloudflare CDN加速
Cloudflare CDN的IP地址都是anycast IP地址,用户可通过任意Cloudflare的IP地址来访问其托管的网站。
通过此特性,我们可以找到自己网络访问Cloudflare CDN最快的IP地址,并设置IP别名,来加速所有托管在Cloudflare上的网站。
其步骤如下:
获取Cloudflare的IP地址范围并保持为IP列表文件
Cloudflare公开了其CDN的IP地址范围,具体范围在这里可以找到https://www.cloudflare.com/ips/
IPV4:https://www.cloudflare.com/ips-v4/#
IPV6:https://www.cloudflare.com/ips-v6/#
将上述列表保存为文本,比如:cloudflare-ipv4.txt
, cloudflare-ipv6.txt
-
cloudflare-ipv4.txt
173.245.48.0/20 103.21.244.0/22 103.22.200.0/22 103.31.4.0/22 141.101.64.0/18 108.162.192.0/18 190.93.240.0/20 188.114.96.0/20 197.234.240.0/22 198.41.128.0/17 162.158.0.0/15 104.16.0.0/13 104.24.0.0/14 172.64.0.0/13 131.0.72.0/22
-
cloudflare-ipv6.txt
2400:cb00::/32 2606:4700::/32 2803:f800::/32 2405:b500::/32 2405:8100::/32 2a06:98c0::/29 2c0f:f248::/32
查找本网络访问Cloudflare最快的IP
社区提供了找到最快Cloudflare IP地址的工具:CloudflareSpeedTest,我们可以使用此工具找到最快的IP地址。
对应命令如下
./CloudflareSpeedTest -url https://down.heleguo.top/download/100MB.zip
执行成功后,将会获得最快的IP地址。
由于工具随机使用了一些IP地址测速,可以多执行几次上述命令,以确保获取到最快IP地址。
配置smartdns加速
原理是通过ip-alias命令将Cloudflare的整个anycast IP映射到CloudflareSpeedTest获取到的最快的IP地址上。
配置smartdns如下
# 设置Cloudflare IPV4别名映射
ip-set -name cloudflare-ipv4 -file /path/to/cloudflare-ipv4.txt
ip-rules ip-set:cloudflare-ipv4 -ip-alias 162.159.58.17,162.159.58.124
# 设置Cloudflare IPV6别名映射
ip-set -name cloudflare-ipv6 -file /path/to/cloudflare-ipv6.txt
ip-rules ip-set:cloudflare-ipv6 -ip-alias 2606:4700:17:d8e7:5e98:7d62:6674:c5a7
安全相关
smartdns为DNS服务器,默认绑定53端口,这时smartdns需要root权限,并且有可能导致外网也能进行数据查询。所以通过如下方式对smartdns进行安全加固
使用非root权限运行
通过user指定非root用户运行,如使用nobody运行
user nobody
绑定特定的IP或网口
通过bind参数,指定绑定的IP地址,或网口
-
绑定特定的IP
bind 192.168.1.1:53
-
绑定特定的网口
bind [::]:53@eth0
对公网提供查询时,使用TLS服务器
使用TLS服务器对外提供服务
bind-tls [::]:853@eth0
启用审计日志
smartdns可以通过如下配置,启用审计日志,记录DNS查询请求
audit-enable yes
audit-num 16
audit-size 16M
audit-file /var/log/smartdns/smartdns-audit.log
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。