文章内容已过时不再适用,请勿使用!如果是passwall搭配smartdns请看passwall自带的教程

SmartDNS 在本地网络环境不好的情况下,可以一定程度上改善网页的加载速度.
但如果你处在较为发达的地区,即使配置完 SmartDNS,带来的提升也是微乎其微.
具体请看文章末尾的一些疑惑.

注意事项

请先检查以下注意事项后再进行安装和配置 SmartDNS

  • 配置 SmartDNS 前,请先确认 5334 和 5335 端口是否被占用,如果端口被占用则 smartdns 无法正常启动(在使用博主的 smartdns 配置文件的情况下). 补充:SSRP和HelloWorld是会使用5335端口的,请先关闭。
  • 关掉其他 DNS 解析程序,确保本地只有一个程序接管 DNS 解析,没有 ADGuardHome 等 DNS 解析程序.
  • 请先清空本地 DNS 缓存,重启 openwrt 后再进行配置.
  • PC 端只需要清理 DNS 缓存不需要重启,同样的别忘了清理浏览器的缓存.
  • WAN/LAN 的自定义 DNS 留空.

  • OpenWrt
  • Windows 10

登录 TTYD 终端或使用 SSH 登录后,输入下方命令重启 dnsmasq 服务
service dnsmasq restart
当然你也可以直接重启路由器

win + r 打开运行,输入 cmd
输入 ipconfig/flushdns
回车

安装

如果在使用固件自带的 smartdns 出现一些奇奇怪怪的问题,可以尝试卸载固件中自带的 smartdns,重新安装静态编译的版本.
Github release 的 smartdns 是静态编译,出现问题的情况相对较少.

首先下载安装最新版本的 smartdns, 需要以下两个文件:
luci-app-smartdns.1.2020.09.08-2235.all-luci-compat-all.ipk
smartdns.1.2020.09.08-2235.xxxxxx-openwrt-all.ipk
其中 luci 开头的文件是 smartdns 在 openwrt 中的操作界面,smartdns 开头的文件是软件本体.

软件本体请选择对应 CPU 架构和系统环境的版本,不然会出现smartdns无法启动,或者启动后无法解析的问题.
比如你使用的是 armv8 架构的 cpu, 操作系统是 openwrt, 那么你就得选择名字中包含 aarch64 和 openwrt 的版本.

系统菜单栏中选择文件传输 , 将 smartdns 的软件本体和 luci 界面上传后,安装即可.
文件传输.png

文件传输.png

配置

  • 配置更新,部分机场梯子对 DOH 查询不友好,国外 DNS 组改为 TCP 查询.
  • 配置再更新,把国内外两组 DNS 都排除默认,之后手动指定 dnsmasq 上游为国内 DNS 分组.(之前没有把国内 DNS 排除默认组,有时候解析国外域名会走国内…就很奇怪)
  • 配置再再更新, 还是觉得有必要加上运营商的 DNS, 因为大多数情况运营商 DNS 相比公共 DNS 的响应速度要快, 且大部分地区的主流运营商返回的IP速度不会很烂, 甚至有时候返回的IP就是连接速度最快的,但是依旧需要公共 DOH 来防止污染 (现在大部分地区的主流运营商都很少搞这些花里胡哨的,当然如果国外网站不算的话)
  • 假设运营商的 DNS 为 2.2.2.2, 那么把下面这行添加进自定义设置,然后别忘了把运营商的 DNS 加入直连列表或者不走代理 IP.
    server 2.2.2.2:53 -group cn -exclude-default-group
  • 如果你不知道自己运营商的 DNS, 可以前往 https://dnsdaquan.com/ 查询.
  • 这下应该真是完全体了.

配置步骤大致分为四步:- 复制下面的配置到 smartdns 的自定义设置.

  • 勾选启用, smartdns 重定向选择作为 dnsmasq 的上游服务器 重定向选择.
    • 网络 —> DHCP/DNS —> 常规设置 —>DNS 转发填写 127.0.0.1#5334

      - `网络` —> `DHCP/DNS` —> `HOSTS和解析文件` —> 勾选`忽略解析文件`
      - `网络` —> `DHCP/DNS` —> `高级设置` —>`DNS 查询缓存的大小`填写 `0`(使用 SmartDNS 的缓存,搭配过期域名缓存功能)
      
  • 最后保存并应用,建议应用后再检查一遍是否有遗漏

    bind :5334 -group cn no-dualstack-selection
    bind :5335 -group gfw no-dualstack-selection -no-speed-check

    #缓存网站个数,可以适当增加
    cache-size 512

    #缓存ttl值
    rr-ttl 1800

    #测速模式, 绝大多数网站还是会响应PING的, 所以还是PING测速优先
    speed-check-mode ping,tcp:80

    #停用IPv6
    force-AAAA-SOA yes

    #过期域名缓存
    serve-expired yes

    #缓存持久化
    cache-persist no

    #怕有人不看前面的写的,直接复制配置,在此再做提醒!
    #如果不知道自己运营商DNS的,可以去 https://dnsdaquan.com/ 查找.
    #假设运营商DNS是2.2.2.2和3.3.3.3
    #只需要把下面两行中的2.2.2.2和3.3.3.3修改为运营商的DNS后, 删除前面的 #
    #server 2.2.2.2:53 -group cn -exclude-default-group
    #server 3.3.3.3:53 -group cn -exclude-default-group

    #国内DNS
    server 223.5.5.5:53 -group cn -exclude-default-group
    server 119.29.29.29:53 -group cn -exclude-default-group

    #国外DNS
    server-tcp 8.8.4.4:53 -group gfw -exclude-default-group
    server-tcp 1.1.1.1:53 -group gfw -exclude-default-group

    # 如果部分地区存在TCP阻断53端口的情况,可以尝试把国外DNS换成DOT/DOH,如下
    #server-https https://1.1.1.1/dns-query -group gfw -exclude-default-group
    #server-tls 8.8.4.4:853 -group gfw -exclude-default-group

smartdns配置设置.png

smartdns配置设置.png

搭配SSRP

SSRP 会默认占用 5335 端口用作国外 DNS 解析,需要先关闭 SSRP, 在 SmartDNS 和 SSRP 设置完成后再开启 SSRP.

SmartDNS 和 SSRP 的搭配只需要三步:

  • 前往访问控制中,将下方 IP 和域名分别加入直连和代理列表
  • DNS 解析方式选择使用本机端口为5335的DNS服务
  • 最后保存 & 应用即可

    • 不走代理的 WAN IP
    • 强制走代理的 WAN IP
    • 不走代理的域名
    • 强制走代理的域名

    223.6.6.6
    162.14.21.178
    118.126.68.223
    之前改完配置,这里忘了修改,但好像不加上也影响不大,不过以防万一还是推荐加上.
    223.5.5.5
    119.29.29.29
    运营商 DNS

    8.8.4.4
    1.1.1.1

    修改了一下配置, 不使用DOH, SmartDNS对加密DNS的支持存在一些问题, 容易导致崩溃
    doh.pub
    dns.alidns.com
    rubyfish.cn

    配置修改,国外 DNS 组使用 TCP 查询,不再需要添加以下域名.
    dns.google
    cloudflare-dns.com

[smartdns搭配ssrp.png

smartdns搭配ssrp.png

搭配Passwall

目前 passwall 与第三方 DNS 解析程序的搭配存在一些问题.
在使用第三方 DNS 搭配 passwall, 代理模式选择中国列表以外时,google 系网站都无法打开…
推荐使用 passwall 内置的 DNS 解析方案,搭配 smartdns 只能选择防火墙表代理模式.
国外 DNS 使用 TCP(这里是指SmartDNS里的国外DNS组), 就能够正常使用中国列表以外模式, passwall里用请使用自定义DNS(UDP)

需要 五四 三步:

  • 复制下方配置到 smartdns 的自定义设置 (因为国外 DNS 使用 TCP 查询,因此需要使用与上面不同的配置)
  • 把对应域名和 IP 加入 passwall 的直连/代理名单管理 (passwall 自带的列表已经包含很多 IP 和域名,只需要添加一部分尚未添加的即可)
  • DNS过滤模式选择自定义DNS(UDP), 填写 127.0.0.1#7913自定义DNS 填写 127.0.0.1#5335(注意端口号是 5335, 默认是 5353 别看错了)
  • 模式全部选择为防火墙表 防火墙表和中国列表以外都可以选
  • 最后还是那一步 保存 & 应用

      bind :5334    -group cn    no-dualstack-selection
      bind :7913    -group gfw   no-dualstack-selection    -no-speed-check
    
      #缓存网站个数,可以适当增加
      cache-size 512
        
      #缓存ttl值
      rr-ttl 1800
        
      #测速模式, 绝大多数网站还是会响应PING的, 所以还是PING测速优先
      speed-check-mode ping,tcp:443
        
      #停用IPv6
      force-AAAA-SOA yes
        
      #过期域名缓存
      serve-expired yes
        
      #缓存持久化
      cache-persist no
        
      #怕有人不看前面的写的,直接复制配置,在此再做提醒!
      #如果不知道自己运营商DNS的,可以去 https://dnsdaquan.com/ 查找.
      #假设运营商DNS是2.2.2.2和3.3.3.3
      #只需要把下面两行中的2.2.2.2和3.3.3.3修改为运营商的DNS后, 删除前面的 # 
      #server 2.2.2.2:53    -group cn    -exclude-default-group
      #server 3.3.3.3:53    -group cn    -exclude-default-group
        
      #国内DNS
      server 223.5.5.5:53       -group cn    -exclude-default-group
      server 119.29.29.29:53    -group cn    -exclude-default-group
        
      #国外DNS
      server-tcp 8.8.4.4:53    -group gfw    -exclude-default-group
      server-tcp 1.1.1.1:53    -group gfw    -exclude-default-group
    

    # 如果部分地区存在TCP阻断53端口的情况,可以尝试把国外DNS换成DOT/DOH,如下
    #server-https https://1.1.1.1/dns-query -group gfw -exclude-default-group

      bind :5334    -group cn    no-dualstack-selection
      bind :7913    -group gfw   no-dualstack-selection    -no-speed-check
    

    #缓存网站个数,可以适当增加
    cache-size 512

    #缓存ttl值
    rr-ttl 1800

    #测速模式, 绝大多数网站还是会响应PING的, 所以还是PING测速优先
    speed-check-mode ping,tcp:443

    #停用IPv6
    force-AAAA-SOA yes

    #过期域名缓存
    serve-expired yes

    #缓存持久化
    cache-persist no

    #怕有人不看前面的写的,直接复制配置,在此再做提醒!
    #如果不知道自己运营商DNS的,可以去 https://dnsdaquan.com/ 查找.
    #假设运营商DNS是2.2.2.2和3.3.3.3
    #只需要把下面两行中的2.2.2.2和3.3.3.3修改为运营商的DNS后, 删除前面的 #
    #server 2.2.2.2:53 -group cn -exclude-default-group
    #server 3.3.3.3:53 -group cn -exclude-default-group

    #国内DNS
    server 223.5.5.5:53 -group cn -exclude-default-group
    server 119.29.29.29:53 -group cn -exclude-default-group

    #国外DNS
    server-tcp 8.8.4.4:53 -group gfw -exclude-default-group
    server-tcp 1.1.1.1:53 -group gfw -exclude-default-group

    # 如果部分地区存在TCP阻断53端口的情况,可以尝试把国外DNS换成DOT/DOH,如下
    #server-https https://1.1.1.1/dns-query -group gfw -exclude-default-group
    #server-tls 8.8.4.4:853 -group gfw -exclude-default-group #server-tls 8.8.4.4:853 -group gfw -exclude-default-group

    • 直连域名
    • 直连IP
    • 代理域名
    • 代理IP

    修改了一下配置, 不使用DOH, SmartDNS对加密DNS的支持存在一些问题, 容易导致崩溃
    dns.alidns.com
    doh.pub
    rubyfish.cn

    162.14.21.178
    118.126.68.223
    223.5.5.5
    119.29.29.29
    运营商 DNS

    使用 TCP 查询,不需要额外添加代理域名

    passwall 自带列表中已经包含 8.8.4.41.1.1.1
    因此不需要额外添加代理 IP

一些疑惑

为什么国外DNS组不开启测速

国外域名走隧道代理去查询,原本的查询速度就不快,再开启测速,smartdns 需要等拿到所有的返回 IP 之后进行测速,再选出连接最快的 IP 再返回给客户端.

这样即使它返回的是连接速度快的 IP 地址,最后返回给客户端的等待时间也太长,得不偿失.

国外也起不到 DNS 加速解析的作用,这也是为什么经常有人说 smartdns 比较鸡肋的原因之一.

既然不能起到加速国外 DNS 的效果,为什么使用国外组搭配 SSRP/Passwall

既然国外 DNS 解析加不了速,为什么不用代理插件自带 DNS 解析方案的.

最开始的想法是 Smartdns 国外组使用 DOT/DOH 进行国外的域名查询, 因为 SSRP 暂时还不支持使用 DOH/DOT 进行查询.
(passwall 后来的更新已经支持 DOH 查询.)

不过最后放弃了,因为部分机场用不了 DOH/DOT 查询,所以上面的配置是修改后的,国外组使用 TCP.

如果机场支持或者自建梯子支持,可以自行更改国外 DNS 组使用 DOT/DOH.

为什么网易 DNS 检查不正常

https://nstool.netease.com/
网易的这个网址是国内网址,国内 DNS 组是开启了测速的,smartdns 会对国内 DNS 组发起查询,并且将返回的 IP 进行测速,将其中最快的 IP 返回.

当 SmartDNS 测速发现连接某个省外IP的延迟是所有返回IP中最低的, 所以把这个IP返回给客户端, 而网易这个DNS检查如果是省外的那么就会判断为配置错误.
但是这并不影响日常使用,因为 smartdns 已经对返回 IP 测速,并给了你本地连接最快的 IP.

这个地方很多人有误解,本省的 DNS, 你连接到它,它返回 IP 的速度很快,但是返回的 IP, 你去连接不一定快.
但是在较为发达的城市,电信和联通的 DNS 已经优化好了,返回的 IP 已经算是最优解,那么再开 smartdns 测速就显得毫无意义,反而会增加延迟.
当然这也是为什么经常有人说 smartdns 比较鸡肋的原因.(梅花三弄)

如果你有强迫症想让网易这里显示正确的话,国内 DNS 组只使用运营商或阿里的 DNS, 将腾讯的 DNS 注释或删除即可.
但是部分地区运营商可能存在的 DNS 污染或劫持现象,所以请自行斟酌.

为什么在 IP.CN 查询本地 IP, 显示国外代理的 IP

https://ip.cn/
你可以去 ip138 查询 ip.cn 域名,你就知道了…
虽然它叫 ip.cn, 尾缀是 cn, 但是它解析出来的IP是 cloudflare 的IP,而cloudflare基本都是国外IP,所以这个域名会走代理.(如果使用大陆白名单模式的话)

为什么测速模式是 ping 优先

这个问题请看 smartdns 的 issues.
https://github.com/pymumu/smartdns/issues/470#issuecomment-616175685

为什么不使用域名预加载,而使用过期域名缓存

这个问题同上.
https://github.com/pymumu/smartdns/issues/470#issuecomment-616175685

参考

Smartdns Github仓库