一、前言
mosdns 是一个插件化的DNS 转发器,用户可以按需拼接插件,定制自己的DNS 处理逻辑。插件及其参数 - mosdns-wiki-zh (gitbook.io)
如果不想使用mosdns,详见passwall+Adguard+(smartdns)实现DNS分流&去广告
在Openwrt上安装及预编译mosdns,建议采用这个版本sbwml/luci-app-mosdns: 一个 DNS 转发器
mosdns会使用geoip和geosite,建议采用路由规则文件加强版
检测DNS泄露DNS Leak Test - BrowserLeaks
目标
- 无污染 DNS
- 全程加密 DOT/DOH/DOQ
- 按照域名 / ip实现国内外分流
- 去广告
- 返回较优的IP
二、配置adguardhome
本地的ADG运行在5353端口,将会作为mosdns的国内上游服务器,因此无需重定向
如果需要使用smartdns则无需勾选最快的IP地址,否则可以尝试开启最快的IP地址
三、配置MOSDNS
最新的V5版本配置详见mosdns自定义配置V5版本【附smartdns与passwall更新】
MOSDNS查询流程
- 缓存,缓存未命中则进入下一步.
- cn 域名? -> 国内上游
- 返回是国内 ip ? -> 返回结果,结束.
- 不是国内 ip -> 无污染上游-> 返回结果,结束.
- 非 cn 域名? -> 无污染上游
- 返回非国内 ip ? -> 返回结果,结束.
- 返回国内 ip -> 国内上游-> 返回结果,结束.
- 其他所有情况?
- 优先国内上游结果.
- 否则无污染上游结果.
以下配置文件中,有四处需要进行修改!
- ecs中预设的IPV4与IPV6地址请根据需求自行修改(配置中使用的是日本IP)
- 本地的adguardhome作为国内dns上游,端口号及地址需要修改为本地的(配置中使用的是127.0.0.1:5353)
- mosdns监听的TCP/UDP端口(配置中使用的是5335)
- 国外无污染DNS请根据需求进行更改(google的DOT/DOH在国内可能无法直连,会通过代理访问)
log:
level: info
file: "/tmp/mosdns.log"
include: []
# 数据源
data_providers:
- tag: geoip
file: "/usr/share/v2ray/geoip.dat"
auto_reload: true
- tag: geosite
file: "/usr/share/v2ray/geosite.dat"
auto_reload: true
- tag: whitelist
file: "/etc/mosdns/rule/whitelist.txt"
auto_reload: true
- tag: blocklist
file: "/etc/mosdns/rule/blocklist.txt"
auto_reload: true
- tag: greylist
file: "/etc/mosdns/rule/greylist.txt"
auto_reload: true
- tag: hosts
file: "/etc/mosdns/rule/hosts.txt"
auto_reload: true
- tag: redirect
file: "/etc/mosdns/rule/redirect.txt"
auto_reload: true
- tag: local_ptr
file: "/etc/mosdns/rule/local-ptr.txt"
auto_reload: true
- tag: adlist
file: "/etc/mosdns/rule/adlist.txt"
auto_reload: true
plugins:
################# 可执行插件 ################
# 附加 ECS 至请求
- tag: "add_ecs"
type: "ecs"
args:
auto: false # 是否自动将用户请求的来源地址作为 ECS 附加到请求
ipv4: "133.1.0.0" # 预设的 IPv4 地址。会优先附加在 A 请求里
ipv6: "2001:268:83b::" # 预设的 IPv6 地址。会优先附加在 AAAA 请求里
force_overwrite: true
mask4: 24 # 用于 ipv4 地址的掩码 默认: 24
mask6: 48 # 用于 ipv6 地址的掩码 默认: 48
# 缓存
- tag: lazy_cache
type: cache
args:
size: 102400
lazy_cache_ttl: 259200
# ttl 修改应答的生存时间
- tag: modify_ttl
type: ttl
args:
minimal_ttl: 0 # 最小TTL。如果非零,小于这个数的应答的TTL会被修改成这个值
maximum_ttl: 0 # 最大TTL。如果非零,大于这个数的应答的TTL会被修改成这个值
# adguardhome作为国内dns上游
- tag: "forward_local"
type: fast_forward
args:
upstream:
- addr: 127.0.0.1:5353 # 5353端口请自行修改
trusted: true
# google、cloudflare作为国内dns上游
- tag: "forward_remote"
type: fast_forward
args:
upstream:
- addr: https://dns.google/dns-query
enable_pipeline: true
trusted: true
#enable_http3: true
- addr: https://cloudflare-dns.com/dns-query
enable_pipeline: true
trusted: true
#enable_http3: true
# 查询 白名单 内域名
- tag: query_is_whitelist_domain
type: query_matcher
args:
domain:
- "provider:whitelist"
# 查询 黑名单 内域名
- tag: query_is_blocklist_domain
type: query_matcher
args:
domain:
- "provider:blocklist"
# 查询 灰名单 内域名
- tag: query_is_greylist_domain
type: query_matcher
args:
domain:
- "provider:greylist"
# 查询 host映射 域名
- tag: query_is_hosts_domain
type: hosts
args:
hosts:
- "provider:hosts"
# 查询 重定向 域名
- tag: query_is_redirect_domain
type: redirect
args:
rule:
- "provider:redirect"
# 查询 CN 域名
- tag: query_is_local_domain
type: query_matcher
args:
domain:
- "provider:geosite:cn,apple-cn,google-cn,icloud,tld-cn"
# 查询 非CN 域名
- tag: query_is_non_local_domain
type: query_matcher
args:
domain:
- "provider:geosite:geolocation-!cn"
# 返回 CN IP
- tag: response_has_local_ip
type: response_matcher
args:
ip:
- "provider:geoip:cn"
# 查询 广告 域名
- tag: query_is_ad_domain
type: query_matcher
args:
domain:
- "full:disable-category-ads-all.null"
# 匹配请求的特征
- tag: match_local_ptr
type: query_matcher
args:
qtype: [12]
domain:
- "provider:local_ptr"
# 匹配请求的特征
- tag: match_qtype65
type: query_matcher
args:
qtype: [65]
# sequence 将多个插件组合成流水线
- tag: "main_sequence"
type: "sequence"
args:
exec:
- _misc_optm # 转发服务器优化大杂烩
- query_is_hosts_domain # host映射域名
- query_is_redirect_domain # 重定向域名
# 白名单域名
- if: query_is_whitelist_domain
exec:
- forward_local # 国内dns上游
- modify_ttl
- _return
# 禁止黑名单、广告和非法查询
- if: "query_is_blocklist_domain || query_is_ad_domain || match_local_ptr || match_qtype65"
exec:
- _new_nxdomain_response # 空应答
- _return
- lazy_cache # 缓存 DNS 应答
# 灰名单域名
- if: query_is_greylist_domain
exec:
- add_ecs # 附加 ECS 至请求
- forward_remote # 国外dns上游
- modify_ttl
- _return
# CN域名
- if: query_is_local_domain
exec:
- forward_local # 国内dns上游
- modify_ttl
- _return
# 非CN域名
- if: query_is_non_local_domain
exec:
- add_ecs # 附加 ECS 至请求
- forward_remote # 国外dns上游
- modify_ttl
- _return
# 所有其他情况(兜底)
- primary:
- forward_local # 国内dns上游
- modify_ttl
- if: "(! response_has_local_ip) && [_response_valid_answer]" # 结果 非CNIP 且 有效
exec:
- _drop_response #丢弃已存在的应答
secondary:
- add_ecs # 附加 ECS 至请求
- forward_remote # 国外dns上游
- modify_ttl
fast_fallback: 500 # 建议设置成 local 服务器正常延时的 2~5 倍 单位: 毫秒
always_standby: true
servers:
- exec: main_sequence
listeners:
- protocol: udp
addr: ":5335" # mosdns监听端口
- protocol: tcp
addr: ":5335" # mosdns监听端口
将上述配置黏贴至mosdns的自定义配置中
四、配置smartdns(可选)
smartdns作为本地的DNS查询入口(确保openwrt中的DHCP/DNS中dns转发为127.0.0.1#6053)
tips:
关于smartdns是否能够优化本地连接属于是仁者见仁智者见智,这里只是把他当作一个DNS查询和分流的入口,如果不想使用可以直接忽略(但是要把上图中的mosdns勾选DNS转发,即确保openwrt中的DHCP/DNS中dns转发为127.0.0.1#5335)
这里采用smartdns是由于国外的DNS服务器是自行搭建的ADG,DNS设置中采用的是最快的IP(即只会返回一个VPS自身连接最快的IPV4/IPV6,而不是通过本地的smartdns进行连接测速)
如果采用google或者cloudflare等则不建议通过smartdns,因为smartdns有时会采用ping进行测速(不走代理)
添加一个上游服务器为MOSDNS
五、passwall的DNS设置
设置为Mosdns的udp查询地址
1.使用smartdns
此处必须是mosdns的地址,原因请见[Bug]: 将smartdns第二DNS服务器作为上游服务器似乎不work
2.使用dnsmasq
)
可以尝试配置smartdns第二服务器作为远程DNS
因为mosdns会进行dns分流,因此服务器组保持默认即可
评论区