一、什么是SmartDNS ,有什么用?

  • 比较官方的说法是:

    SmartDNS 是一个运行在路由器上的 DNS 服务器,然后从多个上游 DNS 服务器获取 DNS 查询结果,并将访问速度最快的结果返回给客户端,以此提高网络访问速度。
  • 比较小白的说法是

    SmartDNS就是预先配置多个DNS服务器供其选择,自动完成DNS解析(缓存)。正确设置就能加快本地的网页打开速度,以及防止DNS被污染(就是更清爽,解决DNS被运营商劫持的问题)。
关于DNS被运营商劫持,推荐以下扩展阅读:

网上对SmartDns的作用评论那是褒贬不一,有说傻白甜+秀智商的。当然也有说SmartDns就是神作,非常好用的。

SmartDns无用论就不在本文讨论范围,本文针对的是还没折腾够的朋友。

经众多测试过的玩家总结,SmartDNS 最大作用其实是替换了 dnsmasq+pdsnd,实现对流量的精准分流。请务必清楚“精准分流”才是SmartDns的精髓所在

而“返回最快的结果”反而是附带的甜点。

SmartDNS的应用场景:支持树莓派、OpenWrt、华硕路由器原生固件和 Windows 系统等。

二、安装完成后,SmartDNS 在路由器中出现的位置

不管是安装还是更新,本文皆以OpenWrt操作系统为例

正确安装的 SmartDNS 位于 OpenWrt 的 “服务”菜单下即可找到:

Openwrt下SmartDNS插件的安装、更新教程

三:OpenWrt 下,如何安装SmartDNS 插件?

假设你的 openwrt固件默认并没有安装 smartdns插件,在服务菜单下没找到相应连接,那么你也许要对smartdns进行全新安装

Smartdns全新安装步骤可分为二种

1.在线安装服务

OpenWrt固件集成有软件包在线安装服务,在OPKG配置执行安装即可。

A.检查配置信息

先检查配置,有helloword,passwall的软件源要先删除掉,不然刷新列表会报错

软件源地址

src/gz openwrt_core https://mirrors.cloud.tencent.com/lede/snapshots/targets/x86/64/packages
src/gz openwrt_base https://mirrors.cloud.tencent.com/lede/snapshots/packages/x86_64/base
src/gz openwrt_luci https://mirrors.cloud.tencent.com/lede/releases/18.06.8/packages/x86_64/luci
src/gz openwrt_packages https://mirrors.cloud.tencent.com/lede/snapshots/packages/x86_64/packages
src/gz openwrt_routing https://mirrors.cloud.tencent.com/lede/snapshots/packages/x86_64/routing
src/gz openwrt_telephony https://mirrors.cloud.tencent.com/lede/snapshots/packages/x86_64/telephony

更改完提交一下。

Openwrt下SmartDNS插件的安装、更新教程

安装前先卸载原有固件,旧版本的Smartdns(可以跳过此步直接安装,有新版本的话,会自动更新)。

Ps: 这里随便点击其中一个卸载Smartdns,刷新后你会发现两个已经安装的都找不到了。

Openwrt下SmartDNS插件的安装、更新教程

B.在线安装

先刷新列表,等代完成后,过滤器里填入smartdns,在线安装即可。

Openwrt下SmartDNS插件的安装、更新教程

如下图,很清晰。有软件包名称,smartdns的版本,及ipk的大小等等。

情况不同,你那是也许不是这个版本,直接安装smartdns就行

过滤器中输入相关关键词,如:“smartdns”,会列出所有可用的软件包,这里是“luci-app-smartdns”和“smartdns”,luci-app-smartdns的文件大小为0K,smartdns的文件大小为105658k。

至于“下载并安装软件包”选项:如果你有想要下载的相关服务软件包详细下载地址,可以直接输入并下载。

Openwrt下SmartDNS插件的安装、更新教程

这里不知道是显示文件大小有问题还是什么原因,luci-app-smartdns是SmartDns的操作界面(就是上面说过的显示在服务菜单位置的UI),原则上是不可能为0K的。不过不必深究,这不影响后面的操作。

2.putty连接openwrt,使用命令行进行安装

A.手动下载合适的 SmartDns版本:

SmartDns安装包的开源仓库下载地址为:https://github.com/pymumu/smartdns/releases

选择版本提示

  • Openwrt 18.XX及之前的版本,安装luci-app-smartdns.1.yyyy.MM.dd-REL.all-luci-compat-all.ipk界面。
  • 反之Openwrt 19.07后的版本,安装 luci-app-smartdns.1.yyyy.MM.dd-REL.all.ipk界面。

    Openwrt下SmartDNS插件的安装、更新教程

B.安装SmartDns用到的主要命令有:

#SmartDns 卸载命令
opkg remove luci-app-smartdns
opkg remove smartdns

#SmartDns 安装命令
opkg update
opkg install smartdns.1.xxx.ipk
opkg install luci-app-smartdns.1.xxxL.all.ipk

#如果不知道什么版本,直接选all版本
#opkg install luci-app-smartdns.1.xxx.all-luci-compat-all.ipk

C.Putty连接路由,命令行操作:

wget 命令下载SmartDns最新版(这里以2023年2月4日,最新版本为Release40版本为例):

wget https://github.com/pymumu/smartdns/releases/download/Release40/luci-app-smartdns.1.2023.01.02-1537.all-luci-all.ipk
wget https://github.com/pymumu/smartdns/releases/download/Release40/smartdns.1.2023.01.02-1537.aarch64-openwrt-all.ipk
SmartDns这版本的更新如下:
  1. 优化luci界面,支持域名分流配置和定时更新规则。使用 参考这里
  2. 支持上游服务器配置socket mark(-set-mark)。
  3. 支持设置日志文件的默认权限。
  4. 支持禁用特定域名的过期缓存。
  5. 支持日志个数为0时,禁用日志。
  6. 优化一些log打印。
  7. 解决一些BUG。

使用命令安装

#一定要更新,不然会存在报错的可能
opkg update 

#安装SmartDns,注意修改刚下载的文件名
opkg install smartdns.1.2023.01.02-1537.aarch64-openwrt-all.ipk
opkg install luci-app-smartdns.1.2023.01.02-1537.all-luci-all.ipk

Openwrt下SmartDNS插件的安装、更新教程

安装完成后,即可在 服务菜单 下找到 SmartDNS的选项。

四、关于更新SmartDns的版本(版本升级)

SmartDns老旧版本的更新升级方法,其实和安装方法一模一样,只时跳过卸载原来SmartDns这一步,新的安装包,安装完成后会自动更新SmartDns的版本。

但要注意新的配置文件所在位置与原配置文件有所区别,弄错会出现很多莫名其妙的bug。
而SmartDns配置文件位置,一般在安装的时候有提示的,通常以smartdns_opkg为文件名,安装过程中要多留意。

五、安装SmartDNS插件过程中可能出现的问题

1.SmartDNS 安装/升级中出现'Package mismatch' 错误

1.1 问题描述

不论是在线安装,或者是用命令安装,原理都一样

如果在安装过程中出现:smartdns opkg_install_pkg: Package size mismatch: smartdns is xxx bytes, expecting xxx bytes的错误提示。

而你又选择了正确的安装包,也能安装,但就是报错。即便你多次重复卸载,但还是会在安装luci界面安装失败。

1.2 错误出现原因

那么这里要先考虑是不是自带命令 opkg的问题。

站长就遇到了这样的问题,经过一翻搜索,找到了造成Package mismatch错误的原因,就是没更新opkg命令。
具体讨论可以在 gitub仓库中的 issues 10847中找到答案,以下是简单截取。

To be more clear:

  • in this issue, an old package index is used to check the size/checksum of newer packages. Failure is expected.
  • in the imagebuilder, a new package index is used to check the size/checksum of old packages that had been downloaded before. This is a bug, opkg should delete the old packages in this case (see ticket).

就是死循环的用两不同的"package index"。

1.3 'Package mismatch' 错误解决办法

解决办法就是在安装前,必须用 'opkg update' 命令,更新一下,这很重要,会为你省去很多不必要的麻烦。

Openwrt下SmartDNS插件的安装、更新教程

2.解决openwrt下安装smartdns不显示问题

2.1 问题描述

倘若,上面所有smartdns安装/更新过程,都能正常进行,但OpwnWrt 的服务菜单下就是死活不显示 “SmartDns”的选项怎么办

如果一切安装过程都是正确的,但菜单下就是无法显示SmartDns的菜单条,没有常规设置,也没有设置上游服务器查询的选项,如下图所示:

Openwrt下SmartDNS插件的安装、更新教程

2.2 不显示错误出现的原因

出现不显示的问题,这就是Openwrt 安装服务时,典型的Luci 不显示的错误

这是在Openwrt下,用命令安装服务会经常会出现的错误之一,大体原因是不兼容,或者漏装了某个依赖

而众多原因中,最可能诱发Openwrt下没有SmartDns服务菜单的原因,大概率就是你以前旧版本的SmartDns配置文件没删除,而新版本的又生成为其他文件名,如smartdns_opkg

这造成SmartDns读不到配置文件造成在采单栏无法显示的错误。

Openwrt下SmartDNS插件的安装、更新教程

2.3 SmartDns 不显示的解决办法

知道原因,解决成功安装SmartDns后仍然不显示的问题就非常简单了。

删除旧文件,把新生成的smartdns_opkg.config文件改成smartdns。如果没有,随便复制一个文件,改名文件名为smartdns,确保里面的内容如下:

config smartdns
    option enabled '0'
    option old_port '53'
    option old_enabled '0'
    option old_auto_set_dnsmasq '1'

本文固件提示的配置文件位置

/etc/config/smartdns

总结:

SmartDns的安装分手动下载和自动下载2种方式,安装的关键是安装前要确保“opkg update”先行。

然后就确保旧版的SmartDns 配置不会影响到新的SmartDns安装,不然容易出现“openwrt下安装smartdns不显示问题”的错误。

本文主要解决smartdns插件在路由器下的安装与更新问题,更详细的设置,可参考以下文章:

扩展阅读: