已弃用,openwrt建议使用openwrt-mos和它自带的配置

本文主要介绍的是Docker使用mosdns的方法

准备工作

配置文件使用的是根据openwrt-mos以及mosdns的wiki中的推荐配置,做了一点小改动,大家可以参考mosdns的Wiki自行修改。如果是使用openwrt-mos建议使用其自带的配置。

  • 下载MOSDNS需要的路由规则文件geoip-only-cn-private.datgeosite.dat
  • 本地创建一个名为config.yaml的配置文件,并复制下方配置到config.yaml文件

    log:
    level: error
    file: "/etc/mosdns/mosdns.log"
    
    data_providers:
    - tag: geosite
      file: ./geosite.dat
      auto_reload: true
    - tag: geoip
      file: ./geoip-only-cn-private.dat
      auto_reload: true
    
    plugins:
    # 缓存
    - tag: cache
      type: cache
      args:
        size: 4096
        lazy_cache_ttl: 172800
    
    # 转发至本地服务器的插件
    - tag: forward_local
      type: fast_forward
      args:
        upstream:
          - addr: tls://120.53.53.53:853
            enable_pipeline: true
    
          - addr: tls://223.6.6.6:853
            idle_timeout: 8
            trusted: true
    
    # 转发至远程服务器的插件
    - tag: forward_remote
      type: fast_forward
      args:
        upstream:
          - addr: tls://208.67.220.220:853
            enable_pipeline: true
    
          - addr: tls://1.0.0.1:853
            enable_pipeline: true
            trusted: true
    
    
    # 匹配本地域名的插件
    - tag: query_is_local_domain
      type: query_matcher
      args:
        domain:
          - 'provider:geosite:apple-cn'
          - 'provider:geosite: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:geoip:cn'
    
    # 主要的运行逻辑插件
    # sequence 插件中调用的插件 tag 必须在 sequence 前定义,
    # 否则 sequence 找不到对应插件。
    - tag: main_sequence
      type: sequence
      args:
        exec:
          # 删除ECS
          - _no_ecs
          # 缓存
          - cache
    
          # 屏蔽广告域名
          - if: query_is_ad_domain
            exec:
              - _new_nxdomain_response
              - _return
    
          # 已知的本地域名用本地服务器解析
          - if: query_is_local_domain
            exec:
              - forward_local
              - _return
    
          # 已知的非本地域名用远程服务器解析
          - if: query_is_non_local_domain
            exec:
              - forward_remote
              - _return
    
            # 剩下的未知域名用 IP 分流。
            # 这里借助了 `fallback` 工作机制。分流原理请参考 `fallback`
            # 的工作流程。
            # primary 从本地服务器获取应答,丢弃非本地 IP 的结果。
          - primary:
              - forward_local
              - if: "(! response_has_local_ip) && [_response_valid_answer]"
                exec:
                  - _drop_response
            # secondary 从远程服务器获取应答。
            secondary:
              - _prefer_ipv4
              - forward_remote
            # 这里建议设置成 local 服务器正常延时的 2~5 倍。
            # 这个延时保证了 local 延时偶尔变高时,其结果不会被 remote 抢答。
            # 如果 local 超过这个延时还没响应,可以假设 local 出现了问题。
            # 这时用就采用 remote 的应答。单位: 毫秒。
            fast_fallback: 200
    
    servers:
    - exec: main_sequence
      listeners:
        - protocol: udp
          addr: 0.0.0.0:5335
        - protocol: tcp
          addr: 0.0.0.0:5335
    

Docker使用mosdns

先拉取mosdns的镜像

docker pull irinesistiana/mosdns

然后创建mosdns对应的文件夹,再把config.yaml/geoip.dat/geoip-only-cn-private.dat三个文件上传到/etc/mosdns下.

mkdir /etc/mosdns

这时我们需要关闭掉SSRP/HelloWorld等科学上网插件!因为mosdns需要监听5335端口,SSRP/HelloWorld默认的PDNSD会使用5335端口

运行以下命令即可启用mosdns

docker run -d \
  --name mosdns \
  --net=host \
  -v /etc/mosdns:/etc/mosdns \
  --restart=always \
  irinesistiana/mosdns:latest

使用

如果是openclash的话,请看【OpenClash 的简单配置教程】这篇文章的进阶部分

安装完成之后我们需要对OpenWrt进行一些简单的配置

  • 网络 - DHCP/DNS - 基本设置 - DNS转发设置为127.0.0.1#5335
  • 网络 - DHCP/DNS - HOSTS和解析文件 - 勾选忽略解析文件
  • 网络 - DHCP/DNS - 高级设置 - DNS 查询缓存的大小设置为0

最后只需简单设置一下SSRP/Passwall/HelloWorld就完成了。

以SSRP/HelloWorld为例,只要把DNS解析方式使用本机端口为5335的DNS服务
Passwall的话可以使用不过滤模式,如果需要分流可以用自定义DNS,同样的端口需要设置为5335

还需要注意的一点是,不要忘记把国内DNS和国外DNS分别加入直连和代理列表中。

120.53.53.53
223.6.6.6
208.67.220.220
1.0.0.1
不用添加
不用添加

DNS解析方式

自动更新geosite和geoip

2022年2月28日 更新一个自动更新geosite和geoip的小脚本,就几行很简单。

直接在命令行输入下面的内容就行, 之后一定记得要加执行权限, 最后去设置一个定时任务即可。

cat > /root/auto_update_geoxx.sh << EOF
#!/bin/sh
wget --no-check-certificate https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat -O /etc/mosdns/geosite.dat
wget --no-check-certificate https://raw.githubusercontent.com/Loyalsoldier/geoip/release/geoip-only-cn-private.dat -O /etc/mosdns/geoip-only-cn-private.dat
docker restart mosdns
EOF

这是添加执行权限的命令.

chmod +x /root/auto_update_geoxx.sh

OpenWrt在计划任务里添加下面这行即可

33 3 * * * /root/auto_update_geoxx.sh

参考链接

mosdns
v2ray-rules-dat
openwrt-mos

最后修改:2022 年 07 月 28 日
如果觉得我的文章对你有用,请随意赞赏