原文链接:https://rxclc.top/index.php/archives/11/

 

 

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

 

 

如果需要直接在OpenWrt上使用可以参考 mosdns的Wiki 或者在编译固件时将openwrt-mos编译进去.

 

准备工作

 

配置文件使用的是根据openwrt-mos以及mosdns的wiki中的推荐配置,做了一点小改动,大家可以参考mosdns的Wiki自行修改。如果是不习惯使用openwrt-mos的默认配置或者默认配置存在一些问题也可以尝试使用下面的配置。

 

  • 前往这里下载MOSDNS需要的路由规则文件geoip.datgeosite.dat
  • 本地创建一个名为config.yaml的配置文件,并复制下方配置到config.yaml文件
    2022年3月24日 配置更新,#阿里的pipeline有时会出问题,等以后稳定了再启用吧。

     

    log:
    level: info
    file: ''
    
    plugin:
    
    ################# 服务器插件 ################
    
    - tag: main_server  # 服务器插件。(一个正常工作的 DNS 软件必需要一个服务器插件接收客户端的请求。)
      type: server
      args:
        entry:          # 这里设定收到的请求会经过哪些插件(被哪些插件处理)。
          - _no_ecs
          - _single_flight
          - main_sequence   # 运行主执行序列
    
        server:   # 监听以下协议和端口
          - protocol: udp
            addr: '[::]:5335'
          - protocol: tcp
            addr: '[::]:5335'
    
    ################# 可执行插件 ################
    
    # 主执行序列。包含分流的逻辑的插件。
    # 当然这些逻辑直接写在 `server` 的 entry 也没问题。这里只是 `sequence` 插件的示例。让配置看起来更干净。 
    - tag: main_sequence
      type: sequence
      args:
        exec:
          - if:
              - query_is_ad_domain    # 已知的广告域名
            exec:
              - _block_with_nxdomain  # 生成 NXDOMAIN 应答
              - _return               # 返回。不再执行后续插件。
    
          - mem_cache      # 运行缓存插件。放在这里就可以避免缓存到无用的广告域名。
    
          - if:
              - query_is_local_domain   # 已知的本地域名
              - '!_query_is_common'     # 和不常见的请求类型
            exec:
              - forward_local           # 用本地服务器获取应答
              - _return
    
          - if:
              - query_is_non_local_domain  # 已知的非本地域名
            exec:
              - _prefer_ipv4               # 优先 IPv4
              - forward_remote             # 用远程服务器获取应答
              - _return
    
          # 剩下的未知域名用 IP 分流。原理类似 ChinaDNS,但更稳定。
          # 详细分流原理请参考 `fallback` 的工作流程。
          - primary:
              - forward_local     # 本地服务器获取应答。
              - if:
                  - '!response_has_local_ip'  # 应答包含非本地 IP。
                exec:
                  - _drop_response            # 丢掉。
            secondary:
              - _prefer_ipv4
              - forward_remote
            fast_fallback: 150  # 这里建议设置成 local 服务器正常延时的 2~5 倍。
                                # 这个延时保证了 local 延时偶尔变高时,其结果不会被 remote 抢答。
                                # 如果 local 超过这个延时还没响应,可以假设 local 出现了问题。
                                # 这时用就采用 remote 的应答。单位: 毫秒。
            always_standby: true
    
    
    # 缓存
    - tag: 'mem_cache'
      type: 'cache'
      args:
        size: 1024
        lazy_cache_ttl: 17200
    
    # 转发请求至本地服务器的插件
    - tag: forward_local
      type: fast_forward
      args:
        upstream:
          - addr: tcp://223.5.5.5
            #阿里的pipeline有时会出问题,等以后稳定了再启用吧
            #enable_pipeline: true
    
          - addr: tcp://119.29.29.29
    
    # 转发请求至远程服务器的插件
    - tag: forward_remote
      type: fast_forward
      args:
        upstream:
          - addr: tcp://208.67.222.222
            enable_pipeline: true
    
          - addr: tcp://1.1.1.1
            enable_pipeline: true
    
    ################ 匹配器插件 #################
    
    # 匹配本地域名的插件
    - tag: query_is_local_domain
      type: query_matcher
      args:
        domain:
          - 'ext:./geosite.dat:cn'
    
    # 匹配非本地域名的插件
    - tag: query_is_non_local_domain
      type: query_matcher
      args:
        domain:
          - 'ext:./geosite.dat:geolocation-!cn'
    
    # 匹配广告域名的插件
    - tag: query_is_ad_domain
      type: query_matcher
      args:
        domain:
          - 'ext:./geosite.dat:category-ads-all'
    
    # 匹配本地 IP 的插件
    - tag: response_has_local_ip
      type: response_matcher
      args:
        ip:
          - 'ext:./geoip.dat:cn'
    

Docker使用mosdns

先拉取mosdns的镜像

docker pull irinesistiana/mosdns

然后创建mosdns对应的文件夹,再把config.yaml/geoip.dat/geosite.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

使用

安装完成之后我们需要对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分别加入直连和代理列表中。

223.6.6.6
162.14.21.178
配置文件由DOT/DOH换成TCP53了,所以更新一下
119.29.29.29
223.5.5.5

 

DNS解析方式

自动更新geosite和geoip

 

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

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

 

cat > /root/auto_update_geoxx.sh << EOF
#!/bin/sh
wget --no-check-certificate https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/geosite.dat -O /etc/mosdns/geosite.dat
wget --no-check-certificate https://cdn.jsdelivr.net/gh/Loyalsoldier/geoip@release/cn.dat -O /etc/mosdns/geoip.dat
docker restart mosdns
EOF

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

chmod +x /root/auto_update_geoxx.sh

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

30 3 * * * /root/auto_update_geoxx.sh

参考链接

mosdns
v2ray-rules-dat
openwrt-mos