Openwrt软路由常用的dns分流有smartdns和mosdns,长期使用下来个人感觉 Mosdns 的 DNS 查询转发速度相对更快,且查询条件通过自定义规则能做到更加精细地控制,在具体设置上smartdns相对有点小小复杂, 而mosdns比较简单和上手容易。
下载和安装
IPK核心包的安装颇为复杂,大概率安装不成功,最好选择博主直接编译好的Openwrt固件
下载资源文件
wget https://glare.xukecheng.tech/Loyalsoldier/geoip/cn.dat -O /etc/mosdns/cn.dat && \ wget https://glare.xukecheng.tech/Loyalsoldier/v2ray-rules-dat/geosite.dat -O /etc/mosdns/geosite.dat && \ wget https://glare.xukecheng.tech/Loyalsoldier/v2ray-rules-dat/geoip.dat -O /etc/mosdns/geoip.dat && \ touch /etc/mosdns/ecs_cn_domain.txt && \ touch /etc/mosdns/ecs_tw_domain.txt # ecs_cn_domain 是强制本地解析域名,ecs_tw_domain 是强制非本地解析域名;格式可以参考 https://github.com/pmkol/easymosdns/blob/main/ecs_tw_domain.txt
V4版本配置(本站下载固件中的mosdns为V4版本)
log:
level: info
file: "/tmp/mosdns.log"
data_providers:
- tag: geosite
file: /etc/mosdns/geosite.dat
auto_reload: true
- tag: cn
file: /etc/mosdns/cn.dat
auto_reload: true
plugins:
# 缓存
- tag: mem_cache
type: cache
args:
size: 1024
lazy_cache_ttl: 17200
# redis
# redis: "redis://localhost:6379/0"
# redis_timeout: 1000
# 修改应答 ttl
- tag: "modify_ttl"
type: "ttl"
args:
minimal_ttl: 300
maximum_ttl: 3600
# 阿里 dns
- tag: ali
type: fast_forward
args:
upstream:
- addr: "223.5.5.5"
- addr: "https://dns.alidns.com/dns-query"
dial_addr: "223.5.5.5"
trusted: true
- addr: "tls://dns.alidns.com"
dial_addr: "223.5.5.5"
trusted: true
# dnspod
- tag: dnspod
type: fast_forward
args:
upstream:
- addr: "119.29.29.29"
- addr: "https://doh.pub/dns-query"
dial_addr: "1.12.12.12"
trusted: true
- addr: "tls://dot.pub"
dial_addr: "1.12.12.12"
trusted: true
# 本地 dns 备用
- tag: localdns
type: fast_forward
args:
upstream:
- addr: "udp://114.114.114.114"
# google dns
- tag: google
type: fast_forward
args:
upstream:
- addr: "https://dns.google/dns-query"
dial_addr: "8.8.4.4"
trusted: true
- addr: "tls://dns.google"
dial_addr: "8.8.4.4"
trusted: true
# cloudflare
- tag: cloudflare
type: fast_forward
args:
upstream:
- addr: "https://cloudflare-dns.com/dns-query"
dial_addr: "1.0.0.1"
trusted: true
- addr: "tls://cloudflare-dns.com"
dial_addr: "1.0.0.1"
trusted: true
# doq 备用
- tag: adguard
type: forward
args:
upstream:
- addr: "quic://dns-unfiltered.adguard"
ip_addr:
- "94.140.14.140"
- "94.140.14.141"
trusted: true
# local 序列
- tag: forward_local
type: sequence
args:
exec:
- primary:
- parallel: # 并行
- - "ali" # 执行序列 #1。
- - "dnspod" # 执行序列 #2。
secondary:
- localdns # 备用本地
fast_fallback: 400 # 这里建议设置成 primary 服务器正常延时的 2~5 倍 单位: 毫秒。
always_standby: true
# remote 序列
- tag: forward_remote
type: sequence
args:
exec:
- primary:
- parallel: # 并行
- - "google" # 执行序列 #1。
- - "cloudflare" # 执行序列 #2。
secondary:
- adguard # 备用 adguard
fast_fallback: 600 # 这里建议设置成 primary 服务器正常延时的 2~5 倍 单位: 毫秒。
always_standby: true
################ 匹配器插件 #################
# 匹配本地域名的插件
- tag: query_is_local_domain
type: query_matcher
args:
domain:
- "provider:geosite:cn,apple-cn,steam@cn"
# 匹配非本地域名的插件
- tag: query_is_non_local_domain
type: query_matcher
args:
domain:
- "provider:geosite:geolocation-!cn"
# 匹配广告域名的插件
- tag: query_is_ad_domain
type: query_matcher
args:
domain:
- "provider:geosite:category-ads-all"
# 匹配本地 IP 的插件
- tag: response_has_local_ip
type: response_matcher
args:
ip:
- "provider:cn:cn"
- tag: main_sequence
type: sequence
args:
exec:
# - hosts
- mem_cache
- _no_ecs
- if: query_is_ad_domain
exec:
- _new_nxdomain_response
- _return
- if: query_is_local_domain
exec:
- forward_local
- if: response_has_local_ip
exec:
- _return
- if: query_is_non_local_domain
exec:
- _prefer_ipv4 # 优先 IPv4
- forward_remote # 用远程服务器获取应答
- if: "! response_has_local_ip"
exec:
- _return
- primary:
- forward_local # 本地服务器获取应答。
- if: "(! response_has_local_ip) && [_response_valid_answer]"
exec:
- _drop_response # 丢掉。
secondary:
- _prefer_ipv4
- forward_remote
fast_fallback: 300
always_standby: true
- modify_ttl
servers:
- exec: main_sequence
listeners:
# - protocol: udp
# addr: "[::1]:5335"
# - protocol: tcp
# addr: "[::1]:5335"
- protocol: udp
addr: "0.0.0.0:5335"
- protocol: tcp
addr: "0.0.0.0:5335"
按照如下步骤,将以上配置文件复制粘贴后,点保存并应用。
mosdns会reload并重启, 如果提示正在运行, 表明运行成功, 你也可以使用命令进行手动操作
$ /etc/init.d/mosdns enable $ /etc/init.d/mosdns reload $ /etc/init.d/mosdns restart
检查是否启动成功, 如果有端口监听说明mosdns已经在正常工作了
$ netstat -a | grep 5335
tcp 0 0 localhost:5335 0.0.0.0:* LISTEN tcp 0 0 localhost:5335 :::* LISTEN udp 0 0 localhost:5335 0.0.0.0:* udp 0 0 localhost:5335 :::*
配合openclash
在openclash的全局设置页面, 找到DNS设置选项, 增加两个DNS服务器(只保留这两个,其余全部去掉✅), 分别是NameServer和FallBack, 都得填mosdns的地址, 既本地地址127.0.0.1和对应监听的端口5335, 协议是UDP并✅上这两个DNS服务器
具体设置参照下图



