Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Bug] has invalid keys: data_providers, servers #803

Open
4 tasks done
Joyist2021 opened this issue Mar 20, 2024 · 3 comments
Open
4 tasks done

[Bug] has invalid keys: data_providers, servers #803

Joyist2021 opened this issue Mar 20, 2024 · 3 comments

Comments

@Joyist2021
Copy link

在提交之前,请确认

  • 我已经尝试搜索过 Issue ,但没有找到相关问题。
  • 我正在使用最新的 mosdns 版本(或者最新的 commit),问题依旧存在。
  • 我仔细看过 wiki 后仍然无法自行解决该问题。
  • 我非常确定这是 mosdns 核心的问题。(如果是通过第三方衍生软件使用 mosdns 核心,不确定问题源头时,请先向衍生软件开发者提交问题。)

mosdns 版本

几乎最新版本

操作系统

ubuntu

Bug 描述和复现步骤

2024-03-20T13:57:26.474Z INFO working directory changed {"path": "/etc/mosdns"}
Error: fail to load config, failed to unmarshal config: 1 error(s) decoding:

  • '' has invalid keys: data_providers, servers
    2024-03-20T13:57:26.478Z FATAL fail to load config, failed to unmarshal config: 1 error(s) decoding:

  • '' has invalid keys: data_providers, servers
    2024-03-20T14:05:57.139Z INFO working directory changed {"path": "/etc/mosdns"}
    2024-03-20T14:05:57.142Z INFO main config loaded {"file": "/etc/mosdns/config.yaml"}
    Error: failed to init plugin [BUG]OpenWrt 服务脚本不能启动程序 #4 hosts, failed to init plugin: failed to read file #0 /etc/mosdns/hosts, open /etc/mosdns/hosts: no such file or directory
    2024-03-20T14:05:57.144Z FATAL failed to init plugin [BUG]OpenWrt 服务脚本不能启动程序 #4 hosts, failed to init plugin: failed to read file #0 /etc/mosdns/hosts, open /etc/mosdns/hosts: no such file or directory
    2024-03-20T14:15:23.744Z INFO working directory changed {"path": "/etc/mosdns"}
    2024-03-20T14:15:23.747Z INFO main config loaded {"file": "/etc/mosdns/config.yaml"}
    2024-03-20T14:17:45.469Z INFO working directory changed {"path": "/etc/mosdns"}
    2024-03-20T14:17:45.471Z INFO main config loaded {"file": "/etc/mosdns/config.yaml"}

使用的配置文件

# EasyMosdns v3.0(Final Release)
# https://apad.pro/easymosdns
log:
    file: "./mosdns.log"
    level: error

data_providers:
  - tag: chinalist
    file: ./rules/china_domain_list.txt
    auto_reload: true
  - tag: gfwlist
    file: ./rules/gfw_domain_list.txt
    auto_reload: true
  - tag: cdncn
    file: ./rules/cdn_domain_list.txt
    auto_reload: true
  - tag: chinaip
    file: ./rules/china_ip_list.txt
    auto_reload: true
  - tag: gfwip
    file: ./rules/gfw_ip_list.txt
    auto_reload: true
  - tag: adlist
    file: ./rules/ad_domain_list.txt
    auto_reload: true
  - tag: ecscn
    file: ./ecs_cn_domain.txt
    auto_reload: true
  - tag: ecsnoncn
    file: ./ecs_noncn_domain.txt
    auto_reload: true
  - tag: hosts
    file: ./hosts.txt
    auto_reload: true

plugins:
  # 缓存的插件
  # [lan|wan]
  - tag: cache_lan
    type: cache
    args:
      size: 8192
      #redis: "redis://127.0.0.1:6379/0"
      lazy_cache_ttl: 86400
      cache_everything: true
      lazy_cache_reply_ttl: 1
  - tag: cache_wan
    type: cache
    args:
      size: 131072
      compress_resp: true
      #redis: "redis://127.0.0.1:6379/0"
      lazy_cache_ttl: 86400
      cache_everything: true
      lazy_cache_reply_ttl: 5

  # Hosts的插件
  - tag: hosts
    type: hosts
    args:
      hosts:
        - "provider:hosts"

  # 获取ECS的插件
  - tag: ecs_auto
    type: ecs
    args:
      auto: true
      force_overwrite: false
      
  # 指定ECS的插件
  - tag: ecs_global
    type: ecs
    args:
      auto: false
      ipv4: "168.95.1.0"
      ipv6: "2001:b000:168::"
      force_overwrite: false

  # 匹配ECS的插件
  - tag: ecs_is_lan
    type: query_matcher
    args:
      ecs: 
        - "0.0.0.0/8"
        - "10.0.0.0/8"
        - "100.64.0.0/10"
        - "127.0.0.0/8"
        - "169.254.0.0/16"
        - "172.16.0.0/12"
        - "192.0.0.0/24"
        - "192.0.2.0/24"
        - "198.18.0.0/15"
        - "192.88.99.0/24"
        - "192.168.0.0/16"
        - "198.51.100.0/24"
        - "203.0.113.0/24"
        - "224.0.0.0/3"
        - "::1/128"
        - "fc00::/7"
        - "fe80::/10"
  - tag: ecs_is_cn
    type: query_matcher
    args:
      ecs: 
        - "provider:chinaip"

  # 调整TTL的插件
  # [1m|5m|1h]
  - tag: ttl_1m
    type: ttl
    args:
      minimal_ttl: 60
      maximum_ttl: 3600
  - tag: ttl_5m
    type: ttl
    args:
      minimal_ttl: 300
      maximum_ttl: 86400
  - tag: ttl_1h
    type: ttl
    args:
      minimal_ttl: 3600
      maximum_ttl: 86400

  # 匹配TYPE12类型请求的插件
  - tag: qtype12
    type: query_matcher
    args:
      qtype: [12]

  # 匹配TYPE65类型请求的插件
  - tag: qtype65
    type: query_matcher
    args:
      qtype: [65]

  # 匹配TYPE255类型请求的插件
  - tag: qtype255
    type: query_matcher
    args:
      qtype: [255]

  # 匹配RCODE2的插件
  - tag: response_server_failed
    type: response_matcher
    args:
      rcode: [2]

  # 屏蔽请求的插件
  - tag: black_hole
    type: blackhole
    args:
      rcode: 0
      ipv4: "0.0.0.0"
      ipv6: "::"

  # 匹配无效域名的插件
  - tag: query_is_non_domain
    type: query_matcher
    args:
      domain:
        - "keyword::"

  # 匹配本地域名的插件
  - tag: query_is_local_domain
    type: query_matcher
    args:
      domain:
        - "provider:chinalist"

  # 匹配污染域名的插件
  - tag: query_is_non_local_domain
    type: query_matcher
    args:
      domain:
        - "provider:gfwlist"

  # 匹配CDN域名的插件
  - tag: query_is_cdn_cn_domain
    type: query_matcher
    args:
      domain:
        - "provider:cdncn"

  # 匹配广告域名的插件
  - tag: query_is_ad_domain
    type: query_matcher
    args:
      domain:
        - "provider:adlist"

  # 匹配强制本地解析域名的插件
  - tag: query_is_cn_domain
    type: query_matcher
    args:
      domain:
        - "provider:ecscn"

  # 匹配强制非本地解析域名的插件
  - tag: query_is_noncn_domain
    type: query_matcher
    args:
      domain:
        - "provider:ecsnoncn"

  # 匹配本地IP的插件
  - tag: response_has_local_ip
    type: response_matcher
    args:
      ip:
        - "provider:chinaip"

  # 匹配污染IP的插件
  - tag: response_has_gfw_ip
    type: response_matcher
    args:
      ip:
        - "provider:gfwip"

  # 转发至本地服务器的插件
  - tag: forward_local
    type: fast_forward
    args:
      upstream:
        - addr: "223.5.5.5"
        - addr: "tls://120.53.53.53:853"
          enable_pipeline: true

  # 转发至远程服务器的插件
  - tag: forward_remote
    type: fast_forward
    args:
      upstream:
        - addr: "tcp://208.67.220.220:5353"
          enable_pipeline: true
          #socks5: "127.0.0.1:1080"
        - addr: "tls://8.8.4.4"
          enable_pipeline: true
          #socks5: "127.0.0.1:1080"

  # 转发至分流服务器的插件
  - tag: forward_easymosdns
    type: fast_forward
    args:
      upstream:
        - addr: "https://doh.apad.pro/dns-query"
          bootstrap: "119.29.29.29"
          #dial_addr: "ip:port"
          #enable_http3: true

  # 主要的运行逻辑插件
  # sequence 插件中调用的插件 tag 必须在 sequence 前定义
  # 否则 sequence 找不到对应插件
  - tag: main_sequence
    type: sequence
    args:
      exec:
        # 域名映射IP
        - hosts

        # 屏蔽TYPE65与无效类型请求
        - if: "[qtype65] || (query_is_non_domain)"
          exec:
            - _new_nxdomain_response
            - _return

        # 优化PRT与ANY类型请求
        - if: "[qtype12] || [qtype255]"
          exec:
            - _no_ecs
            - forward_local
            - ttl_1h
            - _return

        # 缓存ECS
        - ecs_auto
        - _edns0_filter_ecs_only
        - if: ecs_is_lan
          exec:
            - cache_lan
            - _no_ecs
          else_exec:
            - cache_wan

        # 强制用本地服务器解析
        - if: query_is_cn_domain
          exec:
            - forward_local
            - ttl_5m
            - _return

        # 强制用非本地服务器解析
        - if: query_is_noncn_domain
          exec:
            # 优先返回ipv4结果
            - _prefer_ipv4
            - ecs_global
            - primary:
                # 默认用分流服务器
                - forward_easymosdns
              secondary:
                # 超时用远程服务器
                - forward_remote
              fast_fallback: 2500
              always_standby: false
            - ttl_5m
            - _return

        # 屏蔽广告域名
        - if: query_is_ad_domain
          exec:
          - black_hole
          - ttl_1h
          - _return

        # 已知的本地域名或CDN域名用本地服务器解析
        - if: "(query_is_local_domain) || (query_is_cdn_cn_domain)"
          exec:
            - primary:
                # 默认用本地服务器
                - forward_local
                - ttl_1m
              secondary:
                # 超时用分流服务器
                - forward_easymosdns
                - ttl_5m
              fast_fallback: 25
              always_standby: false
            # 预防已知的本地域名临时污染
            - if: "(! response_has_gfw_ip)"
              exec:
                - _return

        # 已知的污染域名用分流服务器或远程服务器解析
        - if: query_is_non_local_domain
          exec:
            # 优先返回ipv4结果
            - _prefer_ipv4
            - ecs_global
            - primary:
                # 默认用分流服务器
                - forward_easymosdns
              secondary:
                # 超时用远程服务器
                - forward_remote
              fast_fallback: 2500
              always_standby: false
            - ttl_5m
            - _return

        # 剩下的未知域名用IP分流
        # 优先返回ipv4结果
        - _prefer_ipv4
        - primary:
            # 默认用分流服务器
            - forward_easymosdns
            - if: response_server_failed
              exec:
                - forward_local
                - _return
            - ecs_global
            - if: "(! ecs_is_cn) && (! response_has_local_ip) && [_response_valid_answer]"
              exec:
                - forward_easymosdns
          secondary:
            # 超时用本地分流器
            - forward_remote
            - if: response_has_local_ip
              exec:
                - forward_local
                - _return
            - ecs_global
            - if: "(! ecs_is_cn) && [_response_valid_answer]"
              exec:
                - forward_remote
          fast_fallback: 2500
          always_standby: false
        - ttl_5m

servers:
  - exec: main_sequence
    timeout: 6
    listeners:
      - protocol: udp
        addr: "0.0.0.0:53"
      - protocol: tcp
        addr: "0.0.0.0:53"
      #- protocol: http
      #  addr: "127.0.0.1:9053"
      #  url_path: "/dns-query"
      #  get_user_ip_from_header: "X-Forwarded-For"
      #- protocol: tls             
      #  addr: "0.0.0.0:853"
      #  cert: "/etc/mosdns/yourdomain.cert"  # TLS 所需证书文件。
      #  key: "/etc/mosdns/yourdomain.key"    # TLS 所需密钥文件。

#api:
#    http: "127.0.0.1:9080"

mosdns 的 log 记录

2024-03-20T13:57:26.474Z        INFO    working directory changed       {"path": "/etc/mosdns"}
Error: fail to load config, failed to unmarshal config: 1 error(s) decoding:

* '' has invalid keys: data_providers, servers
2024-03-20T13:57:26.478Z        FATAL   fail to load config, failed to unmarshal config: 1 error(s) decoding:

* '' has invalid keys: data_providers, servers
@chaohua27
Copy link

open /etc/mosdns/hosts: no such file or directory

@bao3
Copy link

bao3 commented Aug 2, 2024

在提交之前,请确认

  • 我已经尝试搜索过 Issue ,但没有找到相关问题。
  • 我正在使用最新的 mosdns 版本(或者最新的 commit),问题依旧存在。
  • 我仔细看过 wiki 后仍然无法自行解决该问题。
  • 我非常确定这是 mosdns 核心的问题。(如果是通过第三方衍生软件使用 mosdns 核心,不确定问题源头时,请先向衍生软件开发者提交问题。)

mosdns 版本

几乎最新版本

操作系统

ubuntu

Bug 描述和复现步骤

2024-03-20T13:57:26.474Z INFO working directory changed {"path": "/etc/mosdns"} Error: fail to load config, failed to unmarshal config: 1 error(s) decoding:

  • '' has invalid keys: data_providers, servers
    2024-03-20T13:57:26.478Z FATAL fail to load config, failed to unmarshal config: 1 error(s) decoding:
  • '' has invalid keys: data_providers, servers
    2024-03-20T14:05:57.139Z INFO working directory changed {"path": "/etc/mosdns"}
    2024-03-20T14:05:57.142Z INFO main config loaded {"file": "/etc/mosdns/config.yaml"}
    Error: failed to init plugin [BUG]OpenWrt 服务脚本不能启动程序 #4 hosts, failed to init plugin: failed to read file #0 /etc/mosdns/hosts, open /etc/mosdns/hosts: no such file or directory
    2024-03-20T14:05:57.144Z FATAL failed to init plugin [BUG]OpenWrt 服务脚本不能启动程序 #4 hosts, failed to init plugin: failed to read file #0 /etc/mosdns/hosts, open /etc/mosdns/hosts: no such file or directory
    2024-03-20T14:15:23.744Z INFO working directory changed {"path": "/etc/mosdns"}
    2024-03-20T14:15:23.747Z INFO main config loaded {"file": "/etc/mosdns/config.yaml"}
    2024-03-20T14:17:45.469Z INFO working directory changed {"path": "/etc/mosdns"}
    2024-03-20T14:17:45.471Z INFO main config loaded {"file": "/etc/mosdns/config.yaml"}

使用的配置文件

# EasyMosdns v3.0(Final Release)
# https://apad.pro/easymosdns
log:
    file: "./mosdns.log"
    level: error

data_providers:
  - tag: chinalist
    file: ./rules/china_domain_list.txt
    auto_reload: true
  - tag: gfwlist
    file: ./rules/gfw_domain_list.txt
    auto_reload: true
  - tag: cdncn
    file: ./rules/cdn_domain_list.txt
    auto_reload: true
  - tag: chinaip
    file: ./rules/china_ip_list.txt
    auto_reload: true
  - tag: gfwip
    file: ./rules/gfw_ip_list.txt
    auto_reload: true
  - tag: adlist
    file: ./rules/ad_domain_list.txt
    auto_reload: true
  - tag: ecscn
    file: ./ecs_cn_domain.txt
    auto_reload: true
  - tag: ecsnoncn
    file: ./ecs_noncn_domain.txt
    auto_reload: true
  - tag: hosts
    file: ./hosts.txt
    auto_reload: true

plugins:
  # 缓存的插件
  # [lan|wan]
  - tag: cache_lan
    type: cache
    args:
      size: 8192
      #redis: "redis://127.0.0.1:6379/0"
      lazy_cache_ttl: 86400
      cache_everything: true
      lazy_cache_reply_ttl: 1
  - tag: cache_wan
    type: cache
    args:
      size: 131072
      compress_resp: true
      #redis: "redis://127.0.0.1:6379/0"
      lazy_cache_ttl: 86400
      cache_everything: true
      lazy_cache_reply_ttl: 5

  # Hosts的插件
  - tag: hosts
    type: hosts
    args:
      hosts:
        - "provider:hosts"

  # 获取ECS的插件
  - tag: ecs_auto
    type: ecs
    args:
      auto: true
      force_overwrite: false
      
  # 指定ECS的插件
  - tag: ecs_global
    type: ecs
    args:
      auto: false
      ipv4: "168.95.1.0"
      ipv6: "2001:b000:168::"
      force_overwrite: false

  # 匹配ECS的插件
  - tag: ecs_is_lan
    type: query_matcher
    args:
      ecs: 
        - "0.0.0.0/8"
        - "10.0.0.0/8"
        - "100.64.0.0/10"
        - "127.0.0.0/8"
        - "169.254.0.0/16"
        - "172.16.0.0/12"
        - "192.0.0.0/24"
        - "192.0.2.0/24"
        - "198.18.0.0/15"
        - "192.88.99.0/24"
        - "192.168.0.0/16"
        - "198.51.100.0/24"
        - "203.0.113.0/24"
        - "224.0.0.0/3"
        - "::1/128"
        - "fc00::/7"
        - "fe80::/10"
  - tag: ecs_is_cn
    type: query_matcher
    args:
      ecs: 
        - "provider:chinaip"

  # 调整TTL的插件
  # [1m|5m|1h]
  - tag: ttl_1m
    type: ttl
    args:
      minimal_ttl: 60
      maximum_ttl: 3600
  - tag: ttl_5m
    type: ttl
    args:
      minimal_ttl: 300
      maximum_ttl: 86400
  - tag: ttl_1h
    type: ttl
    args:
      minimal_ttl: 3600
      maximum_ttl: 86400

  # 匹配TYPE12类型请求的插件
  - tag: qtype12
    type: query_matcher
    args:
      qtype: [12]

  # 匹配TYPE65类型请求的插件
  - tag: qtype65
    type: query_matcher
    args:
      qtype: [65]

  # 匹配TYPE255类型请求的插件
  - tag: qtype255
    type: query_matcher
    args:
      qtype: [255]

  # 匹配RCODE2的插件
  - tag: response_server_failed
    type: response_matcher
    args:
      rcode: [2]

  # 屏蔽请求的插件
  - tag: black_hole
    type: blackhole
    args:
      rcode: 0
      ipv4: "0.0.0.0"
      ipv6: "::"

  # 匹配无效域名的插件
  - tag: query_is_non_domain
    type: query_matcher
    args:
      domain:
        - "keyword::"

  # 匹配本地域名的插件
  - tag: query_is_local_domain
    type: query_matcher
    args:
      domain:
        - "provider:chinalist"

  # 匹配污染域名的插件
  - tag: query_is_non_local_domain
    type: query_matcher
    args:
      domain:
        - "provider:gfwlist"

  # 匹配CDN域名的插件
  - tag: query_is_cdn_cn_domain
    type: query_matcher
    args:
      domain:
        - "provider:cdncn"

  # 匹配广告域名的插件
  - tag: query_is_ad_domain
    type: query_matcher
    args:
      domain:
        - "provider:adlist"

  # 匹配强制本地解析域名的插件
  - tag: query_is_cn_domain
    type: query_matcher
    args:
      domain:
        - "provider:ecscn"

  # 匹配强制非本地解析域名的插件
  - tag: query_is_noncn_domain
    type: query_matcher
    args:
      domain:
        - "provider:ecsnoncn"

  # 匹配本地IP的插件
  - tag: response_has_local_ip
    type: response_matcher
    args:
      ip:
        - "provider:chinaip"

  # 匹配污染IP的插件
  - tag: response_has_gfw_ip
    type: response_matcher
    args:
      ip:
        - "provider:gfwip"

  # 转发至本地服务器的插件
  - tag: forward_local
    type: fast_forward
    args:
      upstream:
        - addr: "223.5.5.5"
        - addr: "tls://120.53.53.53:853"
          enable_pipeline: true

  # 转发至远程服务器的插件
  - tag: forward_remote
    type: fast_forward
    args:
      upstream:
        - addr: "tcp://208.67.220.220:5353"
          enable_pipeline: true
          #socks5: "127.0.0.1:1080"
        - addr: "tls://8.8.4.4"
          enable_pipeline: true
          #socks5: "127.0.0.1:1080"

  # 转发至分流服务器的插件
  - tag: forward_easymosdns
    type: fast_forward
    args:
      upstream:
        - addr: "https://doh.apad.pro/dns-query"
          bootstrap: "119.29.29.29"
          #dial_addr: "ip:port"
          #enable_http3: true

  # 主要的运行逻辑插件
  # sequence 插件中调用的插件 tag 必须在 sequence 前定义
  # 否则 sequence 找不到对应插件
  - tag: main_sequence
    type: sequence
    args:
      exec:
        # 域名映射IP
        - hosts

        # 屏蔽TYPE65与无效类型请求
        - if: "[qtype65] || (query_is_non_domain)"
          exec:
            - _new_nxdomain_response
            - _return

        # 优化PRT与ANY类型请求
        - if: "[qtype12] || [qtype255]"
          exec:
            - _no_ecs
            - forward_local
            - ttl_1h
            - _return

        # 缓存ECS
        - ecs_auto
        - _edns0_filter_ecs_only
        - if: ecs_is_lan
          exec:
            - cache_lan
            - _no_ecs
          else_exec:
            - cache_wan

        # 强制用本地服务器解析
        - if: query_is_cn_domain
          exec:
            - forward_local
            - ttl_5m
            - _return

        # 强制用非本地服务器解析
        - if: query_is_noncn_domain
          exec:
            # 优先返回ipv4结果
            - _prefer_ipv4
            - ecs_global
            - primary:
                # 默认用分流服务器
                - forward_easymosdns
              secondary:
                # 超时用远程服务器
                - forward_remote
              fast_fallback: 2500
              always_standby: false
            - ttl_5m
            - _return

        # 屏蔽广告域名
        - if: query_is_ad_domain
          exec:
          - black_hole
          - ttl_1h
          - _return

        # 已知的本地域名或CDN域名用本地服务器解析
        - if: "(query_is_local_domain) || (query_is_cdn_cn_domain)"
          exec:
            - primary:
                # 默认用本地服务器
                - forward_local
                - ttl_1m
              secondary:
                # 超时用分流服务器
                - forward_easymosdns
                - ttl_5m
              fast_fallback: 25
              always_standby: false
            # 预防已知的本地域名临时污染
            - if: "(! response_has_gfw_ip)"
              exec:
                - _return

        # 已知的污染域名用分流服务器或远程服务器解析
        - if: query_is_non_local_domain
          exec:
            # 优先返回ipv4结果
            - _prefer_ipv4
            - ecs_global
            - primary:
                # 默认用分流服务器
                - forward_easymosdns
              secondary:
                # 超时用远程服务器
                - forward_remote
              fast_fallback: 2500
              always_standby: false
            - ttl_5m
            - _return

        # 剩下的未知域名用IP分流
        # 优先返回ipv4结果
        - _prefer_ipv4
        - primary:
            # 默认用分流服务器
            - forward_easymosdns
            - if: response_server_failed
              exec:
                - forward_local
                - _return
            - ecs_global
            - if: "(! ecs_is_cn) && (! response_has_local_ip) && [_response_valid_answer]"
              exec:
                - forward_easymosdns
          secondary:
            # 超时用本地分流器
            - forward_remote
            - if: response_has_local_ip
              exec:
                - forward_local
                - _return
            - ecs_global
            - if: "(! ecs_is_cn) && [_response_valid_answer]"
              exec:
                - forward_remote
          fast_fallback: 2500
          always_standby: false
        - ttl_5m

servers:
  - exec: main_sequence
    timeout: 6
    listeners:
      - protocol: udp
        addr: "0.0.0.0:53"
      - protocol: tcp
        addr: "0.0.0.0:53"
      #- protocol: http
      #  addr: "127.0.0.1:9053"
      #  url_path: "/dns-query"
      #  get_user_ip_from_header: "X-Forwarded-For"
      #- protocol: tls             
      #  addr: "0.0.0.0:853"
      #  cert: "/etc/mosdns/yourdomain.cert"  # TLS 所需证书文件。
      #  key: "/etc/mosdns/yourdomain.key"    # TLS 所需密钥文件。

#api:
#    http: "127.0.0.1:9080"

mosdns 的 log 记录

2024-03-20T13:57:26.474Z        INFO    working directory changed       {"path": "/etc/mosdns"}
Error: fail to load config, failed to unmarshal config: 1 error(s) decoding:

* '' has invalid keys: data_providers, servers
2024-03-20T13:57:26.478Z        FATAL   fail to load config, failed to unmarshal config: 1 error(s) decoding:

* '' has invalid keys: data_providers, servers

I had the same issue in version 5.3.1

@chaohua27
Copy link

在提交之前,请确认

  • 我已经尝试搜索过 Issue ,但没有找到相关问题。
  • 我正在使用最新的 mosdns 版本(或者最新的 commit),问题依旧存在。
  • 我仔细看过 wiki 后仍然无法自行解决该问题。
  • 我非常确定这是 mosdns 核心的问题。(如果是通过第三方衍生软件使用 mosdns 核心,不确定问题源头时,请先向衍生软件开发者提交问题。)

mosdns 版本

几乎最新版本

操作系统

ubuntu

Bug 描述和复现步骤

2024-03-20T13:57:26.474Z INFO working directory changed {"path": "/etc/mosdns"} Error: fail to load config, failed to unmarshal config: 1 error(s) decoding:

  • '' has invalid keys: data_providers, servers
    2024-03-20T13:57:26.478Z FATAL fail to load config, failed to unmarshal config: 1 error(s) decoding:
  • '' has invalid keys: data_providers, servers
    2024-03-20T14:05:57.139Z INFO working directory changed {"path": "/etc/mosdns"}
    2024-03-20T14:05:57.142Z INFO main config loaded {"file": "/etc/mosdns/config.yaml"}
    Error: failed to init plugin [BUG]OpenWrt 服务脚本不能启动程序 #4 hosts, failed to init plugin: failed to read file #0 /etc/mosdns/hosts, open /etc/mosdns/hosts: no such file or directory
    2024-03-20T14:05:57.144Z FATAL failed to init plugin [BUG]OpenWrt 服务脚本不能启动程序 #4 hosts, failed to init plugin: failed to read file #0 /etc/mosdns/hosts, open /etc/mosdns/hosts: no such file or directory
    2024-03-20T14:15:23.744Z INFO working directory changed {"path": "/etc/mosdns"}
    2024-03-20T14:15:23.747Z INFO main config loaded {"file": "/etc/mosdns/config.yaml"}
    2024-03-20T14:17:45.469Z INFO working directory changed {"path": "/etc/mosdns"}
    2024-03-20T14:17:45.471Z INFO main config loaded {"file": "/etc/mosdns/config.yaml"}

使用的配置文件

# EasyMosdns v3.0(Final Release)
# https://apad.pro/easymosdns
log:
    file: "./mosdns.log"
    level: error

data_providers:
  - tag: chinalist
    file: ./rules/china_domain_list.txt
    auto_reload: true
  - tag: gfwlist
    file: ./rules/gfw_domain_list.txt
    auto_reload: true
  - tag: cdncn
    file: ./rules/cdn_domain_list.txt
    auto_reload: true
  - tag: chinaip
    file: ./rules/china_ip_list.txt
    auto_reload: true
  - tag: gfwip
    file: ./rules/gfw_ip_list.txt
    auto_reload: true
  - tag: adlist
    file: ./rules/ad_domain_list.txt
    auto_reload: true
  - tag: ecscn
    file: ./ecs_cn_domain.txt
    auto_reload: true
  - tag: ecsnoncn
    file: ./ecs_noncn_domain.txt
    auto_reload: true
  - tag: hosts
    file: ./hosts.txt
    auto_reload: true

plugins:
  # 缓存的插件
  # [lan|wan]
  - tag: cache_lan
    type: cache
    args:
      size: 8192
      #redis: "redis://127.0.0.1:6379/0"
      lazy_cache_ttl: 86400
      cache_everything: true
      lazy_cache_reply_ttl: 1
  - tag: cache_wan
    type: cache
    args:
      size: 131072
      compress_resp: true
      #redis: "redis://127.0.0.1:6379/0"
      lazy_cache_ttl: 86400
      cache_everything: true
      lazy_cache_reply_ttl: 5

  # Hosts的插件
  - tag: hosts
    type: hosts
    args:
      hosts:
        - "provider:hosts"

  # 获取ECS的插件
  - tag: ecs_auto
    type: ecs
    args:
      auto: true
      force_overwrite: false
      
  # 指定ECS的插件
  - tag: ecs_global
    type: ecs
    args:
      auto: false
      ipv4: "168.95.1.0"
      ipv6: "2001:b000:168::"
      force_overwrite: false

  # 匹配ECS的插件
  - tag: ecs_is_lan
    type: query_matcher
    args:
      ecs: 
        - "0.0.0.0/8"
        - "10.0.0.0/8"
        - "100.64.0.0/10"
        - "127.0.0.0/8"
        - "169.254.0.0/16"
        - "172.16.0.0/12"
        - "192.0.0.0/24"
        - "192.0.2.0/24"
        - "198.18.0.0/15"
        - "192.88.99.0/24"
        - "192.168.0.0/16"
        - "198.51.100.0/24"
        - "203.0.113.0/24"
        - "224.0.0.0/3"
        - "::1/128"
        - "fc00::/7"
        - "fe80::/10"
  - tag: ecs_is_cn
    type: query_matcher
    args:
      ecs: 
        - "provider:chinaip"

  # 调整TTL的插件
  # [1m|5m|1h]
  - tag: ttl_1m
    type: ttl
    args:
      minimal_ttl: 60
      maximum_ttl: 3600
  - tag: ttl_5m
    type: ttl
    args:
      minimal_ttl: 300
      maximum_ttl: 86400
  - tag: ttl_1h
    type: ttl
    args:
      minimal_ttl: 3600
      maximum_ttl: 86400

  # 匹配TYPE12类型请求的插件
  - tag: qtype12
    type: query_matcher
    args:
      qtype: [12]

  # 匹配TYPE65类型请求的插件
  - tag: qtype65
    type: query_matcher
    args:
      qtype: [65]

  # 匹配TYPE255类型请求的插件
  - tag: qtype255
    type: query_matcher
    args:
      qtype: [255]

  # 匹配RCODE2的插件
  - tag: response_server_failed
    type: response_matcher
    args:
      rcode: [2]

  # 屏蔽请求的插件
  - tag: black_hole
    type: blackhole
    args:
      rcode: 0
      ipv4: "0.0.0.0"
      ipv6: "::"

  # 匹配无效域名的插件
  - tag: query_is_non_domain
    type: query_matcher
    args:
      domain:
        - "keyword::"

  # 匹配本地域名的插件
  - tag: query_is_local_domain
    type: query_matcher
    args:
      domain:
        - "provider:chinalist"

  # 匹配污染域名的插件
  - tag: query_is_non_local_domain
    type: query_matcher
    args:
      domain:
        - "provider:gfwlist"

  # 匹配CDN域名的插件
  - tag: query_is_cdn_cn_domain
    type: query_matcher
    args:
      domain:
        - "provider:cdncn"

  # 匹配广告域名的插件
  - tag: query_is_ad_domain
    type: query_matcher
    args:
      domain:
        - "provider:adlist"

  # 匹配强制本地解析域名的插件
  - tag: query_is_cn_domain
    type: query_matcher
    args:
      domain:
        - "provider:ecscn"

  # 匹配强制非本地解析域名的插件
  - tag: query_is_noncn_domain
    type: query_matcher
    args:
      domain:
        - "provider:ecsnoncn"

  # 匹配本地IP的插件
  - tag: response_has_local_ip
    type: response_matcher
    args:
      ip:
        - "provider:chinaip"

  # 匹配污染IP的插件
  - tag: response_has_gfw_ip
    type: response_matcher
    args:
      ip:
        - "provider:gfwip"

  # 转发至本地服务器的插件
  - tag: forward_local
    type: fast_forward
    args:
      upstream:
        - addr: "223.5.5.5"
        - addr: "tls://120.53.53.53:853"
          enable_pipeline: true

  # 转发至远程服务器的插件
  - tag: forward_remote
    type: fast_forward
    args:
      upstream:
        - addr: "tcp://208.67.220.220:5353"
          enable_pipeline: true
          #socks5: "127.0.0.1:1080"
        - addr: "tls://8.8.4.4"
          enable_pipeline: true
          #socks5: "127.0.0.1:1080"

  # 转发至分流服务器的插件
  - tag: forward_easymosdns
    type: fast_forward
    args:
      upstream:
        - addr: "https://doh.apad.pro/dns-query"
          bootstrap: "119.29.29.29"
          #dial_addr: "ip:port"
          #enable_http3: true

  # 主要的运行逻辑插件
  # sequence 插件中调用的插件 tag 必须在 sequence 前定义
  # 否则 sequence 找不到对应插件
  - tag: main_sequence
    type: sequence
    args:
      exec:
        # 域名映射IP
        - hosts

        # 屏蔽TYPE65与无效类型请求
        - if: "[qtype65] || (query_is_non_domain)"
          exec:
            - _new_nxdomain_response
            - _return

        # 优化PRT与ANY类型请求
        - if: "[qtype12] || [qtype255]"
          exec:
            - _no_ecs
            - forward_local
            - ttl_1h
            - _return

        # 缓存ECS
        - ecs_auto
        - _edns0_filter_ecs_only
        - if: ecs_is_lan
          exec:
            - cache_lan
            - _no_ecs
          else_exec:
            - cache_wan

        # 强制用本地服务器解析
        - if: query_is_cn_domain
          exec:
            - forward_local
            - ttl_5m
            - _return

        # 强制用非本地服务器解析
        - if: query_is_noncn_domain
          exec:
            # 优先返回ipv4结果
            - _prefer_ipv4
            - ecs_global
            - primary:
                # 默认用分流服务器
                - forward_easymosdns
              secondary:
                # 超时用远程服务器
                - forward_remote
              fast_fallback: 2500
              always_standby: false
            - ttl_5m
            - _return

        # 屏蔽广告域名
        - if: query_is_ad_domain
          exec:
          - black_hole
          - ttl_1h
          - _return

        # 已知的本地域名或CDN域名用本地服务器解析
        - if: "(query_is_local_domain) || (query_is_cdn_cn_domain)"
          exec:
            - primary:
                # 默认用本地服务器
                - forward_local
                - ttl_1m
              secondary:
                # 超时用分流服务器
                - forward_easymosdns
                - ttl_5m
              fast_fallback: 25
              always_standby: false
            # 预防已知的本地域名临时污染
            - if: "(! response_has_gfw_ip)"
              exec:
                - _return

        # 已知的污染域名用分流服务器或远程服务器解析
        - if: query_is_non_local_domain
          exec:
            # 优先返回ipv4结果
            - _prefer_ipv4
            - ecs_global
            - primary:
                # 默认用分流服务器
                - forward_easymosdns
              secondary:
                # 超时用远程服务器
                - forward_remote
              fast_fallback: 2500
              always_standby: false
            - ttl_5m
            - _return

        # 剩下的未知域名用IP分流
        # 优先返回ipv4结果
        - _prefer_ipv4
        - primary:
            # 默认用分流服务器
            - forward_easymosdns
            - if: response_server_failed
              exec:
                - forward_local
                - _return
            - ecs_global
            - if: "(! ecs_is_cn) && (! response_has_local_ip) && [_response_valid_answer]"
              exec:
                - forward_easymosdns
          secondary:
            # 超时用本地分流器
            - forward_remote
            - if: response_has_local_ip
              exec:
                - forward_local
                - _return
            - ecs_global
            - if: "(! ecs_is_cn) && [_response_valid_answer]"
              exec:
                - forward_remote
          fast_fallback: 2500
          always_standby: false
        - ttl_5m

servers:
  - exec: main_sequence
    timeout: 6
    listeners:
      - protocol: udp
        addr: "0.0.0.0:53"
      - protocol: tcp
        addr: "0.0.0.0:53"
      #- protocol: http
      #  addr: "127.0.0.1:9053"
      #  url_path: "/dns-query"
      #  get_user_ip_from_header: "X-Forwarded-For"
      #- protocol: tls             
      #  addr: "0.0.0.0:853"
      #  cert: "/etc/mosdns/yourdomain.cert"  # TLS 所需证书文件。
      #  key: "/etc/mosdns/yourdomain.key"    # TLS 所需密钥文件。

#api:
#    http: "127.0.0.1:9080"

mosdns 的 log 记录

2024-03-20T13:57:26.474Z        INFO    working directory changed       {"path": "/etc/mosdns"}
Error: fail to load config, failed to unmarshal config: 1 error(s) decoding:

* '' has invalid keys: data_providers, servers
2024-03-20T13:57:26.478Z        FATAL   fail to load config, failed to unmarshal config: 1 error(s) decoding:

* '' has invalid keys: data_providers, servers

I had the same issue in version 5.3.1

报错提示已经很明显了“open /etc/mosdns/hosts: no such file or directory”,都不看日志或者前面我的回答的吗?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants