记录一下我在配置smartdns上遇到的坑

记录一下我在配置smartdns上遇到的坑

最后修改于 2021-2-10 ⋅ 共 1.2k 字 ⋅ 3分钟 / #Tutorial / #DNS, #路由器, #Dnsmasq, #梅林, #Linux

写在最前面:这个方案出于某些原因暂时弃用,虽然原有的会卡,但是smartdns更卡。此文仅作流程参考。

这次将路由器上的dns由dnsmasq替换为smartdns主要是为了使用 dot (dns over TLS),除此之外,smartdns还提供了多路查询dns的功能。本文主要记录了我在部署到梅林路由器上是遇到的坑。
开发者教程和文件链接:https://github.com/pymumu/smartdns

进入路由器的ssh环境 #

在路由器设置里打开ssh开关,或者和我一样从软件中心里安装shellinabox,使用网页端的ssh。进入shellinabox后输入路由器帐号和密码。

安装entware (opkg) #

  1. 系统管理 > 系统设置
    | Enable SSH | 是 |
    | Enable JFFS custom scripts and configs | 是 |
  2. 在ssh环境中:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#创建目录 与文件
cd /jffs
mkdir /jffs/opt
ln -nsf /jffs/opt /tmp/opt


#编辑启动脚本
vi /jffs/scripts/post-mount
	#!/bin/sh
	ln -nsf /jffs/opt /tmp/opt
chmod a+rx /jffs/scripts/post-mount


#下载安装脚本 并运行安装
wget http://qnapware.zyxmon.org/binaries-armv7/installer/entware_install_arm.sh
 sh ./entware_install_arm.sh

#好了现在就可以用 命令安装了
opkg update
opkg install xxxx

不同于官方在Tool中提供的方法,以上脚本将entware安装在本体的jffs里,不需要额外的u盘挂载。

安装smartdns #

作者教程 & 软件包下载
按照路由器架构 (armv7) 和安装环境 (entware/optware) 选择安装包,我用的是smartdns.xxx.arm-optware-all.ipk

1
2
3
cd /tmp
wget https://github.com/pymumu/smartdns/releases/download/Release33/smartdns.1.2020.09.08-2235.arm-optware-all.ipk
opkg install /tmp/smartdns.XXX.ipk

安装过程中,我遇到了路由器证书服务openssl协议太旧的问题,opkg在安装的过程中会根据依赖下载其他软件包,由于服务端协议版本比较高,所以最后我还是手动一个一个下载安装依赖。

配置smartdns #

默认情况下,smartdns工作在模式1,即通过iptables将53端口发向原有dnsmasq的请求转发到535端口。工作模式可以通过修改/opt/etc/smartdns/smartdns-opt.confSMARTDNS_WORKMODE参数来调整。

安装完成后nano /opt/etc/smartdns/smartdns.conf,修改以下内容:

修改为原有说明
conf-file smartdns-list.conf-上游dns的地址
bind :535bind [::]:53原作者的启动脚本有问题,需要这里手动修改
bind-tcp :535-同上
cache-size 40960cache-size 4096如果jffs空间不够的话可改小
cache-file /tmp/smartdns.cache-暂存文件应放在ram里
serve-expired yes-防止上游dns卡顿
prefetch-domain yes-自动刷新过期dns
force-AAAA-SOA yes-有影响,所以先关闭ipv6解析
rr-ttl-min 60-从上游dns返回的ttl至少为60s
log-level warnlog-level info这个可以试完了以后改

/opt/etc/smartdns/smartdns-list.conf添加:

1
2
3
4
5
6
7
# server 127.0.0.1 -group lan -exclude-default-group
server 211.140.13.188 
server-tcp 211.140.13.188
server-tls doh.pub                                                                                                                          
# 以下行添加你需要使用原有dnsmasq解析的内网dhcp信息,替换lanX
domain-rules /lanX/ -speed-check-mode none -nameserver lan
# address /lanX/192.168.XX.XX

去除原启动脚本中会错误修改端口的bug,修改/opt/etc/init.d/S50smartdns

1
2
3
4
5
# 将 set_smartdns_port() 的 elif [ "$SMARTDNS_WORKMODE" = "1" ]; then 后注释掉
# sed -i "s/^\\(bind .*\\):53 *\\(.*\\)\$/\\1:$SMARTDNS_PORT \\2/g" $SMARTDNS_CONF                                                                           
# sed -i "s/^\\(bind-tcp .*\\):53 *\\(.*\\)\$/\\1:$SMARTDNS_PORT \\2/g" $SMARTDNS_CONF
# 这两行,并添加一行
echo fix bugs

在开机启动脚本/jffs/post-mount添加:

1
/opt/etc/init.d/rc.unslung start

重启路由器

测试 #

nslookup -querytype=ptr smartdns或者通过nslookup查询任意一个域名,如果返回ip只有一个,说明部署成功。

#