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服务器
具体设置参照下图