Skip to content

Commit

Permalink
拆分 mosdns 配置文件,支持 ip 优选
Browse files Browse the repository at this point in the history
  • Loading branch information
217heidai committed Jan 12, 2024
1 parent c8c199c commit 5a0ab9d
Show file tree
Hide file tree
Showing 9 changed files with 355 additions and 290 deletions.
15 changes: 9 additions & 6 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,15 @@ COPY default /nestingdns/default

# 下载 site 文件
RUN mkdir -p /nestingdns/default/site && \
curl https://mirror.ghproxy.com/https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/apple-cn.txt > /nestingdns/default/site/apple-cn.txt && \
curl https://mirror.ghproxy.com/https://raw.githubusercontent.com/Hackl0us/GeoIP2-CN/release/CN-ip-cidr.txt > /nestingdns/default/site/CN-ip-cidr.txt && \
curl https://mirror.ghproxy.com/https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/direct-list.txt > /nestingdns/default/site/direct-list.txt && \
curl https://mirror.ghproxy.com/https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/gfw.txt > /nestingdns/default/site/gfw.txt && \
curl https://mirror.ghproxy.com/https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/google-cn.txt > /nestingdns/default/site/google-cn.txt && \
curl https://mirror.ghproxy.com/https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/proxy-list.txt > /nestingdns/default/site/proxy-list.txt
curl https://mirror.ghproxy.com/https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/direct-list.txt > /nestingdns/default/site/direct-list.txt && \
curl https://mirror.ghproxy.com/https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/apple-cn.txt > /nestingdns/default/site/apple-cn.txt && \
curl https://mirror.ghproxy.com/https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/google-cn.txt > /nestingdns/default/site/google-cn.txt && \
curl https://mirror.ghproxy.com/https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/proxy-list.txt > /nestingdns/default/site/proxy-list.txt && \
curl https://mirror.ghproxy.com/https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/gfw.txt > /nestingdns/default/site/gfw.txt && \
curl https://mirror.ghproxy.com/https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/greatfire.txt > /nestingdns/default/site/greatfire.txt && \
curl https://mirror.ghproxy.com/https://raw.githubusercontent.com/Loyalsoldier/domain-list-custom/release/private.txt > /nestingdns/default/site/private.txt && \
curl https://mirror.ghproxy.com/https://raw.githubusercontent.com/Hackl0us/GeoIP2-CN/release/CN-ip-cidr.txt > /nestingdns/default/site/CN-ip-cidr.txt && \
curl https://www.cloudflare-cn.com/ips-v4/# > /nestingdns/default/site/cloudflare.txt

# 拷入可执行文件
COPY --from=smartdns-builder /usr/sbin/smartdns /nestingdns/bin/smartdns
Expand Down
20 changes: 11 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,25 +9,24 @@ DNS 三大神器 [AdGuardHome](https://github.com/AdguardTeam/AdGuardHome)、[Mo
2. MosDNS 为第二层 DNS,监听端口 5053。
- 负责分流。
- 直连:待解析域名在 [direct-list.txt](https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/direct-list.txt)[apple-cn.txt](https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/apple-cn.txt)[google-cn.txt](https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/google-cn.txt)、force-cn.txt(自定义不走代理的域名)内,通过 SmartDNS 的 mainland 组进行解析。
- 代理:待解析域名在 [proxy-list.txt](https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/proxy-list.txt)[gfw.txt](https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/gfw.txt)、force-nocn.txt(自定义走代理的域名)内,通过 SmartDNS 的 gfw 组进行解析。
- 代理:待解析域名在 [proxy-list.txt](https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/proxy-list.txt)[gfw.txt](https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/gfw.txt)[greatfire.txt](https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/greatfire.txt)force-nocn.txt(自定义走代理的域名)内,通过 SmartDNS 的 gfw 组进行解析。
- Fallback:待解析域名不在以上规则内的,先使用 SmartDNS 的 mainland 组进行解析,如解析出来的地址为国内 IP(在 [CN-ip-cidr.txt](https://raw.githubusercontent.com/Hackl0us/GeoIP2-CN/release/CN-ip-cidr.txt) 内)则使用,否则抛弃。再使用 SmartDNS 的 gfw 组进行解析,如解析成功则使用,如失败则使用 SmartDNS 的 overseas 组进行解析(gfw 组使用代理连接公共 DNS,当代理异常时使用 overseas 组作为备用进行解析)。
3. SmartDNS 为第三层 DNS,监听端口 6053、7053、8053
- 负责 DNS 解析、测速、缓存。
- mainland 组,端口 7053,通过 DoT 接入上游 AliDNS、DNSPod、360DNS,负责直连域名解析。
- gfw 组,端口 8053,通过 DoH 接入上游 Google、Cloudflare、Quad9,负责代理域名解析。
- overseas 组,端口 6053,通过 DoT 接入上游 Google、Cloudflare、Quad9、Quad101、DNS SB、NextDNS,作为备用域名解析。
- gfw 组,端口 8053,通过代理使用 DoH 接入上游 Google、Cloudflare、Quad9,负责代理域名解析。
- overseas 组,端口 6053,通过 DoT 接入上游 Google、Cloudflare、Quad9、Quad101、DNS.SB、NextDNS,作为备用域名解析。

![NestingDNS](docs/NestingDNS.png)

# 安装方法
使用 Docker 一键安装。
使用 Docker 一键安装。
1. network host 模式(推荐使用)
```bash
docker run -d \
--restart unless-stopped \
--name nestingdns \
-p 3000:3000 \ # web 页面
-p 4053:4053 \ # NDS
-p 4053:4053/udp \ # NDS
--network host \
-v $HOME/nestingdns/etc:/nestingdns/etc \ # 配置文件路径
-v $HOME/nestingdns/work:/nestingdns/work \ # 工作文件路径
-v $HOME/nestingdns/log:/nestingdns/log \ # 日志文件路径
Expand All @@ -36,7 +35,7 @@ docker run -d \
217heidai/nestingdns
```

如需将 MosDNS、SmartDNS 端口映射出来,可使用:
2. 端口映射模式(MosDNS、SmartDNS 的端口可以不映射)
```bash
docker run -d \
--restart unless-stopped \
Expand Down Expand Up @@ -68,12 +67,15 @@ AdGuardHome 配置文件为 `$HOME/nestingdns/etc/conf/adguardhome.yaml`。
- 已内置去广告规则 [AdBlock DNS Filters](https://github.com/217heidai/adblockfilters)

## MosDNS
MosDNS 配置文件为 `$HOME/nestingdns/etc/conf/mosdns.yaml`
MosDNS 配置文件为 `$HOME/nestingdns/etc/conf/mosdns.yaml``$HOME/nestingdns/etc/conf/mosdns_load_rules.yaml``$HOME/nestingdns/etc/conf/mosdns_forward.yaml`
- **默认已配置好,一般无需调整**
- 各项配置可参考官方 [wiki](https://irine-sistiana.gitbook.io/mosdns-wiki/)
- 分流规则文件路径为 `$HOME/nestingdns/etc/site/`。根据创建容器时的 SCHEDULE 参数,定时下载更新分流规则文件,默认每天 4 点更新。
- 自定义不走代理规则文件为 `$HOME/nestingdns/etc/site/force-cn.txt`。默认为空,可自行添加内容,如填入 VPS 的域名。
- 自定义走代理规则文件为 `$HOME/nestingdns/etc/site/force-nocn.txt`。默认为空,可自行添加内容。
- gfw ttl 默认修改为 600s,`$HOME/nestingdns/etc/conf/mosdns_forward.yaml` 中设置 sequence dns_gfw,如有多个代理地址切换的,建议设置较小值。(上游 smartdns gfw 组默认已关闭缓存、测速)
- IP 优选,默认关闭。如需启用 IP 优选,请在 `$HOME/nestingdns/etc/conf/mosdns_forward.yaml` 中找到所有best_ip,删掉注释。测速工具推荐使用 [CloudflareSpeedTest](https://github.com/XIU2/CloudflareSpeedTest)(注意测速必须关闭代理)。如启用 IP 优选,建议多填几个不同网段的 ip。
- cloudflare 优选,将测速较快的 ip 填入 `$HOME/nestingdns/etc/conf/mosdns_forward.yaml` 中 sequence blackhole_cloudflare。

## SmartDNS
SmartDNS 配置文件为 `$HOME/nestingdns/etc/conf/smartdns.conf`
Expand Down
Empty file added default/conf/init
Empty file.
149 changes: 24 additions & 125 deletions default/conf/mosdns.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,134 +12,29 @@ log:

# []string, 从其他配置文件载入 plugins 插件设置。
# include 的插件会比本配置文件中的插件先初始化。
include: []
include:
- "/nestingdns/etc/conf/mosdns_load_rules.yaml"
- "/nestingdns/etc/conf/mosdns_forward.yaml"

# 插件设置
plugins:
- tag: "geosite-cn" # 插件的 tag。由用户自由设定但不能重复。可省略。
type: "domain_set" # domain_set插件,载入的域名表可供其他插件引用。插件加载后,数据只占一份内存。引用的数据是共享的,多次被引用不会消耗格外内存。
args: # 插件参数。取决于插件类型。
files: # 从文本文件载入
- "/nestingdns/etc/site/direct-list.txt"
- "/nestingdns/etc/site/apple-cn.txt"
- "/nestingdns/etc/site/google-cn.txt"
- "/nestingdns/etc/site/force-cn.txt" # 自定义国内域名

- tag: "geosite-nocn"
type: "domain_set"
args:
files:
- "/nestingdns/etc/site/proxy-list.txt"
- "/nestingdns/etc/site/gfw.txt"
- "/nestingdns/etc/site/force-nocn.txt" # 自定义国际域名

- tag: "geoip-cn"
type: ip_set
args:
files: "/nestingdns/etc/site/CN-ip-cidr.txt"

- tag: "hosts_local"
type: "hosts" # hosts插件,域名映射 IP 。如果请求的域名在 hosts 内,则将应答放入请求。虽然都叫 hosts,但本插件所用的格式和平常 Win,Linux 系统内的那个 hosts 文件不一样。
args:
files: "/nestingdns/etc/site/hosts.txt"

- tag: "cache_local" # mosdns仅做临时缓存,主要缓存又smartdns处理
type: "cache" # 缓存 DNS 应答的插件。如果请求命中缓存,则将缓存的应答放入请求。当某一请求经过 cache 后,cache 会在这个请求处理流程结束时自动将应答放入缓存。用户无需介入。注意: 本插件是本地缓存(适用于客户端或者局域网内的缓存)。不适用于服务器端缓存。不支持扩展 DNS 协议 (即 EDNS0),请求的 EDNS0 部分会被无视,应答的 EDNS0 会被略去。
args:
size: 1024 # 内置内存缓存大小。单位: 条。默认: 1024。每个 cache 插件的内存缓存是独立的。
# (实验性) lazy cache 设定。lazy_cache_ttl > 0 会启用 lazy cache。
# 所有应答都会在缓存中存留 lazy_cache_ttl 秒,但自身的 TTL 仍然有效。如果命中过期的应答,
# 则缓存会立即返回 TTL 为 5 的应答,然后自动在后台发送请求更新数据。
# 相比强行增加应答自身的 TTL 的方法,lazy cache 能提高命中率,同时还能保持一定的数据新鲜度。
lazy_cache_ttl: 0 # lazy cache 生存时间。单位: 秒。默认: 0 (禁用 lazy cache)。
# (实验性) 将缓存保存在磁盘。插件启动时也会自动从该文件载入缓存。
# 缓存将在 mosdns 被关闭时保存。
dump_file: "/nestingdns/work/mosdns/cache.dump"
# (实验性) 自动保存间隔。单位秒。默认 600。
# 如果距离上次 dump 有 size 次更新,则自动保存。
dump_interval: 3600

# DNS 转发插件
- tag: "forward_overseas" # 转发至 overseas 域名解析服务
type: "forward" # forward插件,转发请求至上游服务器。获取应答后放入请求。
args:
concurrent: 1 # 并发数。每次请求会从下面配置的 upstreams 里随机选取 concurrent 个 upstreams 发送请求。取最快返回的应答。超过 3 最多选 3 个。默认 1 。
upstreams:
- tag: "overseas" # 本上游的 tag。用于标识和 log。可省略。同一插件内该 tag 必需唯一。建议全局唯一。
addr: "udp://127.0.0.1:6053" # 服务器地址。格式: [protocol://]host[:port][/path]

# DNS 转发插件
- tag: "forward_mainland" # 转发至 mainland 域名解析服务
type: "forward"
args:
concurrent: 1
upstreams:
- tag: "mainland"
addr: "udp://127.0.0.1:7053"

# DNS 转发插件
- tag: "forward_gfw" # 转发至 gfw 域名解析服务
type: "forward"
args:
concurrent: 1
upstreams:
- tag: "gfw"
addr: "udp://127.0.0.1:8053"

- tag: "dns_overseas"
type: "sequence" # 按顺序组合多个插件,sequence 是个可执行插件。可以被其他插件(比如服务器插件)调用。sequence 与 sequence 联动请使用自带的跳转命令 (goto, jump ...),不要使用 exec 。
args:
- exec: query_summary
- exec: $forward_overseas

- tag: "dns_mainland"
type: "sequence" # 按顺序组合多个插件,sequence 是个可执行插件。可以被其他插件(比如服务器插件)调用。sequence 与 sequence 联动请使用自带的跳转命令 (goto, jump ...),不要使用 exec 。
args:
- exec: query_summary
- exec: $forward_mainland

- tag: "dns_gfw"
type: "sequence" # 按顺序组合多个插件,sequence 是个可执行插件。可以被其他插件(比如服务器插件)调用。sequence 与 sequence 联动请使用自带的跳转命令 (goto, jump ...),不要使用 exec 。
args:
- exec: query_summary
- exec: $forward_gfw

- tag: "primary_forward"
type: "sequence" # 按顺序组合多个插件,sequence 是个可执行插件。可以被其他插件(比如服务器插件)调用。sequence 与 sequence 联动请使用自带的跳转命令 (goto, jump ...),不要使用 exec 。
args:
- exec: $dns_mainland
- matches: # 匹配条件。多个匹配条件为 AND 关系。如返回的 IP 不为国内地址,则抛弃。
- "!resp_ip $geoip-cn"
- "has_resp"
exec: drop_resp

- tag: "secondary_forward"
- tag: "match_qtype65"
type: "sequence"
args:
- exec: $dns_gfw
- matches:
- rcode 2 # 匹配应答的 RCODE
exec: $dns_overseas # 在 gfw 代理无法使用时,回退使用 overseas 组解析。

- tag: "final_forward"
type: "fallback" # 回滚机制: 如果 primary 抛出错误,或返回但没有应答,或在 threshold 毫秒内无响应,则执行 secondary 。因无响应触发 fallback 时,如果 primary 比 secondary 先返回了应答,则依旧会采用 primary 的应答。 fallback 是多线程。primary 和 secondary 是独立的线程,它们收到的请求是 fallback 收到的请求的镜像。任何一方对请求做出修改不会影响对方,也不会影响 fallback 所在的 sequence 。如果 primary 和 secondary 是 sequence ,则它是一级/根 sequence。
args:
primary: primary_forward # 主可执行插件的 tag
secondary: secondary_forward # 副可执行插件的 tag
threshold: 150 # 无响应回滚阈值。单位毫秒。默认 500 。
always_standby: true # secondary 会和 primary 一并执行。secondary 的结果将会在需要回滚时,立刻被采用。
- exec: query_summary
- exec: reject 3

- tag: "match_hosts"
- tag: "match_private"
type: "sequence"
args:
- exec: query_summary
- exec: accept
- exec: reject 5

- tag: "match_qtype65"
- tag: "match_hosts"
type: "sequence"
args:
- exec: query_summary
- exec: reject 0
- exec: accept

- tag: "match_cache"
type: "sequence"
Expand All @@ -150,31 +45,35 @@ plugins:
- tag: "main_sequence"
type: "sequence"
args:
- exec: $hosts_local
- matches: has_wanted_ans # 如果有期望的 ANSWER,返回 true 。"期望的ANSWER "指应答的 ANSWER 中包含和 QUESTOIN 类型相同的 record。比如请求 A 记录,应答里返回了 A 记录,则该判断为 true。请求 AAAA 记录,虽然返回了SUCCESS 应答但无 AAAA 记录,返回 false 。
exec: $match_hosts

- matches:
- qtype 65
exec: $match_qtype65
exec: jump $match_qtype65 # 屏蔽 QTYPE 65

- matches:
- qname $geosite-private "ip6-localhost" "ip6-loopback"
exec: jump $match_private # 屏蔽内网域名

- exec: $hosts-local
- matches: has_wanted_ans # 如果有期望的 ANSWER,返回 true 。"期望的ANSWER "指应答的 ANSWER 中包含和 QUESTOIN 类型相同的 record。比如请求 A 记录,应答里返回了 A 记录,则该判断为 true。请求 AAAA 记录,虽然返回了SUCCESS 应答但无 AAAA 记录,返回 false 。
exec: jump $match_hosts

- exec: $cache_local
- exec: $cache-local
- matches: has_wanted_ans
exec: $match_cache
exec: jump $match_cache

- exec: prefer_ipv4 # 让下游客户端支持双栈时优先使用 IPv4
- exec: prefer_ipv4 # 优先使用 IPv4

# mainland 域名解析
- matches:
- qname $geosite-cn
exec: $dns_mainland
exec: jump $dns_mainland
- matches: has_wanted_ans
exec: accept

# gfw 域名解析
- matches:
- qname $geosite-nocn
exec: $dns_gfw
exec: jump $dns_gfw
- matches: has_wanted_ans
exec: accept

Expand Down
Loading

0 comments on commit 5a0ab9d

Please sign in to comment.