侧边栏壁纸
  • 累计撰写 65 篇文章
  • 累计创建 46 个标签
  • 累计收到 101 条评论

目 录CONTENT

文章目录

配置【mosdns+smartdns+adguard+passwall】实现dns分流+去广告

草莓牛奶
2022-12-10 / 2 评论 / 0 点赞 / 3,757 阅读 / 1,877 字 / 正在检测是否收录...
温馨提示:
「博客文章out of date 会及时更新,无特殊说明仍然有效,欢迎指正内容中的错误」

一、前言

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的国内上游服务器,因此无需重定向

image-20220901212028735

如果需要使用smartdns则无需勾选最快的IP地址,否则可以尝试开启最快的IP地址

image-20221210231242170

三、配置MOSDNS

最新的V5版本配置详见mosdns自定义配置V5版本【附smartdns与passwall更新】

MOSDNS查询流程

  • 缓存,缓存未命中则进入下一步.
  • cn 域名? -> 国内上游
    • 返回是国内 ip ? -> 返回结果,结束.
    • 不是国内 ip -> 无污染上游-> 返回结果,结束.
  • 非 cn 域名? -> 无污染上游
    • 返回非国内 ip ? -> 返回结果,结束.
    • 返回国内 ip -> 国内上游-> 返回结果,结束.
  • 其他所有情况?
    • 优先国内上游结果.
    • 否则无污染上游结果.

以下配置文件中,有四处需要进行修改!

  1. ecs中预设的IPV4与IPV6地址请根据需求自行修改(配置中使用的是日本IP)
  2. 本地的adguardhome作为国内dns上游,端口号及地址需要修改为本地的(配置中使用的是127.0.0.1:5353)
  3. mosdns监听的TCP/UDP端口(配置中使用的是5335)
  4. 国外无污染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的自定义配置中

image-20221210215000905

四、配置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进行测速(不走代理)

image-20221210223640891

添加一个上游服务器为MOSDNS

image-20221210224831394

五、passwall的DNS设置

设置为Mosdns的udp查询地址

1.使用smartdns

此处必须是mosdns的地址,原因请见[Bug]: 将smartdns第二DNS服务器作为上游服务器似乎不work

image-20221230221147558

2.使用dnsmasq

image-20221230222353113)

可以尝试配置smartdns第二服务器作为远程DNS

image-20230109124011091

因为mosdns会进行dns分流,因此服务器组保持默认即可

image-20230109124039464

0

评论区