零、AdguardHome开启HTTP/3支持
如果在vps上搭建了AdguardHome服务器可以尝试开启serve_http3
,使得Mosdns可以通过HTTP/3进行dns查询。(意义在于:如果使用的vless+reality协议,减少一个IP上的不同域名的基于TCP的TLS连接,gfw对于UPD的审查较弱)
修改AdGuardHome.yaml
中的配置
serve_http3: true
use_http3_upstreams: true
use_http3_upstreams
启用上游 DNS 服务器中的常规https://
的 HTTP/3 探测serve_http3
使 AdGuard Home 在配置了加密后运行 DoH3 服务器(监听UDP)
此外,如果使用 h3://
,则无需启用这两个配置参数
以下配置中的查询流程和逻辑与V4版本相同,并且可以搭配smartdns+adguardhome+passwall
关于国外是否需要正确的IP及IP测速,详见*Ray设置流量嗅探,减少DNS解析次数 (只对域名进行一次解析)
一、V5自定义配置
MOSDNS查询流程
- 缓存,缓存未命中则进入下一步.
- cn 域名? -> 国内上游
- 返回是国内 ip ? -> 返回结果,结束.
- 不是国内 ip -> 无污染上游-> 返回结果,结束.
- 非 cn 域名? -> 无污染上游
- 返回非国内 ip ? -> 返回结果,结束.
- 返回国内 ip -> 国内上游-> 返回结果,结束.
- 其他所有情况?
- 优先国内上游结果.
- 否则无污染上游结果.
配置说明(请根据自己的需求修改):
**本地DNS:**配置中由AdguardHome负责,监听本地5353,即配置中forward 127.0.0.1:5353
需要修改
(可配置多个上游可配置多个上游,支持UDP、TCP、DOT、DOH)
**远程DNS:**cloudflare和google的DOH(或VPS上的AdguardHome服务器)
(如果启用http3,请确保代理设置中不拦截443端口的UPD,或者使用其他端口)
**远程ECS:**133.1.0.1
(以上为日本IP的ECS,请根据需求自行更改;若开启了流量嗅探功能,可忽略)
**MosDNS服务器:**监听本地5335
log:
level: info
file: "/tmp/mosdns.log"
# API 入口设置
api:
http: "0.0.0.0:9091"
include: []
plugins:
# 国内域名
- tag: geosite_cn
type: domain_set
args:
files:
- "/var/mosdns/geosite_cn.txt"
# 国内ip
- tag: geoip_cn
type: ip_set
args:
files:
- "/var/mosdns/geoip_cn.txt"
# 国外域名
- tag: geosite_no_cn
type: domain_set
args:
files:
- "/var/mosdns/geosite_geolocation-!cn.txt"
# 白名单 加入的域名始终允许使用 “本地 DNS” 进行解析
- tag: whitelist
type: domain_set
args:
files:
- "/etc/mosdns/rule/whitelist.txt"
# 黑名单 加入的域名将屏蔽 DNS 解析
- tag: blocklist
type: domain_set
args:
files:
- "/etc/mosdns/rule/blocklist.txt"
# 灰名单 加入的域名始终使用 “远程 DNS” 进行解析
- tag: greylist
type: domain_set
args:
files:
- "/etc/mosdns/rule/greylist.txt"
# DDNS域名 加入的域名始终使用 “本地 DNS” 进行解析,并且修改 TTL 为 5 秒,解析结果不进行缓存
- tag: ddnslist
type: domain_set
args:
files:
- "/etc/mosdns/rule/ddnslist.txt"
# 自定义 Hosts 重写
- tag: hosts
type: hosts
args:
files:
- "/etc/mosdns/rule/hosts.txt"
# 重定向请求的域名
- tag: redirect
type: redirect
args:
files:
- "/etc/mosdns/rule/redirect.txt"
# PTR 黑名单 加入的域名将阻止 PTR 请求
- tag: local_ptr
type: domain_set
args:
files:
- "/etc/mosdns/rule/local-ptr.txt"
# 缓存
- tag: lazy_cache
type: cache
args:
size: 102400
lazy_cache_ttl: 259200
dump_file: "/etc/mosdns/cache.dump"
dump_interval: 600
# 转发至远程服务器
- tag: forward_remote
type: forward
args:
concurrent: 1
upstreams:
- addr: "https://dns.google/dns-query"
dial_addr: "8.8.4.4"
bootstrap: "127.0.0.1:5353"
enable_pipeline: true
insecure_skip_verify: false
idle_timeout: 10
#enable_http3: true
- addr: "https://dns.cloudflare.com/dns-query"
dial_addr: "1.0.0.1"
bootstrap: "127.0.0.1:5353"
enable_pipeline: true
insecure_skip_verify: false
idle_timeout: 10
#enable_http3: true
# 如果有VPS的AdguardHome可以自行配置,否则删除
#- addr: "https://【vps域名】:【端口】/dns-query"
#dial_addr: "【vps的IP】:【端口】"
#bootstrap: "127.0.0.1:5353"
#enable_pipeline: true
#insecure_skip_verify: false
#idle_timeout: 10
#enable_http3: true
# 修改ttl(默认0 不修改ttl)
- tag: modify_ttl
type: sequence
args:
- exec: ttl 0-0
# 修改 ddns 域名 ttl(默认 5秒)
- tag: modify_ddns_ttl
type: sequence
args:
- exec: ttl 5-5
# 国内解析
- tag: forward_local
type: sequence
args:
- exec: forward 127.0.0.1:5353
# 国外esc
- tag: ecs_foreign
type: ecs_handler
args:
forward: false # 是否转发来自下游的 ecs
preset: 133.1.0.1 # 发送预设 ecs
send: false # 是否发送 ecs
mask4: 24 # ipv4 掩码。默认 24
mask6: 48 # ipv6 掩码。默认 48 2001:b000:168::/48
# 国外解析
- tag: forward_remote_upstream
type: sequence
args:
# 设置ECS
- exec: $ecs_foreign
- exec: $forward_remote
# 有响应则修改 TTL 并终止返回
- tag: has_resp_sequence
type: sequence
args:
- matches: qname $ddnslist
exec: $modify_ddns_ttl
- matches: "!qname $ddnslist"
exec: $modify_ttl
- matches: has_resp
exec: accept
# fallback 用本地服务器 sequence
# 返回非国内 ip 则 drop_resp
- tag: query_is_non_local_ip
type: sequence
args:
- exec: $forward_local
- matches: "!resp_ip $geoip_cn"
exec: drop_resp
# fallback 用远程服务器 sequence
- tag: fallback
type: fallback
args:
primary: query_is_non_local_ip
secondary: forward_remote_upstream
threshold: 500
always_standby: true
# 查询 DDNS 域名
- tag: query_is_ddns_domain
type: sequence
args:
- matches: qname $ddnslist
exec: $forward_local
# 查询国内域名
- tag: query_is_local_domain
type: sequence
args:
- matches: qname $geosite_cn
exec: $forward_local
# 查询国外域名
- tag: query_is_no_local_domain
type: sequence
args:
- matches: qname $geosite_no_cn
exec: $forward_remote_upstream
# 查询白名单
- tag: query_is_whitelist_domain
type: sequence
args:
- matches: qname $whitelist
exec: $forward_local
# 查询灰名单
- tag: query_is_greylist_domain
type: sequence
args:
- matches: qname $greylist
exec: $forward_remote_upstream
# 拒绝名单
- tag: query_is_reject_domain
type: sequence
args:
- matches: qname $blocklist
exec: reject 3
- matches:
- qtype 12
- qname $local_ptr
exec: reject 3
- matches: qtype 65
exec: reject 3
# 主要的运行逻辑插件
# sequence 插件中调用的插件 tag 必须在 sequence 前定义,
# 否则 sequence 找不到对应插件。
- tag: main_sequence
type: sequence
args:
- exec: $hosts
- exec: jump has_resp_sequence
# 非 “拒绝名单” 或 “DDNS域名” 则启用缓存
- matches:
- "!qname $ddnslist"
- "!qname $blocklist"
- "!qname $local_ptr"
exec: $lazy_cache
- exec: $redirect
- exec: jump has_resp_sequence
- exec: $query_is_ddns_domain
- exec: jump has_resp_sequence
- exec: $query_is_whitelist_domain
- exec: jump has_resp_sequence
- exec: $query_is_reject_domain
- exec: jump has_resp_sequence
- exec: $query_is_greylist_domain
- exec: jump has_resp_sequence
- exec: $query_is_local_domain
- exec: jump has_resp_sequence
- exec: $query_is_no_local_domain
- exec: jump has_resp_sequence
- exec: $fallback
# 启动 udp 服务器。
- tag: udp_server
type: udp_server
args:
entry: main_sequence
listen: ":5335"
# 启动 tcp 服务器。
- tag: tcp_server
type: tcp_server
args:
entry: main_sequence
listen: ":5335"
二、内置预设
由于自定义配置中的大部分内容都是基于luci-app-mosdns/config_custom.yaml,所以以下内置预设除了DNS解析服务器与ECS配置的自由度上,基本不存在差别
不建议开启此处的DNS广告过滤(建议自建AdguardHome)
三、smartdns的配置
不详细展开,基本原理详见
配置【mosdns+smartdns+adguard+passwall】实现dns分流+去广告
passwall+Adguard+(smartdns)实现DNS分流&去广告
四、passwall的配置
不详细展开,基本原理详见
配置【mosdns+smartdns+adguard+passwall】实现dns分流+去广告
passwall+Adguard+(smartdns)实现DNS分流&去广告
五、Linux上运行Mosdns
在没有luci界面的非openwrt上,由于mosdns不能直接使用geoip.dat和geosite.dat的数据因此需要借助v2dat: A cli tool that can unpack v2ray data packages.转换成txt使用。
如果懒得编译v2dat可以直接用一位大佬每日更新的规则Releases · MartialBE/v2dat_rule
评论区