转载自: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 系统等。

特性

  1. 多虚拟DNS服务器
    支持多个虚拟DNS服务器,不同虚拟DNS服务器不同的端口,规则,客户端。
  2. 多 DNS 上游服务器
    支持配置多个上游 DNS 服务器,并同时进行查询,即使其中有 DNS 服务器异常,也不会影响查询。
  3. 支持每个客户端独立控制
    支持基于MAC,IP地址控制客户端使用不同查询规则,可实现家长控制等功能。
  4. 返回最快 IP 地址
    支持从域名所属 IP 地址列表中查找到访问速度最快的 IP 地址,并返回给客户端,提高网络访问速度。
  5. 支持多种查询协议
    支持 UDP、TCP、DOT 和 DOH 查询及服务,以及非 53 端口查询;支持通过socks5,HTTP代理查询;
  6. 特定域名 IP 地址指定
    支持指定域名的 IP 地址,达到广告过滤效果、避免恶意网站的效果。
  7. 域名高性能后缀匹配
    支持域名后缀匹配模式,简化过滤配置,过滤 20 万条记录时间 < 1ms。
  8. 域名分流
    支持域名分流,不同类型的域名向不同的 DNS 服务器查询,支持iptable和nftable更好的分流;支持测速失败的情况下设置域名结果到对应ipset和nftset集合。
  9. Windows / Linux 多平台支持
    支持标准 Linux 系统(树莓派)、OpenWrt 系统各种固件和华硕路由器原生固件。同时还支持 WSL(Windows Subsystem for Linux,适用于 Linux 的 Windows 子系统)。
  10. 支持 IPv4、IPv6 双栈
    支持 IPv4 和 IPV 6网络,支持查询 A 和 AAAA 记录,支持双栈 IP 速度优化,并支持完全禁用 IPv6 AAAA 解析。
  11. 支持DNS64
    支持DNS64转换。
  12. 高性能、占用资源少
    多线程异步 IO 模式,cache 缓存查询结果。
  13. 主流系统官方支持
    主流路由系统官方软件源安装smartdns。

基础配置

smartdns配置的选项,功能比较丰富,但作为最基本的DNS服务,只需要配置服务端口号和上游服务器即可,其他参数默认情况下,对于家庭本地网络已经是最佳配置,无需做过多的修改。

配置样例

  1. 在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地址。

服务端配置

smartdns目前提供了UDP, TCP, DOT, DOH四种服务端模式。

UDP服务端

  1. 通过bind参数配置,配置例子如下:

    bind 0.0.0.0:53@eth0
    bind [::]:53@eth0
    bind :53@eth0

    选项中:

    • @eth0,表示仅在对应的网口上提供服务。
    • [::]:53, 表示监听IPV6和IPV4地址。
    • :53,表示监听IPV4地址

TCP服务端

  1. 通过bind-tcp参数配置,配置例子如下:

    bind-tcp 0.0.0.0:53@eth0
    bind-tcp [::]:53@eth0
    bind-tcp :53@eth0
  2. 可选,参数tcp-idle-time控制TCP空闲断链时间

    tcp-idle-time 120

DOT,DOH服务端

  1. 通过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
  2. 设置证书和密钥文件

    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.pemsmartdns-key.pem key文件,CN为smartdns。

  3. 可选,参数tcp-idle-time控制TCP空闲断链时间

    tcp-idle-time 120

第二DNS服务

bind-*参数除了支持基本的启用服务外,还支持更多的附加特性,可以作为特殊因为的第二DNS服务器使用。对应的可以启用的功能为:

  1. 配置样例:

    bind :53 -no-rule-addr -no-speed-check -no-cache
  2. 参数介绍:

    参数 功能
    -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

注意:

  1. smartdns默认自动根据磁盘空间是否启用缓存。
  2. 缓存文件只有在进程正常退出的时候才会保存供下次使用。
  3. 缓存大小cache-size一般情况无需设置,smartdns会根据系统内存情况自动设置。

缓存预获取

Smartdns可以设置缓存预获取,避免缓存超时,配置预先获取后,smartdns将在域名超时前的5s内,重新进行域名查询。并对域名的热度进行排序。

prefetch-domain yes

注意:

  1. 此功能将会导致smartdns消耗更多的CPU。

过期缓存

过期缓存,也要乐观缓存,其功能指定是,当DNS域名的TTL到0时,其结果仍然存储在缓存中,等下次查询时,仍然将缓存的结果返回给客户端,避免客户端等待。乐观缓存的前提时,DNS的对应的IP地址不会频繁变化。

具体乐观缓存的原理可以参考(RFC 8767) (https://www.rfc-editor.org/rfc/rfc8767)

smartdns过期缓存处理流程

QQ截图20240406161550.png

通过上述序列图可以看到,当缓存过期时,smartdns仍然将过期的IP地址发给客户端,这样客户端就能很快的进行连接服务器,这种机制的前提是服务器IP地址没有变化。

现实中,大部分情况下,修改域名IP地址后,是不会立即生效到千家万户的,因为一般IP变化域名后,全球域名系统刷新完成最长可能要72小时。
即时出现过期缓存中的IP地址,故障失效,smartdns返回给客户端过期IP的TTL只有3s,那么3s后,客户端就会重新使用新的IP,表现在客户端程序中,可能就是要刷新页面重试一次。
并且,针对实现场景,smartdns可以设置预获取prefetch-domain yes来尽量避免此问题发生。

所以,主要场景下开启过期缓存是比较好的实践。

注意:prefetch-domain yes功能,在开启过期缓存功能的情况下,行为和未开启有差别,开启过期缓存的情况下,仅当域名要从缓存中过期时,才进行预读取,而不是TTL超时获取。 所以,开启了过期缓存的情况下,推荐开启域名预获取功能。

配置步骤

  1. 开启过期缓存

    serve-expired yes
  2. 配置过期缓存超时时间

    此时间表示过期缓存多长时间未访问,则从缓存中释放。

    serve-expired-ttl 259200
  3. 配置过期缓存响应TTL

    此时间表示当缓存中域名TTL超时时,返回给客户端的TTL时间,让客户端在下列TTL时间后再次查询。

    serve-expired-reply-ttl 3
  4. 过期缓存预获取时间

    此时间表示,过期缓存在多长时间未访问,主动进行预先获取,以避免IP无效;开启过期缓存后,prefetch的功能将和未开启不同。

    prefetch-domain yes
    serve-expired-prefetch-time 21600

关闭特定域名的缓存

  1. 某些情况下,可能需要关闭特定域名的缓存,比如DDNS。可以使用下面的配置关闭。

    domain-rules /example.com/ -no-cache

设置cache定时保存

  1. 为避免cache因为系统或进程复位丢失,可以设置smartdns周期保存cache文件。

    cache-checkpoint-time 86400

广告屏蔽

smartdns可以通过address选项来屏蔽广告。

注意:openwrt有luci的方式,请参考openwrt屏蔽域名配置方法。

基本配置方法

  1. 通过address /domain/#选项屏蔽广告,如。

    address /example.com/#

    address选项中:

    • /domain/为后缀匹配算法,范围包含其子域名。
    • 单独#表示同时屏蔽IPV4, IPV6,
    • 使用#6表示屏蔽IPV6
    • 使用#4表示屏蔽IPV4。
    • 使用-表示不屏蔽此域名。
  2. 如单独屏蔽IPV6

    address /example.com/#6
  3. 如果想不屏蔽某个子域名

    address /sub.example.com/-
  4. 前缀通配与主域名匹配

    // 通配
    *-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生效。

  1. 下载配置文件到/etc/smartdns目录

    wget https://anti-ad.net/anti-ad-for-smartdns.conf -O /etc/smartdns/anti-ad-smartdns.conf
  2. 修改/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地址。

配置步骤

  1. 使用dualstack-ip-selection配置启用双栈优选

    dualstack-ip-selection yes
  2. 如需要倾向使用IPV6,则可以使用dualstack-ip-selection-threshold进行阈值调整

    dualstack-ip-selection-threshold 10

    注意:

    1. 单位为ms,两个IP地址的速度阈值大于配置值时,才会进行优选。
  3. 允许纯IPV6地址。

    smartdns默认情况下总是会返回IPV4地址,原因是某些软件不具备IPV6的访问能力,但如果确实需要使用纯IPV6地址,可以设置允许smartdns仅优选IPV6。

    dualstack-ip-allow-force-AAAA yes

特殊应用

某些情况下,可能要临时关闭某些域名的双栈优选,可以通过如下两种方式:

  1. 对指定端口查询的域名关闭优选

    bind [::]:53 -no-dualstack-selection
  2. 对特定域名关闭优选

    domain-rules /example.com/ -dualstack-ip-selection no

禁用IPV6

目前IPV6已经进入千家万户,但有时需要禁用IPV6地址,smartdns支持如下方式禁用IPV6地址。

  1. 方法一:完全禁用IPV6

    force-AAAA-SOA yes
  2. 方法二:禁用特定域名的IPV6

    address /example.com/#6
  3. 方法三:如需禁用特定查询端口的IPV6查询(比如第二DNS),可以配置如下

    bind :53 -force-aaaa-soa 
  4. 例外配置:

    在开启禁用AAAA记录时,如果需要特定的例外域名,可以通过下面方式添加例外

    address /example.com/-
    address /example.com/-6

其他查询请求的禁用

  1. 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 解析

其他域名采用默认的模式解析,这种情况的分流配置如下:

配置步骤

  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
  2. 配置对应域名解析时使用的服务器组

    # 上游服务器规则,.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修改测速模式

  1. 全局测速模式配置

    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后用第三种。
  2. 单域名测速模式配置

    domain-rules /example.com/ -speed-check-mode ping,tcp:80,tcp:443
  3. 对应端口查询时关闭测速

    bind [::]:53 -no-speed-check
  4. 额外的

    如果分流的域名通过转发程序转发,则考虑关闭转发域名的测速功能,避免测速和出口不一致导致的体验反作用,关闭特定域名的测速方式如下:

    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都会将最佳结果保存到缓存中,所以不建议关闭缓存。

对指定域名设置返回模式

  1. 某些情况下,可能需要设置特定域名的响应模式,以提高上网体验,可以配置下面参数

    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

为方便管理,也可采用多配置文件的方式,如

  1. 主配置文件

    conf-file child.conf -group child
  2. 包含的配置文件

    # 设置规则组对应的客户端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访问的主机,进行分流。

  1. 主配置文件

    conf-file oversea.conf -group oversea
  2. 包含的配置文件

    # 设置规则组对应的客户端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地址。

基本配置方法

  1. 通过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地址,查询的时候,将会进行随机排序。
  2. 设置全局屏蔽IPV6

    address #6

    当不指定域名时,设置全局规则。

  3. 指定IPV6

    address /example.com/::1
  4. 前缀通配与主域名匹配

    // 通配
    *-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别名查询功能。

配置步骤

  1. 使用cname /a.com/b.com配置别名。

    cname /a.com/b.com

    上述例子,查询a.com时,将会使用b.com的查询结果。

域名集合的使用

为方便按集合配置域名,对于有/domain/的配置,可以指定域名集合,方便维护。具体方法为:

  1. 使用domain-set配置集合文件,如

    domain-set -name ad -file /etc/smartdns/ad-list.conf

    ad-list.conf的格式为一个域名一行,如

    ad.com
    site.com
  2. 在有/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进行透明转发,透明转发涉工具模式对比如下:

  1. 工具:iptable,nftable

    iptable:成熟的路由规则配置工具。
    nftable:更加强大的规则配置工具,正在成为主流。

ipset配置

  1. 基本配置

    通过如下参数可以配置指定域名的NFTSet规则

    # 全局配置ipset
    ipset ipsetname
    # 指定域名配置ipset
    ipset /domain/ipset
    # 指定IP类型配置ipset
    ipset /domain/[#4:ipsetv4,#6:ipsetv6]
    # 忽略ipset规则
    ipset /domain/-
  2. 超时

    SmartDNS设置IPSet,支持设置是否启用超时功能,这样可以避免NFTSet中过多IP地址,网关性能下降。启用方式为

    ipset-timeout yes
  3. 测速失败后,自动添加到IPSet

    SmartDNS可以将测速失败的IP地址,加入IPSet,再由相关IP规则转发

    ipset-no-speed ipsetname

nftset配置

  1. 基本配置

    通过如下参数可以配置指定域名的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:-
  2. 超时

    SmartDNS设置IPSet,支持设置是否启用超时功能,这样可以避免IPSet中过多IP地址,网关性能下降。启用方式为

    nftset-timeout yes
  3. 测速失败后,自动添加到IPSet

    SmartDNS可以将测速失败的IP地址,加入IPSet,再由相关IP规则转发

    nftset-no-speed ipsetname
  4. 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代理,注意区分。

配置步骤

  1. 使用proxy-server配置代理服务器

    proxy-server socks5://1.2.3.4 -name socks5
  2. 使用-proxy参数,配置server使用代理服务器:

    server 8.8.8.8 -proxy socks5

注意proxy-server的-name和server的-proxy须为同一个名称。

DNS64

DNS64用于支持纯IPV6网络访问IPV4网站,smartdns对此也提供了支持,可使用dns64参数配置DNS64服务器。

配置步骤

  1. 使用dns64 ip/mask配置DNS64前缀。

    dns64 64:ff9b::/96
  2. 在纯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地址集合,方便维护。具体方法为:

  1. 使用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
  2. 在有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地址,或网口

  1. 绑定特定的IP

    bind 192.168.1.1:53
  2. 绑定特定的网口

    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
文章目录