IrineSistiana / mosdns

一个 DNS 转发器
GNU General Public License v3.0
2.99k stars 339 forks source link

[Bug] netlink receive: no such file or directory #560

Closed chuntsky closed 1 year ago

chuntsky commented 1 year ago

在提交之前,请确认

mosdns 版本

V4.5.3

操作系统

OpenWrt 22.03.2

Bug 描述和复现步骤

我想使用 nftset 插件,访问特定网址时, 将应答 IP 写入 nftables

在main_sequence中

    - if: query_diyaccelerate  # 需要加速的
      exec:
        - _prefer_ipv4 # 优先 IPv4
        - ali # fake-ip
        - _setextGFW
        - _return

我有在 query_diyaccelerate 引用文件中定义一个域名:docker.io

最后,应答没有问题,添加 nftables 有报错,具体报错如下:

2022-11-29T22:20:28.361+0800 debug main_sequence.node_6.if condition matcher result {"query": "docker.io. IN A 54708 12 127.0.0.1", "result": true, "query_diyaccelerate": "true"} 2022-11-29T22:20:28.489+0800 warn _setextGFW failed to add elems to nftables {"query": "docker.io. IN A 54708 12 127.0.0.1", "error": "failed to add ipv4 elems [18.210.197.188/24 18.206.20.10/24 3.228.146.75/24]: failed to get set, Receive: netlink receive: no such file or directory"}

另外:我是下载 最新的 V4.5.3 mosdns-linux-arm64.zip 文件中的核心文件做的测试,问题是存在的。

使用的配置文件

log:
  level: info
  file: "/tmp/mosdns.log"

include: []

data_providers:
  - tag: geoip
    file: "/etc/mosdns/diy/geoip.dat"
    auto_reload: true

  - tag: geosite
    file: "/etc/mosdns/diy/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: hosts
    file: "/etc/mosdns/rule/hosts.txt"
    auto_reload: true

  - tag: redirect
    file: "/etc/mosdns/rule/redirect.txt"
    auto_reload: true

  - tag: diydirect
    file: "/etc/mosdns/diy/direct.txt"
    auto_reload: true

  - tag: diyaccelerate
    file: "/etc/mosdns/diy/accelerate.txt"
    auto_reload: true

################ 缓存等 #################
plugins:
  - tag: lazy_cache
    type: cache
    args:
      size: 200000
      lazy_cache_ttl: 259200

  - tag: modify_ttl
    type: ttl
    args:
      minimal_ttl: 0
      maximum_ttl: 0

################ DNS #################
  # 本地 dnscrypt-proxy 
  - tag: "dnscrypt"
    type: forward
    args:
      upstream:
        - addr: "127.0.0.53"

  # 本地 clashdns 
  - tag: "clashdns"
    type: forward
    args:
      upstream:
        - addr: "192.168.66.1:553"  

  - tag: "forward_local"
    type: fast_forward
    args:
      upstream:
        - addr: 119.29.29.29
        - addr: 114.114.114.114

  - tag: "forward_remote"
    type: fast_forward
    args:
      upstream:
        - addr: tls://8.8.8.8
        - addr: tls://1.1.1.1

  # 阿里 dns
  - tag: ali
    type: forward
    args:
      upstream:
        - addr: "https://dns.alidns.com/dns-query" # 服务器地址
          ip_addr: # 手动指定服务器的 IP 地址 可以配置多个
            - "2400:3200:baba::1"
            - "223.5.5.5"
            - "2400:3200::1"
            - "223.6.6.6"
          trusted: true # 是否是可信服务器
        - addr: "tls://dns.alidns.com" # 服务器地址
          ip_addr: # 手动指定服务器的 IP 地址 可以配置多个
            - "223.5.5.5"
            - "223.6.6.6"
          trusted: true # 是否是可信服务器

################  ipset #################
#  - tag: '_setdirect'
#    type: 'ipset'
#    args:
#      set_name4: 'directlist4'   # 将 ipv4 地址写入这个 set。这个 set 的 family 类型需为 `inet`。
#      set_name6: 'directlist6'   # 将 ipv6 地址写入这个 set。这个 set 的 family 类型需为 `inet6`。
#      mask4: 24        # 写入 ipv4 地址时使用的掩码。默认: 24。
#      mask6: 32        # 写入 ipv6 地址时使用的掩码。默认: 32。      
#  - tag: '_setextGFW'
#    type: 'ipset'
#    args:
#      set_name4: 'extGFW4'   # 将 ipv4 地址写入这个 set。这个 set 的 family 类型需为 `inet`。
#      set_name6: 'extGFW6'   # 将 ipv6 地址写入这个 set。这个 set 的 family 类型需为 `inet6`。
#      mask4: 24        # 写入 ipv4 地址时使用的掩码。默认: 24。
#      mask6: 32        # 写入 ipv6 地址时使用的掩码。默认: 32。  
################  nftset #################
  - tag: "_setextGFW"
    type: "nftset"
    args:
      table_family4: "inet" # 存 IPv4 地址的 table family 类型。
      table_family6: "inet" # 存 IPv6 地址的 table family 类型。
      table_name4: "proxy"   # 存 IPv4 地址 table 的名字。
      table_name6: "proxy"   # 存 IPv6 地址 table 的名字。
      set_name4: "extGFW4"     # 存 IPv4 set 的名字。
      set_name6: "extGFW6"     # 存 IPv6 set 的名字。
      mask4: 24       # 如果 set 带有 interval flag。写入 IPv4 地址时使用的掩码。默认: 24。
      mask6: 32       # 如果 set 带有 interval flag。写入 IPv6 地址时使用的掩码。默认: 32。

################ query_matcher #################
  # 查询 - gfw
  - tag: query_gfw
    type: query_matcher
    args:
      domain:
        - "provider:geosite:gfw"

  - tag: query_diydirect
    type: query_matcher
    args:
      domain:
        - "provider:diydirect"

  - tag: query_diyaccelerate
    type: query_matcher
    args:
      domain:
        - "provider:diyaccelerate"

  - 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_hosts_domain
    type: hosts
    args:
      hosts:
        - "provider:hosts"

  - tag: query_is_redirect_domain
    type: redirect
    args:
      rule:
        - "provider:redirect"

  - tag: query_is_local_domain
    type: query_matcher
    args:
      domain:
        - "provider:geosite:cn,icloud,tld-cn"

  - tag: query_is_non_local_domain
    type: query_matcher
    args:
      domain:
        - "provider:geosite:geolocation-!cn"

  - tag: response_has_local_ip
    type: response_matcher
    args:
      ip:
        - "provider:geoip:cn"

  - tag: query_is_ad_domain
    type: query_matcher
    args:
      domain:
        - "provider:geosite:category-ads-all"

  - tag: match_qtype65
    type: query_matcher
    args:
      qtype: [65]

  - tag: "main_sequence"
    type: "sequence"
    args:
      exec:
        - _misc_optm
        - query_is_hosts_domain
        - query_is_redirect_domain

        - if: query_is_whitelist_domain
          exec:
            - ali
            - modify_ttl
            - _return

        #- if: "query_is_blocklist_domain || query_is_ad_domain || match_qtype65"
        #  exec:
        #    - _new_nxdomain_response
        #    - _return

        - lazy_cache

        - if: query_gfw  # 已知的 gfw域名,或者需要加速的
          exec:
            - _prefer_ipv4 # 优先 IPv4
            - clashdns # fake-ip
            - _return

        - if: query_diyaccelerate  # 已知的 gfw域名,或者需要加速的
          exec:
            - _prefer_ipv4 # 优先 IPv4
            - ali # fake-ip
            - _setextGFW
            - _return

        - if: query_is_local_domain
          exec:
            - ali
            - modify_ttl
            - _return

        - if: query_is_non_local_domain
          exec:
            - _prefer_ipv4
            - forward_local
            - modify_ttl
            - _return
        - primary:
            - forward_local
            - if: "(! response_has_local_ip) && [_response_valid_answer]"
              exec:
                - _drop_response
          secondary:
            - _prefer_ipv4
            - ali
            - modify_ttl
          fast_fallback: 200

servers:
  - exec: main_sequence
    listeners:
      - addr: '[127.0.0.66]:53'
        protocol: udp
      - addr: '[127.0.0.66]:53'
        protocol: tcp

mosdns 的 log 记录

2022-11-29T22:20:28.360+0800    debug   lazy_cache  cache miss  {"query": "docker.io. IN A 54708 12 127.0.0.1"}
2022-11-29T22:20:28.361+0800    debug   main_sequence.node_5.if condition matcher result    {"query": "docker.io. IN A 54708 12 127.0.0.1", "result": false, "query_gfw": "false"}
2022-11-29T22:20:28.361+0800    debug   main_sequence.node_6.if condition matcher result    {"query": "docker.io. IN A 54708 12 127.0.0.1", "result": true, "query_diyaccelerate": "true"}
2022-11-29T22:20:28.489+0800    warn    _setextGFW  failed to add elems to nftables {"query": "docker.io. IN A 54708 12 127.0.0.1", "error": "failed to add ipv4 elems [18.210.197.188/24 18.206.20.10/24 3.228.146.75/24]: failed to get set, Receive: netlink receive: no such file or directory"}
2022-11-29T22:20:28.489+0800    debug   entry returned  {"query": "docker.io. IN A 54708 12 127.0.0.1"}
urlesistiana commented 1 year ago

failed to get set, Receive: netlink receive: no such file or directory

= 内核没找到这个 set = 你配置的 set 类别或路径或名字不对

chuntsky commented 1 year ago

嗯,你提醒的对;

问题在 table_family4 ,我应该是 定义为:table_family4: "ip"

因为 我在创建表的时候 nft 表的时候没有指定类型,默认创建的是 ip 。

谢谢!