# Table of Contents - [mosdns wiki | mosdns-wiki-zh](#mosdns-wiki-mosdns-wiki-zh) - [服务器插件 | mosdns-wiki-zh](#-mosdns-wiki-zh) - [mosdns v5 | mosdns-wiki-zh](#mosdns-v5-mosdns-wiki-zh) - [如何配置 mosdns | mosdns-wiki-zh](#-mosdns-mosdns-wiki-zh) - [数据插件 | mosdns-wiki-zh](#-mosdns-wiki-zh) - [可执行插件 | mosdns-wiki-zh](#-mosdns-wiki-zh) - [域名匹配规则 | mosdns-wiki-zh](#-mosdns-wiki-zh) - [Sequence 插件 | mosdns-wiki-zh](#sequence-mosdns-wiki-zh) - [Debug 内存与性能问题 | mosdns-wiki-zh](#debug-mosdns-wiki-zh) - [如何编写新插件 | mosdns-wiki-zh](#-mosdns-wiki-zh) - [API 说明 | mosdns-wiki-zh](#api-mosdns-wiki-zh) - [Debug 内存与性能问题 | mosdns-wiki-zh](#debug-mosdns-wiki-zh) - [mosdns v4 | mosdns-wiki-zh](#mosdns-v4-mosdns-wiki-zh) - [如何编写新插件 | mosdns-wiki-zh](#-mosdns-wiki-zh) - [API 说明 | mosdns-wiki-zh](#api-mosdns-wiki-zh) - [如何配置 mosdns | mosdns-wiki-zh](#-mosdns-mosdns-wiki-zh) - [插件及其参数 | mosdns-wiki-zh](#-mosdns-wiki-zh) --- # mosdns wiki | mosdns-wiki-zh 当前版本: [mosdns v5](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5) 老版本: * [mosdns v4](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4) v3 及以前版本的 wiki 因地球会绕太阳公转等不可抗因素已丢失。 有用的链接: * 源码: [https://github.com/IrineSistiana/mosdnsarrow-up-right](https://github.com/IrineSistiana/mosdns) * 下载预编译的可执行程序: [https://github.com/IrineSistiana/mosdns/releasesarrow-up-right](https://github.com/IrineSistiana/mosdns/releases) * Bug 反馈,功能建议 [https://github.com/IrineSistiana/mosdns/issuesarrow-up-right](https://github.com/IrineSistiana/mosdns/issues) * 配置讨论,分享等 [https://github.com/IrineSistiana/mosdns/discussionsarrow-up-right](https://github.com/IrineSistiana/mosdns/discussions) * docker 镜像 [https://hub.docker.com/r/irinesistiana/mosdnsarrow-up-right](https://hub.docker.com/r/irinesistiana/mosdns) 开源协议: [GPL-3.0 licensearrow-up-right](https://github.com/IrineSistiana/mosdns/blob/main/LICENSE) ,所有预编译可执行程序和 docker 镜像均在 Github actions 上构建。 Last updated 2 years ago This site uses cookies to deliver its service and to analyze traffic. By browsing this site, you accept the [privacy policy](https://www.google.com/policies/privacy/?hl=en-US) . close AcceptReject --- # 服务器插件 | mosdns-wiki-zh 服务器插件接收来自客户端的请求,转交给可执行插件处理。可执行插件生成应答对应的请求。服务器插件将应答返回客户端。 可执行插件列表见: [可执行插件chevron-right](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/ke-zhi-xing-cha-jian) 错误处理: 如果可执行插件抛出了错误,则服务器会返回 SEVFAIL 应答。 [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/fu-wu-qi-cha-jian#udp_server) udp\_server ------------------------------------------------------------------------------------------------------------------------------------- 初始化参数说明: Copy tag: "" type: "udp_server" args: entry: executable_tag # 可执行插件的 tag。 listen: 127.0.0.1:5353 # 监听地址。 [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/fu-wu-qi-cha-jian#tcp_server) tcp\_server ------------------------------------------------------------------------------------------------------------------------------------- 初始化参数说明: Copy tag: "" type: "tcp_server" args: entry: executable_tag # 可执行插件的 tag。 listen: 127.0.0.1:5353 # 监听地址。 cert: "./path/to/cert" # 配置 cert 和 key 后会启用 TLS (DoT)。 key: "./path/to/key" idle_timeout: 10 # 空连接超时。单位秒。默认 10。 (v5.3+) 监听地址以 @ 开头会监听 Unix abstract domain socket 。 [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/fu-wu-qi-cha-jian#quic_server) quic\_server --------------------------------------------------------------------------------------------------------------------------------------- (实验性) Copy tag: "" type: "quic_server" args: entry: executable_tag # 可执行插件的 tag。 listen: 127.0.0.1:853 # 监听地址。 cert: "./path/to/cert" key: "./path/to/key" idle_timeout: 30 # 空连接超时。单位秒。默认 30。 [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/fu-wu-qi-cha-jian#http_server) http\_server --------------------------------------------------------------------------------------------------------------------------------------- 初始化参数说明: Copy tag: "" type: "http_server" args: entries: # []extry - path: /dns-query # 本路径执行 exec: executable_tag # 可执行插件的 tag。 src_ip_header: "X-Forwarded-For" # 从 HTTP 头获取用户 IP。 listen: 127.0.0.1:443 # 监听地址。 cert: "./path/to/cert" # 留空 cert 和 key 后会禁用 TLS。 key: "./path/to/key" idle_timeout: 10 # 空连接超时。单位秒。默认 30。 (v5.3+) 监听地址以 @ 开头会监听 Unix abstract domain socket 。 Last updated 2 years ago --- # mosdns v5 | mosdns-wiki-zh 版本: v5.3 [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5#gong-neng-gai-shu) 功能概述 ---------------------------------------------------------------------------------------------- mosdns 是一个插件化的 DNS 转发器。用户可以按需定制自己的 DNS 处理逻辑。 mosdns 自带的功能: * 匹配器: * 匹配请求的特性。域名,类型,来源 IP 等。 * 匹配应答的特性。应答 IP,CNAME 等。 * 功能: * UDP, TCP, DoT, DoH(支持H3), DoQ 客户端和服务器。 * 缓存应答 (不支持 ECS)。 * 自动判断域名是否是双栈域名然后屏蔽 IPv4/6 请求,不会影响纯 IPv6/4 域名。 * 在请求上附加预设 ECS。 * 修改应答的 TTL。 * 为域名设定 IP。(hosts) * 返回包含特定 IP 应答。(blackhole) * 替换(重定向)请求的域名。请求域名 A,但返回域名 B 的记录。(redirect) * 手动构建包含任意记录的应答。(arbitrary) * 用 IP 反查经过 mosdns 处理的域名。可响应 PTR 请求,也可通过 HTTP 接口查询。(reverse\_lookup) * 动态路由: 将应答 IP 写入 ipset 和 nftables。 [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5#ru-he-pei-zhi) 如何配置 ------------------------------------------------------------------------------------------ 配置说明和示例,详见: [如何配置 mosdnschevron-right](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns) [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5#ru-he-shi-yong) 如何使用 ------------------------------------------------------------------------------------------- mosdns 只有一个二进制文件,命令行运行即可。 Copy mosdns start -c config_file -d working_dir​ mosdns 还附带一些常用小工具命令。 * probe 可以探测 TCP/TLS 服务器是否支持连接复用,pipeline 连接复用,空闲连接保持时间。 * config 可以生成 yaml 配置文件模板,转换配置文件格式。 * service 可以将 mosdns 安装成系统服务。 详见各个子命令的帮助。 Copy mosdns -h mosdns probe -h ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5#an-zhuang-zhi-xi-tong-fu-wu) 安装至系统服务 mosdns service 内置一个简单的系统服务管理工具。可将 mosdns 安装成系统服务实现自启。需要管理员或 root 权限。理论上可用于 Windows XP+, Linux/(systemd | Upstart | SysV), 和 OSX/Launchd 平台。Windows,Ubuntu,Debian 实测可用。Openwrt 不可用。 注意: 此功能是 [kardianos/servicearrow-up-right](https://github.com/kardianos/service) 实现的,mosdns 不保证其可用性。 Copy # 安装服务 mosdns service install -d 工作目录绝对路径 -c 配置文件路径 # 安装成功后手动运行服务。(服务仅设定为随系统自启,安装成功后并不会马上自动运行) mosdns service start # 卸载 mosdns service stop mosdns service uninstall [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5#geng-duo-gong-ju) 更多工具 --------------------------------------------------------------------------------------------- 开放列表,排名不分前后。欢迎提交 issue 编辑本列表。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5#openwrt) Openwrt 用于 Openwrt 系统的 mosdns。自带 Luci 管理界面。 [sbwml / luci-app-mosdnsarrow-up-right](https://github.com/sbwml/luci-app-mosdns) [QiuSimons/openwrt-mosarrow-up-right](https://github.com/QiuSimons/openwrt-mos) Last updated 2 years ago --- # 如何配置 mosdns | mosdns-wiki-zh [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns#ji-ben-pei-zhi-wen-jian-ge-shi) 基本配置文件格式 ------------------------------------------------------------------------------------------------------------------------------------ mosdns 的默认配置文件格式是 yaml,本 wiki 中所有示例均为 yaml 格式。 mosdns 也支持 JSON, TOML 格式的配置文件。mosdns 会根据配置文件后缀自动识别配置格式。 Copy # 日志设置 log: level: info # 日志级别。可选 "debug" "info" "warn" "error"。默认 "info"。 production: false # 纯 json 输出。 file: "/path/to/log/file" # (实验性) 记录日志到文件。默认输出至 stderr。 # 注意: 日志应由守护进程处理而不是直接写入文件。 # 此选项仅用于调试。panic 日志不会被记录,其内容仍会 # 输出至 stderr 。 # (实验性) API 入口设置 api: http: "127.0.0.1:8080" # 在该地址启动 api 接口。 # []string, 从其他配置文件载入 plugins 插件设置。 # include 的插件会比本配置文件中的插件先初始化。 include: [] # 插件设置 plugins: - tag: tag1 # 插件的 tag。由用户自由设定但不能重复。可省略。 type: type1 # 插件类型。详见下文。 args: # 插件参数。取决于插件类型。详见下文。 key1: value1 插件设置: 可用的插件类型 `type` 和其对应的 `args` 参数设置,详见 [服务器插件chevron-right](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/fu-wu-qi-cha-jian) [可执行插件chevron-right](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/ke-zhi-xing-cha-jian) [数据插件chevron-right](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/shu-ju-cha-jian) triangle-exclamation 标有 (**实验性**) 的功能和相关设置项不保证配置兼容性 (可能会在任何版本变化或者移除) 。 circle-exclamation mosdns 会按照配置文件中顺序将插件初始化。有些插件需要调用其他插件,比如 `sequence,其调用的插件必须在之前配置。否则会因为找不到插件而初始化失败。` API 说明详见 [API 说明chevron-right](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/api-shuo-ming) ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns#pei-zhi-shi-li) 配置示例 绝大多数 mosdns 的配置都遵循一个思路: * 用 [sequence](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian) 插件定义请求的处理流程。如何生成/屏蔽/获取应答等。 * 配置 [服务器插件](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/fu-wu-qi-cha-jian) 接受来自用户的请求。转给 sequence 插件处理。 chevron-right多功能转发器: 缓存加速,屏蔽广告。点击展开[hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns#duo-gong-neng-zhuan-fa-qi-huan-cun-jia-su-ping-bi-guang-gao-dian-ji-zhan-kai) 这个配置文件 * 有缓存,可加速域名解析速度。 * 会屏蔽广告域名。 * 将请求转发至 Google DoH 解析。 用户可以用 `sequence` 插件将多个插件按顺序组合,组成自己想要的运行逻辑。比如下文的配置利用 matches (匹配条件) 屏蔽广告域名。 示例中的广告列表 oisd\_dbl\_basic.txt 来自 [oisd.nlarrow-up-right](https://oisd.nl/) (官网首页)。下载地址: [https://dbl.oisd.nl/basic/arrow-up-right](https://dbl.oisd.nl/basic/) 。 使用 oisd 域名表仅以展示为目的。mosdns 的域名匹配器非常高效,即使载入并匹配百万域名的 oisd full 列表也不会影响匹配速度。(当然启动后会占更多内存,1w 条域名约占 1m 内存) Copy log: level: info plugins: - tag: main type: sequence args: - matches: # 如果 - qname &./oisd_dbl_basic.txt # 如果请求的域名在广告列表内。 exec: reject 3 # 执行 直接返回 NXDOMAIN(3) 屏蔽。 - exec: cache 1024 # 然后。查找 cache。 - matches: # 如果 - has_resp # 有应答了(上一步 cache 找到应答) exec: accept # 结束。 # 上一步没有找到缓存,就会到这一步,转发至 Google 获取应答。 - exec: forward https://8.8.8.8/dns-query # sequence 结束(被 reject,accept,或者运行到末尾)后就会返回调用者。在这个配置文件中 # 调用者是下面的服务器。服务器就会返回应答至客户端。 # 启动 udp 和 tcp 服务器。 - type: udp_server args: entry: main # 收到的请求会执行上面的逻辑 listen: 127.0.0.1:5533 - type: tcp_server args: entry: main listen: 127.0.0.1:5533 如果只需转发,无需其他功能,则可以让服务器插件直接将请求转交给 forward 插件。 chevron-right简单转发器: 将不加密的 DNS53 通过 DoH 转发。点击展开[hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns#jian-dan-zhuan-fa-qi-jiang-bu-jia-mi-de-dns53-tong-guo-doh-zhuan-fa-dian-ji-zhan-kai) Copy log: level: info plugins: # 转发至 Google 服务器的插件 - tag: forward_google type: forward args: upstreams: - addr: https://8.8.8.8/dns-query # 在同一端口启动 udp 和 tcp 服务器。 - type: udp_server args: entry: forward_google listen: 127.0.0.1:5533 - type: tcp_server args: entry: forward_google listen: 127.0.0.1:5533 Last updated 2 years ago --- # 数据插件 | mosdns-wiki-zh ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/shu-ju-cha-jian#domain_set) domain\_set 载入的域名表可供其他插件引用。 插件加载后,数据只占一份内存。引用的数据是共享的,多次被引用不会消耗格外内存。 初始化参数说明: Copy tag: "" type: "domain_set" args: exps: # 域名表达式。 - "google.com" - "regexp:.+\.google\.com$" files: # 从文本文件载入 - "./domain.txt" 域名表达式省略前缀默认为 `domain` 域匹配。详见 [域名匹配规则](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/shu-ju-cha-jian#yu-ming-pi-pei-gui-ze) 。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/shu-ju-cha-jian#ip_set) ip\_set 载入的 IP 表可供其他插件引用。插件加载后,数据只占一份内存。多次被引用,数据是共享的,不会消耗格外内存。 初始化参数说明: Copy tag: "" type: "ip_set" args: ips: # 可以是 IP 或 CIDR。 - "1.1.1.1" - "1.1.1.1/24" files: # 从文本文件载入 - "./ip.txt" Last updated 2 years ago --- # 可执行插件 | mosdns-wiki-zh ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/ke-zhi-xing-cha-jian#sequence) sequence 按顺序组合多个插件。 sequence 是个可执行插件。可以被其他插件(比如服务器插件)调用。sequence 与 sequence 联动请使用自带的跳转命令 (goto, jump ...),不要使用 exec 。 [Sequence 插件chevron-right](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian) ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/ke-zhi-xing-cha-jian#cache) cache 缓存 DNS 应答的插件。 如果请求命中缓存,则将缓存的应答放入请求。 当某一请求经过 cache 后,cache 会在这个请求处理流程结束时自动将应答放入缓存。用户无需介入。 注意: 本插件是本地缓存(适用于客户端或者局域网内的缓存)。不适用于服务器端缓存。不支持扩展 DNS 协议 (即 EDNS0),请求的 EDNS0 部分会被无视,应答的 EDNS0 会被略去。 初始化参数说明: Copy tag: "" type: "cache" args: size: 1024 # 内置内存缓存大小。单位: 条。默认: 1024。每个 cache 插件的内存缓存是独立的。 # (实验性) lazy cache 设定。lazy_cache_ttl > 0 会启用 lazy cache。 # 所有应答都会在缓存中存留 lazy_cache_ttl 秒,但自身的 TTL 仍然有效。如果命中过期的应答, # 则缓存会立即返回 TTL 为 5 的应答,然后自动在后台发送请求更新数据。 # 相比强行增加应答自身的 TTL 的方法,lazy cache 能提高命中率,同时还能保持一定的数据新鲜度。 lazy_cache_ttl: 0 # lazy cache 生存时间。单位: 秒。默认: 0 (禁用 lazy cache)。 # 建议值 86400(1天)~ 259200(3天) # (实验性) 将缓存保存在磁盘。插件启动时也会自动从该文件载入缓存。 # 缓存将在 mosdns 被关闭时保存。 dump_file: ./cache.dump # (实验性) 自动保存间隔。单位秒。默认 600。 # 如果距离上次 dump 有 1024 次更新,则自动保存。 dump_interval: 600 lazy cache,也叫“乐观缓存”,的优缺点: * 优点:可大幅提高缓存命中率。流行域名几乎 100% 命中。 * 缺点:可能影响 DNS 更新频繁的域名正常使用,比如 DDNS,CDN。 * 仅建议个人使用场景,有相关知识,了解其弊端的专业用户开启。 更多细节请参考 RFC 8767 。 Metrics 数据 `mosdns_cache_{tag=}`: * query\_total: 总请求数。 * hit\_total: 总命中数。(包括 lazy cache 的命中) * lazy\_hit\_total: lazy cache 总命中数 * cache\_size: 当前缓存大小。单位: 条。 API: * GET /flush 清空缓存 * GET /dump 下载缓存 * POST /load\_dump 载入缓存 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/ke-zhi-xing-cha-jian#hosts) hosts 域名映射 IP 。如果请求的域名在 hosts 内,则将应答放入请求。 初始化参数说明: Copy tag: "" type: "hosts" args: entries: # []string - "google.com 108.177.122.113" # 记录 files: # []string - "./hosts.txt" # 从外部文件载入。 circle-exclamation 虽然都叫 hosts,但本插件所用的格式和平常 Win,Linux 系统内的那个 hosts 文件不一样。 格式: * 域名规则在前,IP 在后。支持一行多个 IP,支持 IPv6。 * 如果域名匹配规则的方式被省略,则默认是 `full` 完整匹配。域名匹配规则详见 [这里](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/ke-zhi-xing-cha-jian#yu-ming-pi-pei-gui-ze) 。 格式示例: Copy # 支持一行多个 IP dns.google 8.8.8.8 2001:4860:4860::8888 ... ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/ke-zhi-xing-cha-jian#forward) forward 转发请求至上游服务器。获取应答后放入请求。 初始化参数说明: Copy tag: "" type: "forward" args: concurrent: 1 # 并发数。每次请求会从下面配置的 upstreams 里随机选取 # concurrent 个 upstreams 发送请求。取最快返回的应答。超过 3 最多选 # 3 个。默认 1 。 upstreams: # []upstream, 上游服务器。至少要配置一个。 - tag: google_doh addr: "https://dns.google/dns-query" dial_addr: "8.8.8.8" bootstrap: "8.8.8.8" bootstrap_version: 4 socks5: "127.0.0.1:1080" idle_timeout: 30 enable_pipeline: false enable_http3: false max_conns: 2 insecure_skip_verify: false so_mark: 0 bind_to_device: "" - addr: "tcp://8.8.8.8" enable_pipeline: true * `tag`: 本上游的 tag。用于标识和 log。可省略。同一插件内该 tag 必需唯一。建议全局唯一。 * `addr` 必需。服务器地址。格式: `[protocol://]host[:port][/path]` 。`protocol` 默认为 `udp` 。省略端口号会使用协议的默认值。 * 支持的 `protocol` 有: * `udp`: DNS over UDP 协议。`host` 必需为 IP。 * `tcp`: 基本 DNS over TCP 协议。`host` 必需为 IP。 * `tls`: 基本 DNS over TLS 协议。(RFC 7858) * `https`: 基本 DNS over HTTPS 协议。基于 HTTP/2 ,但为了兼容也支持 HTTP/1 。使用 GET 请求。(RFC 8484) * `quic`: DNS over QUIC 协议。 (RFC 9250) * 实际应用中,因为不应该让一个 DNS 解析系统依赖另一个 DNS 解析系统,因此 DNS 服务器的 IP 都是固定的。所以**服务器地址应优先使用 IP 地址而非域名**。这样插件连接服务器时无需先解析服务器的域名,能立刻建立连接。如果 `host` 必需包含域名 (比如一些 DoT/DoH 服务器可能要求请求必需包含 SNI 或 HTTP HOST 头),可以将 IP 填入 `dial_addr` 。更详细说明:插件会依次尝试从以下途径获取服务器域名的 IP 。 1. `dial_addr`: IP 协议层面建立连接时使用的地址。如果 `host` 是域名,此处填入 IP 可免去每次建立连接时解析服务器域名。支持指定端口号。 2. `bootstrap`: (实验性) 手动指定用于解析 `host` 域名的 bootstrap 服务器。只能是 UDP 服务器。不推荐使用此方式。bootstrap 仅适用于没有固定 IP 的服务器,比如自建服务器。`bootstrap_version` 设定 4 或 6 可控制解析 IP 的版本。默认 0 等于 4 。 3. 让系统去解析。注意: 此方式的解析时间插件不可控,可能影响性能。并且此时 mosdns 不能是系统的 DNS 服务器,否则会出现解析死循环。不推荐使用该方式。后续版本可能会禁止此方式。 * `socks5`: socks5 服务器地址。格式 `host:port`。数据将会通过该代理中转。暂不支持用户名密码认证。只支持基于 TCP 的协议。 * `idle_timeout` TCP/DoT/DoH 连接复用空连接保持时间。单位: 秒。默认 DoH/DoQ: 30 ,TCP/DoT: 10。一般不需要改。 * `enable_pipeline`: TCP/DoT 使用 RFC 7766 新的 query pipelining 连接复用模式。 * 启用后可大幅提高连接利用率,减少建立连接/握手的次数,进而降低响应延时。 * 并非所有服务器都支持。必须确定服务器支持后再启用该选项。 * Tips: 已知 Google 和 Cloudflare 的 TCP/DoT 是支持该模式的。知名的公共 DNS 服务商大多数都支持该模式。可以使用 `mosdns probe pipeline {tcp|tls}://server_ip[:port]` 测试命令测试服务器是否支持。比如 `mosdns probe pipeline tls://8.8.8.8` 。 * `enable_http3`: (实验性) DoH 使用 HTTP/3 连接服务器。 * 并非所有服务器都支持。必须确定服务器支持后再启用该选项。 * `max_conns`: 默认: 2。 * (5.3+) 已弃用。最大连接数量由插件自动控制。 * 启用了 query pipelining 模式的 TCP/DoT 协议: 最大连接数。大流量场景可适当调大。 * DoH 协议: HTTP 的最大连接数。HTTP/3 除外。大流量场景可适当调大。 * `insecure_skip_verify`: 禁用 TLS 服务器证书验证。 * Linux 套接字设定。需要 `CAP_NET_ADMIN` 权限 * `so_mark`: 设定 SO\_MARK。 * `bind_to_device`: 设定 SO\_BINDTODEVICE。 错误处理: 如果 forward 未能从上游获取应答 (连接失败,收到错误数据,等待应答超时等),则会抛出错误。 请注意: 来自服务器的 SEVFAIL 等应答属于正常的应答。不算错误。 sequence 中的调用参数: 指定上游进行转发。而非全部。 参数: `[upstream_tag] ...` metrics 数据: 设定了 `upstream.tag` 的上游会有 metrics 数据。 `mosdns_forward_{tag=, upstream=}` * query\_total 该上游总请求数。 * err\_total 该上游总出错数。(连接失败,无响应。不包括返回 SERVFAIL 的情况) * thread 该上游的线程数。(此时有多少请求正在被处理中) * response\_latency\_millisecond 该上游应答返回的延时。 * 底层连接 (HTTP3 无该数据): * conn\_opened\_total 该上游打开的连接数。 * conn\_closed\_total 该上游已关闭的连接数。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/ke-zhi-xing-cha-jian#redirect) redirect (实验性插件) 替换(重定向)请求的域名。请求域名 A,但返回域名 B 的记录。 注意: 没有能完美替换请求域名的方法。本插件的替换方式是插入一条 CNAME 。对于常见的 A,AAAA,TXT 等仅依赖 QUESTION 和 ANSWER 的请求是有效的。但不保证兼容其他类型请求以及各种 EDNS0 扩展。 初始化参数说明: Copy tag: "" type: "redirect" args: rules: # 格式 [域名匹配规则] [重定向至域名] - www.google.com dns.google files: # 从文件载入规则 - ./rediect.txt * `域名匹配规则`: 如果匹配方式被省略,则默认是 `full` 完整匹配。域名匹配方式详见 [域名匹配规则](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/ke-zhi-xing-cha-jian#yu-ming-pi-pei-gui-ze) 。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/ke-zhi-xing-cha-jian#arbitrary) arbitrary (实验性) arbitrary 可以载入任意 zone file (RFC 1035) 记录,并在匹配到对应请求时生成包含这些记录的应答。 初始化参数说明: Copy tag: "" type: "arbitrary" args: rules: - example.com. 300 IN A 192.0.2.1 - _sip._tcp.example.com. 86400 IN SRV 0 5 5060 sipserver.example.com. files: - ./arbitrary.txt 不同记录的文本格式请自行搜索。关键词: `<记录类型> dns record wikipedia`。在英文 wikipedia 可以直接找到绝大多数记录的格式。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/ke-zhi-xing-cha-jian#reverse_lookup) reverse\_lookup (实验性) 用 IP 反查域名。该插件会缓存应答中的 IP 与 域名的关系。支持 PTR 和 HTTP API。 如果是 PTR 请求,并且命中缓存,则生成应答。 初始化参数说明: Copy tag: "" type: "reverse_lookup" args: size: 65535 # 内置缓存大小。默认 65535。 # 缓存时间。秒。默认 7200 (2h)。应答记录的 TTL 也会被自动修改,限制在该值以下。 ttl: 7200 # 是否主动处理/响应 PTR 请求。如果 PTR 的 IP 命中缓存,则生成应答。 # 用途举例: 使用网络监视类工具查看网络连接时,开启域名反查功能大概率会看到 IP 对应的 # 真实域名(如果程序先请求域名再建立连接,而且域名经过了该插件处理。) handle_ptr: false 查找缓存中 IP 对应域名的 API:`http:///plugins/?ip=` 返回: 如果缓存中找到对应域名,则返回域名。如果缓存中没有找到对应域名,则返回空。如果参数不对则返回 HTTP 400。 示例: `http://127.0.0.1:8080/plugins/my_reverse_lookup?ip=8.8.8.8`,返回 `dns.google.` 注意返回的是 fully qualified 域名,末尾有 `.`。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/ke-zhi-xing-cha-jian#rate_limiter) rate\_limiter (非常实验性) 用于限制客户端的请求速率。是匹配器。超过限制的请求返回 false。 注意: 此插件目前只能提醒"友善的客户端和用户"控制其流量。不能抗恶意攻击。目前属于中看不中用的插件。后续尝试和 linux 防火墙,脚本调用(云防火墙)等进行联动。 Copy tag: "" type: "rate_limiter" args: qps: 20 # 客户端的请求 qps 限制。默认 20 burst: 40 # 突发数。允许客户端瞬间突发请求数。默认 40 mask4: 32 # IPv4 网段掩码。来自同网段的请求会被视为来自同一客户端。默认 32 mask6: 48 # IPv6 网段掩码。默认 48 使用方式举例: 在 sequence 中 rate\_limiter 匹配请求。判断 false (超 qps 请求),取反,返回 REFUSE。 Copy - matches: "!$rate_limit" exec: reject 3 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/ke-zhi-xing-cha-jian#fallback) fallback (实验性) 失败时回滚。 Copy tag: "" type: "fallback" args: primary: executable_tag # 主可执行插件的 tag secondary: executable_tag # 副可执行插件的 tag threshold: 500 # 无响应回滚阈值。单位毫秒。默认 500 。 always_standby: true # 副可执行插件始终待命。 回滚机制: 如果 primary 抛出错误,或返回但没有应答,或在 threshold 毫秒内无响应,则执行 secondary 。因无响应触发 fallback 时,如果 primary 比 secondary 先返回了应答,则依旧会采用 primary 的应答。 错误处理: 如果 primary 和 secondary 都无应答 (抛出了错误,无响应直到超时,返回了但无应答),则抛出错误。 always\_standby: secondary 会和 primary 一并执行。secondary 的结果将会在需要回滚时,立刻被采用。 注意: fallback 是多线程。primary 和 secondary 是独立的线程,它们收到的请求是 fallback 收到的请求的镜像。任何一方对请求做出修改不会影响对方,也不会影响 fallback 所在的 [sequence](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/ke-zhi-xing-cha-jian#sequence-an-shun-xu-zu-he-duo-ge-cha-jian) 。如果 primary 和 secondary 是 sequence ,则它是一级/根 sequence。 注意: 如需提高上游的稳定性,绝大多数(99%)的用户只需设置 forward 并发多个上游。只有极少数用户需要这个插件。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/ke-zhi-xing-cha-jian#ecs_handler) ecs\_handler (实验性) (v5.3+) 实现 EDNS0 Client Subnet 相关功能。 Copy tag: "" type: "ecs_handler" args: forward: false # 是否转发来自下游的 ecs preset: 1.2.3.4 # 发送预设 ecs send: false # 是否发送 ecs mask4: 24 # ipv4 掩码。默认 24 mask6: 48 # ipv6 掩码。默认 48 优先级: 1. 如果 forward == true 并且下游请求包含 ecs。则转发该 ecs。否则 2. 如果 preset != nil。则发送该预设 ecs。否则 3. 如果 send == true,则发送客户端地址。 Last updated 2 years ago --- # 域名匹配规则 | mosdns-wiki-zh 域名规则有多个匹配方式: * 以 `domain:` 开头,域匹配。e.g: `domain:google.com` 会匹配自身 `google.com`,以及其子域名 `www.google.com`, `maps.l.google.com` 等。 * 以 `full:` 开头,完整匹配。e.g: `full:google.com` 只会匹配自身。 * 以 `keyword:` 开头,关键字匹配。e.g: `keyword:google.com` 会匹配包含这个字段的域名,如 `google.com.hk`, `www.google.com.hk`。 * 以 `regexp:` 开头,正则匹配([Golang 标准arrow-up-right](https://github.com/google/re2/wiki/Syntax) )。e.g: `regexp:.+\.google\.com$`。 匹配方式可省略。不同插件有不同的默认值。 匹配方式按如下顺序生效: `full` > `domain` > `regexp` > `keyword`。 相同匹配方式的规则按如下顺序生效: * `domain` 规则: 子域名优先。比如如果同时存在规则 `google.com` 和 `com`。 `www.google.com` 会优先匹配 `google.com`,然后 `com`。(v3.9.0+) * `regexp` 和 `keyword` 规则生效顺序为规则导入的顺序。 性能: * `domain` 和 `full` 匹配使用 HashMap,复杂度 O(1)。每 1w 域名约占用 1M 内存。 * `keyword` 和 `regexp` 匹配需遍历,复杂度 O(n)。注意: `regexp` 正则匹配会消耗大量资源。 Last updated 3 years ago --- # Sequence 插件 | mosdns-wiki-zh sequence 是一个 [可执行插件](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/ke-zhi-xing-cha-jian) ,可以被其他插件调用。因其功能较多,单独写在本页面。 [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#xie-zai-zui-qian) 写在最前 ------------------------------------------------------------------------------------------------------------------------------------ ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#can-shu-bang-zhu-shuo-ming) 参数帮助说明 * `{ arg1 | arg2 | ... }` 代表这几个参数必需选择其中一个(多选一)。 * `[ arg ]` 代表该参数是可选的。可省略。 * `...` 表示之前的参数可以无限重复。`*n` 表示之前的参数可以重复 n 次 。 * 没有符号的 `arg` 表示该参数不可省略。 [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#can-shu) 参数 ------------------------------------------------------------------------------------------------------------------------- 初始化参数说明: Copy tag: "" type: "sequence" args: # []rule - matches: # []string, 匹配条件。多个匹配条件为 AND 关系。 - qname $ad_domain # [!]{ 内置匹配名称 | $已定义的匹配器插件tag } [参数] - "!qname $ad_domain" # !前缀代表取反。 exec: reject 3 # string, { 内置操作名称 | $已定义的可执行插件tag } [参数] - exec: $forward_google # matches 条件可省略。 sequence 插件引用的所有已定义的插件 tag 必须在 sequence 前定义,否则 sequence 找不到对应插件。 一个 sequence 由多个 rule 构成。一个 rule 由零个或多个条件和一个操作构成。sequence 会依次执行每个 rule 。 可以把 sequence 近似成处理 DNS 请求的 iptables / nftables 的 chain 。复杂的处理逻辑可以配置多个 sequence 然后配合 `accept/reject/jump/goto/return` 操作在 sequence 之间跳跃。 可执行插件列表见: [可执行插件chevron-right](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/ke-zhi-xing-cha-jian) 错误处理: 如果遇到插件抛出错误,sequence 不会继续执行后续规则,并继续抛出该错误。 配置示例: Copy tag: "" type: "sequence" args: # 屏蔽某些域名,比如广告域名。 - matches: - qname $ad_domain exec: reject 3 - ... # 将内网请求转交给 handle_local_query sequence 另行处理。 - matches: - qname local internal.my.domain exec: goto handle_local_query - matches: - ptr_ip 10.0.0.0/8 exec: goto handle_local_query # 让某些域名跳过 cache,比如的 DDNS 域名。然后仅 # 修改 DDNS 域名的 TTL。 - matches: - "!qname my.ddns.domain" exec: cache 1024 - exec: forward 8.8.8.8 - matches: - qname my.ddns.domain exec: ttl 1 # env 实现"开关功能"。 # 运行 mosdns 时设定 MOSDNS_ENABLE_CACHE 环境变量即可开启 cache 功能。 - matches: - env MOSDNS_ENABLE_CACHE exec: cache 1024 - ... [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#nei-jian-pi-pei-qi) 内建匹配器 --------------------------------------------------------------------------------------------------------------------------------------- ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#resp_ip) resp\_ip 匹配应答 A 和 AAAA 记录的 IP 。如果应答有多个 IP 只要任意 IP 匹配即为 true 。 参数: Copy resp_ip { ip | $ip_set_tag | &ip_list_file } ... 示例: Copy resp_ip 192.168.1.1/24 8.8.8.8 $local_ips &./local_ips.txt * `ip` 可以是 IPv4/6, CIDR 。 * `ip_set_tag` 是类型为 [ip\_set](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/shu-ju-cha-jian#ip_set) 插件的 tag 。 * `ip_list_file` 是文本类型的 IP/CIDR 表。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#client_ip) client\_ip 匹配客户端的 IP 。 参数和示例和上文的 [resp\_ip](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#resp_ip) 相同。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#ptr_ip) ptr\_ip 匹配 PTR 请求的 IP。 参数和示例和上文的 [resp\_ip](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#resp_ip) 相同。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#qname) qname 匹配请求的 QNAME 。 参数: `qname { domain_rule | $domain_set_tag | &domain_list_file } ...` 示例: `qname google.com full:google.com $local_domains &./local_domains.txt` * `domain_rule` 是域名表达式。支持扩展。详见 [域名匹配规则](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/yu-ming-pi-pei-gui-ze) 。 * `domain_set_tag` 是类型为 [domain\_set](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/shu-ju-cha-jian#domain_set) 插件的 tag 。 * `domain_list_file` 是文本类型的域名表达式表 。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#cname) cname 匹配应答的 CNAME 记录。如果应答有多个 CNAME 只要任意 CNAME 匹配即为 true 。 参数和示例和上文的 [qname](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#qname) 相同。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#qclass) qclass 匹配请求的 QCLASS。 参数: `qclass [uint16] ...` 示例: `qclass 1 2 3` ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#qtype) qtype 匹配请求的 QTYPE。 参数和示例和上文的 [qclass](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#qclass) 相同。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#rcode) rcode 匹配应答的 RCODE。 参数和示例和上文的 [qclass](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#qclass) 相同。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#has_resp) has\_resp 如果有应答,返回 true 。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#has_wanted_ans) has\_wanted\_ans 如果有期望的 ANSWER,返回 true 。"期望的ANSWER "指应答的 ANSWER 中包含和 QUESTOIN 类型相同的 record。比如请求 A 记录,应答里返回了 A 记录,则该判断为 true。请求 AAAA 记录,虽然返回了SUCCESS 应答但无 AAAA 记录,返回 false 。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#mark) mark 参数: `mark [uint32] ...` 示例: `mark 1 2 3` 请求存在任意指定的标记即为 true 。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#string_exp) string\_exp (实验性) 字符串匹配器。 参数: `string_exp string_src op [arg_string]` 示例: `string_exp` server\_name`eq a.b.c d.e.f` `string_src`: 匹配的字符串来源。可以是 * url\_path: 来自 DoH 服务端请求的 url path 。 * server\_name: 来自服务端 TLS (DoH,DoT,DoQ) 的 SNI。 * $env: 以 $ 开头,环境变量的值。 `op` 是匹配方式。可以是 `eq` 相等,`prefix` 包含前缀,`suffix` 包含后缀,`contains` 包含,`regexp` 正则,`zl` 字符串长度为零。 `arg_string` 是匹配参数,目前除了 zl 无参数,其余匹配方式均可包含多个字符串作为匹配规则。任意规则匹配即返回 true 。 注意: 受格式限制,目前不支持带空格的规则参数。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#qi-ta-pi-pei-qi) 其他匹配器 #### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#true-he-false) \_true 和 \_false 永远返回 true 和 false 。方便脚本生成占位符。 `_` 前缀没有别的意义,只是防止匹配器名在某些配置格式里被误识别成 bool 类型。 #### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#env) env 参数: `env env_key [env_value]` 示例: `env CACHE_ENABLED` , `env NETWORK_TYPE lan` 。 启动时查找 `env_key` ,如果值和 `env_value` 一致则返回 true。如果 `env_value` 省略,则 `env_key` 存在(包括零值的情况)即返回 true 。 #### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#random) random 参数: `random prob_float64` 示例: `random 0.5` 以 `prob_float64` 的概率返回 true 。 [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#nei-jian-cao-zuo) 内建操作 ------------------------------------------------------------------------------------------------------------------------------------ ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#forward) forward 转发请求至上游服务器获取应答。 参数: `forward upstream [upstream]...` 示例: `forward 8.8.8.8 tls://8.8.8.8` 可配置多个上游。会并发请求,取最先返回的应答。如果超过 3 个上游,会随机选取 3 个上游并发。 `upstream` 支持四种协议。格式示例: * UDP: `8.8.8.8`, `208.67.222.222:443` * TCP: `tcp://8.8.8.8` * DoT: `tls://8.8.8.8:853`, `tls://dns.google` * DoH (RFC8484 GET): `https://8.8.8.8/dns-query`, `https://dns.google/dns-query` * Tips: 使用 IP 地址能更快建立连接,因为不用解析服务器的 IP。除非情况特殊,否则不要使用带域名的地址。 这是个便捷设置。如需更多高级功能 (HTTP3,Socks5,SO\_MARK...),可配置独立的 [forward](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/ke-zhi-xing-cha-jian#forward) 插件。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#cache) cache DNS 缓存。如果请求命中缓存,则将缓存的应答放入请求。 当某一请求经过 cache 后,cache 会在这个请求处理流程结束时自动将应答放入缓存。用户无需介入。 不支持扩展 DNS 协议 (即 EDNS0)。 参数: `cache [size]`,`size` 是缓存大小,单位: 条,默认 1024。 示例: `cache 1024` 这是个便捷设置。如需更多高级功能 (lazy cache,缓存存盘...),可配置独立的 [cache](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/ke-zhi-xing-cha-jian#cache) 插件。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#black_hole) black\_hole 生成包含特定 IP 的应答。 参数: `black_hole [ip] ...` 示例: `black_hole 127.0.0.1 ::1 0.0.0.0` 会自动识别参数中的 IPv4/6 。如果参数中指定了多个 IPv4/6,会全部包含在应答内。如果某一 IP 类型未指定,则不会生成对应类型的应答。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#drop_resp) drop\_resp 丢弃应答。用于触发 fallback。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#ecs) ecs 附加 ECS (EDNS0 Client Subnet) 至请求。支持 IPv4/6。IPv4 会使用 /24 mask,IPv6 使用 /48 。 参数 (v5.3+): `ecs [ip]` 参数 (v5.2 以前)(弃用): `ecs [ip/mask] [ip/mask]` 。v5.3+ 后只会用第一个 IP,mask 会忽略。 示例: `ecs 1.2.3.4` ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#forward_edns0opt) forward\_edns0opt (实验性)(v5.3+) 允许客户端的这些 EDNS0 Option 转发至上游。 参数: `forward_edns0opt [option_code] ...` 注意: * 此插件不可以执行多次! 否则转发至上游的请求中 EDNS0 Option 将出现重复,导致协议错误。 * 并不是所有 EDNS0 Option 都能被转发。此插件设计的目是转发 10 (Cookie) 和 15 (Extended DNS Error)。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#ipset) ipset (实验性) 写入应答 IP 至 ipset 。仅支持 Linux 。插件会直接用 netlink 和内核通信,不依赖也不运行 ipset 命令,效率很高。 参数: `ipset [set_name,set_family,mask]*2` 示例: `ipset my_set,inet,24 my_set6,inet6,48` * `set_family` = `{ inet | inet6 }` * `mask` 是写入 IP 时使用的掩码 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#nftset) nftset (实验性) 写入应答 IP 至 nftables 。仅支持 Linux 。插件会直接用 netlink 和内核通信,不依赖也不运行 nft 命令,效率很高。 参数: Copy nftset [table_family,table_name,set_name,set_dtype,mask]*2 示例: Copy nftset inet,my_table,my_set,ipv4_addr,24 inet,my_table,my_set,ipv6_addr,48 * `table_family` = `{ ip | ip6 | inet }` table 表的类型。 * `set_dtype` = `{ ipv4_addr | ipv6_addr }` set 的类型。 * `mask` 是写入 IP 时使用的掩码。插件会自动判断 set 是否带有 interval 这个 flag,如果 set 有 interval flag 的话,会以 IP 段的形式写入 set 。 chevron-rightipset/nftables 配合 cache 示例[hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#ipsetnftables-pei-he-cache-shi-li) 以 ipset 为例: Copy tag: "" type: "sequence" args: - exec: cache 1024 - matches: # 如果缓存命中,则不会转发请求至上游。 - "!has_resp" exec: forward 8.8.8.8 - exec: ipset ... # ipset 每次请求都能被刷新 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#query_summary) query\_summary 以 info 级别在 log 打印请求的摘要。包含: 请求的域名,类型,客户端 IP,应答的 RCODE,错误信息,后续规则处理请求的用时。 参数: `query_summary [ msg_title ]` 示例: `query_summary query from server 1` * `msg_title` 的文字会写在 log 的 `msg` 键上。 如果一个请求经过了多个 query\_summary,log 打印的顺序是反的,即先打印最后经过的 query\_summary 的 log。这不是 bug 。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#metrics_collector) metrics\_collector (实验性) 收集 prometheus metrics 数据。 参数: `metrics_collector collector_name` * `collector_name` 不可重复。 暴露的 metrics 数据项名称为 `mosdns_metrics_collector_{name=collector_name}`。 插件会收集以下 metric: * query\_total 经过该收集器的总请求数。 * err\_total 该收集器的后续规则的总出错数。 * thread 该收集器后续规则的线程数。(此时有多少请求正在被后续规则处理中) * response\_latency\_millisecond 该收集器后续命令返回的延时。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#prefer_ipv4-6) prefer\_ipv4/6 希望客户端解析双栈域名 IP 时,只返回 IPv4/6 。但不影响纯 IPv6/4 (单栈)域名的解析。 `prefer_ipv4` 和 `prefer_ipv6` 是两个操作。下面为了表述方便,仅以 `prefer_ipv4` 为例。`prefer_ipv6` 同理。 `prefer_ipv4` 让下游客户端支持双栈时优先使用 IPv4。`prefer_ipv4` 处理 AAAA 请求时会自动发送 A 请求测试域名是否是双栈,该新产生的 A 请求会和原 AAAA 请求一并继续执行后续规则。如果最后 A 和 AAAA 请求都获得到了 IP (域名为双栈),则原 AAAA 请求被屏蔽。这样客户端只能收到 A 记录,进而强迫客户端使用 IPv4 (实验性特性)(v5.3+) 插件会缓存域名的双栈支持情况,以避免频繁测试。缓存大小 65535 。缓存时长 1 小时。暂不支持自定义。 使用位置要求: 后续规则必须能生成应答 (比如有 forward)。 sequence 示例: Copy # 所有请求都优先返回 ipv4,屏蔽 ipv6。 - exec: prefer_ipv4 - ... - exec: forward 8.8.8.8 # 配合匹配器实现仅特定域名生效。 - matches: - qname my.domain exec: - prefer_ipv4 - ... - exec: forward 8.8.8.8 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#ttl) ttl 修改应答的 TTL。 参数: `ttl { fix | min-max }` 示例: `ttl 300` 将 ttl 固定在 300, `ttl 300-600` 限制 ttl 在 300 到 600 之间。`ttl 300-0` 限制 ttl 不小于 300 。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#mark-1) mark 在请求上打标记。 参数: `mark [uint32] ...` 示例: `mark 1 2 3` ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#tiao-shi-yong) 调试用 #### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#sleep) sleep 等待一段时间。增加/模拟延时用。 参数: `sleep millisecond` #### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#debug_print) debug\_print 以 info 级别在 log 打印完整的请求和应答信息。 参数: `debug_print [msg_title]` 示例: `debug_print query from server 1` * `msg_title` 的文字会写在 log 的 `msg` 键上 [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#nei-jian-tiao-zhuan-cao-zuo) 内建跳转操作 ------------------------------------------------------------------------------------------------------------------------------------------------- ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#accept) accept 停止后续规则执行。如果本 sequence 存在上级 sequence,所有上级的 sequence 也不再继续执行后续规则。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#reject) reject 参数: `reject [rcode]` 示例: `reject 5` 和 accept 一样,如果本 sequence 存在上级 sequence,所有上级的 sequence 也不再继续执行后续规则。同时生成 `rcode` 应答。不指定 `rcode` 默认为 5 (REFUSED) 。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#return) return 停止后续规则执行。如果所在 sequence 是从另一 sequence jump 过来的,则返回源 sequence 继续执行。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#goto) goto 参数: `goto sequence_tag` 示例: `goto my_next_sequence` `sequence_tag` 是目标 sequence 插件的 tag。将不再执行本 sequence 后续规则,开始执行目标 sequence 。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#jump) jump 参数: `jump sequence_tag` 示例: `jump my_next_sequence` `sequence_tag` 是目标 sequence 插件的 tag。将开始执行目标 sequence,目标 sequence 结束或 return 后,返回本 sequence 继续执行。目标 sequence accept/reject 后,本 sequence 和所有上级的 sequence 不再继续执行后续规则。 [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-pei-zhi-mosdns/sequence-cha-jian#mark-gao-ji-yong-fa-shi-li) mark 高级用法示例 ----------------------------------------------------------------------------------------------------------------------------------------------------- 实现逻辑或,单次匹配后执行多个 exec,以及实现 if ... else。 Copy - tag: main type: sequence args: # 匹配成功后打标 # 打相同标签可实现"逻辑或" - matches: - "match_A" exec: mark 123456789 - matches: - "match_B" exec: mark 123456789 # 连续执行 - matches: mark 123456789 exec: do_something_1 - matches: mark 123456789 exec: do_something_2 # ... # 连续执行 else - matches: "!mark 123456789" exec: else_do_something_1 - matches: "!mark 123456789" exec: else_do_something_2 Last updated 2 years ago --- # Debug 内存与性能问题 | mosdns-wiki-zh 如果感觉到内存和性能上有问题,可以用 mosdns 内置的 pprof 工具进行分析。 [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/debug-nei-cun-yu-xing-neng-wen-ti#zi-ji-fen-xi) 自己分析 --------------------------------------------------------------------------------------------------------------------------- 如果有相关知识和能力的话,可自行使用 pprof。 1. 配置文件中填入 api.http 地址。启用 api 服务器。 2. pprof 位于 `http:///debug/pprof/` 。 [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/debug-nei-cun-yu-xing-neng-wen-ti#ti-jiao-gei-kai-fa-zhe) 提交给开发者 --------------------------------------------------------------------------------------------------------------------------------------- 如果发现内存和性能问题,将 pprof 数据提交给开发者可以帮助他们快速定位问题。下载数据的方式非常简单。 * 确保配置文件中填入了 api.http 地址。mosdns 已启用 api 服务器。 * 出现异常时 (比如 cpu 持续 100%,或者内存已爆炸),浏览器访问以下网址,下载采样数据。 Copy # 替换成 api 服务器的地址。 # 内存采样数据 http:///debug/pprof/allocs http:///debug/pprof/goroutine http:///debug/pprof/heap # CPU 采样,仅 CPU 占用异常时需要 http:///debug/pprof/profile?seconds=5 * 将采样数据上传给开发者。 补充: * 采样数据仅包含程序代码层面运行次数统计(某行代码运行了多久,占用了多少内存),不是内存数据,不包含任何用户信息,可以随便分享。 Last updated 3 years ago --- # 如何编写新插件 | mosdns-wiki-zh [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-bian-xie-xin-cha-jian#bian-xie-xin-cha-jian) 编写新插件 ------------------------------------------------------------------------------------------------------------------------------- 可参考实现了 `sleep` 插件。在项目的 `plugin/executable/sleep/sleep.go`。内有详细注释。 编写好插件后,可在 `plugin/enabled_plugin.go` 匿名 import ,注册插件。 [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/ru-he-bian-xie-xin-cha-jian#fen-xiang-di-san-fang-cha-jian) 分享第三方插件 ------------------------------------------------------------------------------------------------------------------------------------------ 编写好插件后,如果想将插件分享,可以在 github 的 issue 或 discussion 分享。 Last updated 2 years ago --- # API 说明 | mosdns-wiki-zh **所有 API 目前都是实验性的。不保证稳定性和不变性。** 使用 API 需在配置中设置 api.http 的地址。 [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/api-shuo-ming#cha-jian-api) 插件 API --------------------------------------------------------------------------------------------------------- 插件 API 的入口为 `http:///plugins/`。 参数取决于插件。 [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/api-shuo-ming#prometheus-metrics-api) Prometheus Metrics API ----------------------------------------------------------------------------------------------------------------------------------- Prometheus API 的入口为 `http:///metrics`。包含一些默认数据项。部分插件会添加新数据项。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v5/api-shuo-ming#pppof-xing-neng-fen-xi-gong-ju) pppof 性能分析工具 pprof 位于 `http:///debug/pprof/` 。 Last updated 3 years ago --- # Debug 内存与性能问题 | mosdns-wiki-zh 如果感觉到内存和性能上有问题,可以用 mosdns 内置的 pprof 工具进行分析。 [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/debug-nei-cun-yu-xing-neng-wen-ti#zi-ji-fen-xi) 自己分析 --------------------------------------------------------------------------------------------------------------------------- 如果有相关知识和能力的话,可自行使用 pprof。 1. 配置文件中填入 api.http 地址。启用 api 服务器。 2. pprof 位于 `http:///debug/pprof/` 。 [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/debug-nei-cun-yu-xing-neng-wen-ti#ti-jiao-gei-kai-fa-zhe) 提交给开发者 --------------------------------------------------------------------------------------------------------------------------------------- 如果发现内存和性能问题,将 pprof 数据提交给开发者可以帮助他们快速定位问题。下载数据的方式非常简单。 * 确保配置文件中填入了 api.http 地址。mosdns 已启用 api 服务器。 * 出现异常时,浏览器访问以下网址,下载采样数据。 Copy # 替换成 api 服务器的地址。 # 内存采样数据 http:///debug/pprof/allocs http:///debug/pprof/goroutine http:///debug/pprof/heap # CPU 采样,仅 CPU 占用异常时需要 http:///debug/pprof/profile?seconds=5 * 将采样数据上传给开发者。 补充: * 采样数据仅包含程序代码层面运行次数统计(某行代码运行了多久,占用了多少内存),不是内存数据,不包含任何用户信息,可以随便分享。 Last updated 3 years ago --- # mosdns v4 | mosdns-wiki-zh 版本: v4.5.0 [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4#gong-neng-gai-shu) 功能概述 ---------------------------------------------------------------------------------------------- mosdns 是一个插件化的 DNS 转发器。用户可以按需拼接插件,定制自己的 DNS 处理逻辑。 [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4#cha-jian-gai-shu) 插件概述 --------------------------------------------------------------------------------------------- 以下是 mosdns 以及自带插件的功能: * 匹配器: * `query_matcher`: 匹配请求的特性。域名,类型,来源 IP 等。 * `response_matcher`: 匹配应答的特性。应答 IP,CNAME 等。 * 常用功能: * `forward`: 转发请求至上游服务器。 * `cache`: 缓存应答。支持 redis 外部缓存。 * `_prefer_ipv4/6`: 自动判断域名是否是双栈域名然后屏蔽 IPv4/6 请求,不会影响纯 IPv6/4 域名。 * `ecs`: 在请求上附加 ECS。可以是预设 IP 也可以自动使用客户端的 IP。 * `hosts`: 为域名设定 IP。 * `blackhole`: 能丢弃应答,生成空应答,或者生成包含特定 IP 应答。用于屏蔽请求。 * `ttl`: 修改应答的 TTL。 * `redirect`: 替换(重定向)请求的域名。请求域名 A,但返回域名 B 的记录。 * `padding`: 将加密 DNS 的报文填充至固定长度,防止流量分析。 * `bufsize`: 修改请求的 EDNS0 的 UDP Size。防止 UDP 碎片。 * `arbitrary`: 面向高级用户。可以手动构建包含任意记录的应答。 * `reverse_lookup` : 可通过 IP 反查经过 mosdns 处理的域名。支持处理 PTR 请求,支持通过 HTTP 接口查询。 * `client_limiter`: 限制客户端的最大 QPS。 * 动态路由 * `ipset`: 将应答 IP 写入 ipset。 * `nftset`: 将应答 IP 写入 nftables。 插件详细说明在 [插件及其参数chevron-right](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu) 还可以添加自己编写的插件到 mosdns 内。详见 [如何编写新插件chevron-right](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/ru-he-bian-xie-xin-cha-jian) [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4#ru-he-pei-zhi) 如何配置 ------------------------------------------------------------------------------------------ 配置说明和示例,详见: [如何配置 mosdnschevron-right](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/ru-he-pei-zhi-mosdns) [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4#ru-he-shi-yong) 如何使用 ------------------------------------------------------------------------------------------- mosdns 只有一个二进制文件,命令行运行即可。 Copy mosdns start -c config_file -d working_dir​ mosdns 还附带一些常用小工具命令。 * probe 可以探测 TCP/TLS 服务器是否支持连接复用,pipeline 连接复用,空闲连接保持时间。 * config 可以生成 yaml 配置文件模板,转换配置文件格式。 * service 可以将 mosdns 安装成系统服务。 详见各个子命令的帮助。 Copy mosdns -h mosdns probe -h ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4#an-zhuang-zhi-xi-tong-fu-wu) 安装至系统服务 mosdns service 是一个简单的系统服务管理工具。可将 mosdns 安装成系统服务实现自启。需要管理员或 root 权限。理论上可用于 Windows XP+, Linux/(systemd | Upstart | SysV), 和 OSX/Launchd 平台。Windows,Ubuntu,Debian 实测可用。Openwrt 不可用。 Copy # 安装服务 mosdns service install -d 工作目录绝对路径 -c 配置文件路径 # 安装成功后手动运行服务。(服务仅设定为随系统自启,安装成功后并不会马上自动运行) mosdns service start # 卸载 mosdns service stop mosdns service uninstall [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4#geng-duo-gong-ju) 更多工具 --------------------------------------------------------------------------------------------- 开放列表,排名不分前后。欢迎提交 issue 编辑本列表。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4#openwrt) Openwrt 用于 Openwrt 系统的 mosdns。自带 Luci 管理界面。 [sbwml / luci-app-mosdnsarrow-up-right](https://github.com/sbwml/luci-app-mosdns) [QiuSimons/openwrt-mosarrow-up-right](https://github.com/QiuSimons/openwrt-mos) ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4#pmkol-easymosdns) [pmkol/easymosdnsarrow-up-right](https://github.com/pmkol/easymosdns) 适用于 Linux 的辅助脚本。借助 mosdns,仅需几分钟即可搭建一台支持 ECS 的无污染 DNS 服务器。内置中国大陆地区的优化规则,满足DNS日常使用场景,开箱即用。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4#mosdns-cn) [mosdns-cnarrow-up-right](https://github.com/IrineSistiana/mosdns-cn) 简单易用加密 DNS 转发器。内置域名 & IP 分流策略,只需用户提供上游服务器地址和分流用的域名 IP 表,即可实现的本地/远程域名分流。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4#cfdohpw) [cfdohpwarrow-up-right](https://github.com/IrineSistiana/cfdohpw) 一个 Cloudflare Workers 脚本。借助 Cloudflare CDN 平台中转加速任意 DoH (RFC8484) 流量。只需一个 Cloudflare 账号,无需自备服务器和域名。 Last updated 3 years ago --- # 如何编写新插件 | mosdns-wiki-zh 1\. 实现插件 * 可执行插件: 实现 `coremain/ExecutablePlugin` 接口。 * 匹配器插件: 实现 `coremain/MatcherPlugin` 接口。 2\. 注册插件 可参考实现了 `ExecutablePlugin` 接口的 `sleep` 插件。在 `plugin/executable/sleep/sleep.go`。内有详细注释。 3\. 启用插件 在 `plugin/enabled_plugin.go` 启用插件。 Last updated 3 years ago --- # API 说明 | mosdns-wiki-zh **所有 API 目前都是实验性的。不保证稳定性和不变性。** 使用 API 需在配置中设置 api.http 的地址。 [如何配置 mosdnschevron-right](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/ru-he-pei-zhi-mosdns) [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/api-shuo-ming#cha-jian-api) 插件 API --------------------------------------------------------------------------------------------------------- 插件 API 的入口为 `http:///plugins/`。 参数取决于插件。 [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/api-shuo-ming#prometheus-metrics-api) Prometheus Metrics API ----------------------------------------------------------------------------------------------------------------------------------- Prometheus API 的入口为 `http:///metrics`。包含一些默认数据项。部分插件会添加新数据项。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/api-shuo-ming#pppof-xing-neng-fen-xi-gong-ju) pppof 性能分析工具 pprof 位于 `http:///debug/pprof/` 。 使用方式详见 [Debug 内存与性能问题chevron-right](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/debug-nei-cun-yu-xing-neng-wen-ti) Last updated 3 years ago --- # 如何配置 mosdns | mosdns-wiki-zh [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/ru-he-pei-zhi-mosdns#ji-ben-pei-zhi-wen-jian-ge-shi) 基本配置文件格式 ------------------------------------------------------------------------------------------------------------------------------------ mosdns 的默认配置文件格式是 yaml,本 wiki 中所有示例均为 yaml 格式。 mosdns 也支持 JSON, TOML 格式的配置文件。mosdns 会根据配置文件后缀自动识别配置格式。 Copy # 日志设置 log: level: info # 日志级别。可选 "debug" "info" "warn" "error"。默认 "info"。 file: "/path/to/log/file" # 记录日志到文件。 # 从其他配置文件载入 include,数据源,插件和服务器设置 # include 的设置会比本配置文件中的设置先被初始化 include: [] # 数据源设置 data_providers: - tag: data1 # 数据源的 tag。由用户自由设定。不能重复。 file: "/path/to/data/file" # 文件位置 auto_reload: false # 文件有变化时是否自动重载。 # 插件设置 plugins: - tag: tag1 # 插件的 tag。由用户自由设定。不能重复。 type: type1 # 插件类型。详见下文。 args: # 插件参数。取决于插件类型。详见下文。 key1: value1 key2: value2 # 服务器设置 servers: - exec: plugin_tag1 # 本服务器运行插件的 tag。 timeout: 5 # 请求处理超时时间。单位: 秒。默认: 5。 listener: # 监听设置。是数组。可配置多个。 - protocol: https # 协议,支持 "udp", "tcp", "tls", "https" 和 "http" addr: ":443" # 监听地址。 cert: "/path/to/my/cert" # TLS 所需证书文件。 key: "/path/to/my/key" # TLS 所需密钥文件。 url_path: "/dns-query" # DoH 路径。留空会跳过路径检查,任何请求路径会被处理。 # DoH 从 HTTP 头获取用户 IP。需配合反向代理使用。(v4.3+) 配置后会屏蔽所有没有该头的请求。 get_user_ip_from_header: "X-Forwarded-For" # (v4.3+) 启用 proxy protocol。需配合代理使用。UDP 服务器暂不支持。 proxy_protocol: false idle_timeout: 10 # 连接复用空连接超时时间。单位: 秒。默认: 10。 - protocol: udp addr: ":53" - protocol: tcp addr: ":53" # API 入口设置 api: http: "127.0.0.1:8080" # 在该地址启动 api 接口。 circle-exclamation 数据源文件自动重载注意事项: 该功能依赖文件系统的通知,非轮询。仅部分系统和文件系统可用。一般来说 Windows, Linux, BSD 和 macOS 上常见的文件系统均可用,网络文件系统除外。详见 [fsnotifyarrow-up-right](https://github.com/fsnotify/fsnotify) 。 为避免不必要的惊喜/惊吓,若检测到数据源文件被删除,一秒后没有相同文件名的文件被创建,则停止自动重载。 插件设置: 可用的插件类型 `type` 和其对应的 `args` 参数设置,详见 [插件及其参数chevron-right](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu) API 说明详见 [API 说明chevron-right](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/api-shuo-ming) ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/ru-he-pei-zhi-mosdns#pei-zhi-shi-li) 配置示例 绝大多数 mosdns 的配置都遵循一个思路: * servers 接受来自用户的请求。转给 plugins 处理。 * 用 sequence 插件定义请求处理逻辑。生成/获取应答。 * data\_providers 为某些 plugin 提供所需数据。 chevron-right简单转发器: 将不加密的 DNS53 通过 DoH 转发。点击展开[hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/ru-he-pei-zhi-mosdns#jian-dan-zhuan-fa-qi-jiang-bu-jia-mi-de-dns53-tong-guo-doh-zhuan-fa-dian-ji-zhan-kai) Copy log: level: info file: "" plugins: # 转发至 Google 服务器的插件 - tag: forward_google type: fast_forward args: upstream: - addr: https://8.8.8.8/dns-query servers: - exec: forward_google listeners: - protocol: udp addr: 127.0.0.1:5533 - protocol: tcp addr: 127.0.0.1:5533 chevron-right多功能转发器: 缓存加速,屏蔽广告。点击展开[hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/ru-he-pei-zhi-mosdns#duo-gong-neng-zhuan-fa-qi-huan-cun-jia-su-ping-bi-guang-gao-dian-ji-zhan-kai) 这个配置文件 * 有缓存,可加速域名解析速度。 * 会屏蔽广告域名。 * 将请求转发至 Google DoH 解析。 用户可以用 `sequence` 插件将多个插件按顺序组合,组成自己想要的运行逻辑。比如下文的配置利用 `if` 屏蔽广告域名。 示例中的广告列表 oisd\_dbl\_basic.txt 来自 [oisd.nlarrow-up-right](https://oisd.nl/) (官网首页)。下载地址: [https://dbl.oisd.nl/basic/arrow-up-right](https://dbl.oisd.nl/basic/) 。 mosdns 的域名匹配器非常高效,即使匹配数以百万的域名也不会影响性能。 Copy log: level: info data_providers: - tag: oisd_dbl_basic file: ./oisd_dbl_basic.txt plugins: - tag: cache type: cache args: size: 1024 - tag: forward_google type: fast_forward args: upstream: - addr: https://8.8.8.8/dns-query - tag: query_is_ad_domain type: query_matcher args: domain: - 'provider:oisd_dbl_basic' - tag: my_sequence type: sequence args: exec: # 缓存 - cache # 如果匹配到广告域名 - if: query_is_ad_domain exec: - _new_nxdomain_response # 生成 NXDOMAIN 应答 - _return # 立刻返回 (结束本序列) # 转发至 Google 获取应答 - forward_google servers: - exec: my_sequence listeners: - protocol: udp addr: 127.0.0.1:5533 - protocol: tcp addr: 127.0.0.1:5533 Last updated 3 years ago --- # 插件及其参数 | mosdns-wiki-zh [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#xie-zai-zui-qian) 写在最前 -------------------------------------------------------------------------------------------------------------------- ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#mosdns-de-cha-jian-liu-shui-xian-gai-nian) mosdns 的插件流水线概念 ![](https://irine-sistiana.gitbook.io/mosdns-wiki/~gitbook/image?url=https%3A%2F%2F3579691848-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FCFG3I5tOk87v1Mcd3a3X%252Fuploads%252FeybbtwInswGyD2jLurB9%252Fplugin_workflow.svg%3Falt%3Dmedia%26token%3D7db6da64-f19c-4a39-a67b-5844c2ba40e3&width=768&dpr=3&quality=100&sign=efa3cd17&sv=2) 一个能正常工作的简单的流水线示例。能将应答转发至上游。同时支持缓存。 什么是插件: 插件接受并返回一个“请求上下文”。在内部处理请求/应答。 “请求上下文”包含了 * 客户端来源 IP 等信息。由服务端赋值。不可修改。 * 客户的请求。插件可以自由修改请求的数据。 * 应答。初始为空。插件可以自由修改应答的数据 插件流水线: 将多个插件串在一起,就构成了一条流水线。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#pei-zhi-wen-jian-zhong-de-cha-jian) 配置文件中的插件 每个插件都是独立的,互不影响。同类型 `type` 插件可以初始化任意多个,只要插件的 `tag` 不重复就行。 chevron-right多个同类型插件配置示例。点击展开[hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#duo-ge-tong-lei-xing-cha-jian-pei-zhi-shi-li-dian-ji-zhan-kai) 两个 `forward` 插件。`tag` 不同,参数不同。 Copy plugin: - tag: forward_google type: forward args: upstream: - addr: https://dns.google/dns-query - tag: forward_cloudflare type: forward args: upstream: - addr: https://1.1.1.1/dns-query 一些常用的插件配置已经被 mosdns 预先初始化好了,`tag` 以 `_` 开头以便区分。可以直接调用。 circle-exclamation mosdns 会按照配置文件中顺序将插件初始化。有些插件需要调用其他插件,比如 `sequence,其调用的插件必须在之前配置。否则会因为找不到插件而初始化失败。` [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#ke-zhi-xing-cha-jian) 可执行插件 ------------------------------------------------------------------------------------------------------------------------- ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#return) \_return 预初始化的插件。什么都不做。不会将请求上下文传递给后续流水线。可以用于结束 sequence 流水线。见下文。 流水线逻辑: * 正向:跳过后续流水线。 * 反向:无。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#sequence-jiang-duo-ge-cha-jian-zu-he-cheng-liu-shui-xian) sequence 将多个插件组合成流水线 `sequence` 可以将多个插件组成一个流水线。`sequence` 也是插件,所以 `sequence` 里运行别的`sequence` 是可以的。 `_return` 是一个特殊的预初始化插件,可配合 `sequence` 使用,它只会跳过后续流水线。(注意: “跳过后续流水线”并不是直接将应答返回客户端,而是正向流水线运行结束,开始反向运行。)。 sequence 插件中调用的插件 tag 必须在 sequence 前定义,否则 sequence 找不到对应插件。 ![](https://irine-sistiana.gitbook.io/mosdns-wiki/~gitbook/image?url=https%3A%2F%2F3579691848-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FCFG3I5tOk87v1Mcd3a3X%252Fuploads%252F4AO7e2M1eRPa0Z3IkZS7%252Fsequence_workflow.svg%3Falt%3Dmedia%26token%3D4087921a-92f5-4616-a079-3a0456d95f32&width=768&dpr=3&quality=100&sign=2d2306b1&sv=2) sequence 流水线图示。 初始化参数说明: Copy tag: "" type: "sequence" args: exec: # 可以时可执行插件的 tag。比如: - "hosts" - "cache" - "ecs" # 可以是 if 条件。 # if 为条件表达式。支持 && ||,() 以及 ! 取反。 # 预定义插件(以 _ 开头的插件),需要用 [] 括住。 - if: "(matcher && ! matcher) || [_preset_matcher]" exec: # 条件满足,使用此分支流水线。 - "ecs" - "forward" else_exec: # 否则,使用此分支流水线。 - "ecs" - "forward" # 可以是 load_balance。 # 轮换使用其内部的分支流水线。 - load_balance: - - "ecs_1" # 分支流水线 #1。 - "forward_1" - - "ecs_2" # 分支流水线 #2。 - "forward_2" # ... # 不限数量,可继续添加。 chevron-right高级操作: 并发、失败自动回滚(故障转移)[hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#gao-ji-cao-zuo-bing-fa-shi-bai-zi-dong-hui-gun-gu-zhang-zhuan-yi) Copy tag: "" type: "sequence" args: exec: # 可以是 parallel。 # 并行运行其内部的独立流水线。取最先返回的有效(0 RCODE)应答。 - parallel: - - "ecs_1" # 独立流水线 #1。 - "forward_1" - - "ecs_2" # 独立流水线 #2。 - "forward_2" # ... # 不限数量,可继续添加。 # 可以是 fallback。 # fallback 有两种触发方式。详见下文。 - primary: # 主要流水线(独立的)。 - "ecs_1" - "forward_1" secondary: # 次要流水线(独立的)。 - "ecs_2" - "forward_2" stat_length: 10 # 常规 fallback 统计长度。默认 0,禁用常规 fallback。可省略。 threshold: 5 # 常规 fallback 触发阈值。不可大于统计长度。默认 0。可省略。 fast_fallback: 200 # 快速 fallback 触发阈值。单位: 毫秒。默认: 0,禁用快速 fallback。可省略。 always_standby: true # 快速 fallback secondary 始终待命。可省略。 `fallback`,`parallel` 涉及到多线程运行,其内部流水线其实是一个**独立的** sequence 插件,拥有**独立的**请求上下文,为了配置方便嵌套在这里。它们和当前 sequence 没有关系!在独立的 sequence 内对请求上下文修改,不会影响其他并行的流水线。同样 `_return`,`cache` 等能跳过后续流水线运行的插件,也只会终止自身流水线,不会对其他流水线产生影响。但最终 `fallback` 和 `parallel` 会把合适的应答放在当前 sequence 的请求上下文内。比如 `parallel` 会取最快返回的流水线的请求上下文的应答放在当前 sequence 的请求上下文。 fallback 两种触发方式: * 常规 fallback: 监控主流水线最近 `stat_length` 次的请求状态,如果出现 `threshold` 次问题(没有应答或者有报错),则下次请求会一并执行次流水线。取最先返回的应答。 * 快速 fallback: 对于每一个请求,如果主流水线运行结束了但没有返回应答,或者在 `fast_fallback` 毫秒后仍在运行无应答,则立即开始执行次流水线,取最先返回的应答。如果任意流水线返回了应答,这个请求就不会失败。比常规 fallback 策略更激进,次流水线可能运行的更频繁。 * secondary 始终待命: 如果设为 `true`,则对于每一个请求,次流水线都会和主流水线一并执行,其结果将会在需要回滚时(没有返回应答或 `fast_fallback` 超时),直接被使用。进一步降低响应时间。 * 快速和常规 fallback 可以同时启用。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#cache-huan-cun) cache 缓存 缓存 DNS 应答的插件。 流水线逻辑: * 正向:如果请求命中缓存,则将缓存的应答放入“请求上下文”,跳过后续流水线。如果没有命中,则继续执行后续流水线。 * 反向:缓存应答。 以下预初始化的插件 `tag` 可直接使用: * `_default_cache`: 默认配置的内存缓存。大小 1024。无 lazy cache。 初始化参数说明: Copy tag: "" type: "cache" args: size: 1024 # 内置内存缓存大小。单位: 条。默认: 1024。每个 cache 插件的内存缓存是独立的。 compress_resp: false # (实验性)(v4.4+)启用应答压缩。大缓存场景可能会稍微降低内存占用。 # 注意: 如果使用 redis 外部缓存,切换该选项必须清空 redis 缓存。 # redis-server 外部缓存地址。填入外部缓存会自动禁用内置的内存缓存。上文的 size 参数会被忽略。 # redis-server 需要 v2 及以上版本。如果多个 cache 插件连接到同一个 redis 数据库,数据是共享的。 # cache 会为设定记录的 TTL,不会主动删除 redis-server 内的记录。内存大小清理方式等由 # redis-server 负责。 # cache 假设 redis-server 的距离很近/延时很低而且性能足够。 # TCP 连接: `redis://:@:/` # Unix 连接: `unix://:@?db=` redis: "redis://localhost:6379/0" # redis-server 超时阈值。单位: 毫秒。默认: 1000。一般无需修改。 # 如果 redis-server 在该时间内无响应,cache 会临时停用缓存。同时间歇性尝试 ping # redis-server,直至再次成功连接。 redis_timeout: 1000 # lazy cache 设定。lazy_cache_ttl > 0 会启用 lazy cache。 # lazy cache 的设计参考了 RFC 8767。所有应答都会在缓存中存留 lazy_cache_ttl 秒,但自身的 TTL 仍然有效。 # 如果命中过期的应答,则缓存会立即返回 TTL 为 lazy_cache_reply_ttl 的应答,然后自动在后台发送请求更新数据。 # 相比强行增加应答自身的 TTL 的方法,lazy cache 能提高命中率,同时还能保持一定的数据新鲜度。 lazy_cache_ttl: 0 # lazy cache 生存时间。单位: 秒。默认: 0 (禁用 lazy cache)。 # RFC 8767 的建议值 86400(1天)~ 259200(3天) lazy_cache_reply_ttl: 5 # 返回过期应答的 TTL。默认 5。 # cache 默认只缓存有且只有一个 Question 的请求(简称"简单请求")的应答。请求的状态以运行到 cache 时为准。 # 比如一个简单请求在 cache 后被插入格外信息(比如 ECS),不会影响 cache 缓存这个请求,也不会影响 cache 后续 # 查找这个简单请求。 # cache_everything 会缓存所有请求的应答。会将完整的请求作为 key。能保证带有特殊标识的请求(比如 ECS,Cookie) # 即使 Question 相同仍然能被区分。 # 注意: "将完整的请求作为 key" 意味着 cache 不会"精细"处理各种 EDNS0。用做公用服务器可能会大幅降低 cache 效率。 # 如需处理 EDNS0 建议使用 unbound 等专业软件。 cache_everything: false # 当缓存命中后,将应答放入请求上下文后,需要执行的插件。 when_hit: "" lazy cache,也叫“乐观缓存”,的优缺点: * 优点:可大幅提高缓存命中率。流行域名几乎 100% 命中。 * 缺点:可能影响 DNS 更新频繁的域名正常使用,比如 DDNS,CDN。 * 仅建议个人使用场景,有相关知识,了解其弊端的专业用户开启。 Metrics 数据: * query\_total: 总请求数。 * hit\_total: 总命中数。(包括 lazy cache 的命中) * lazy\_hit\_total: lazy cache 总命中数 * cache\_size: 当前缓存大小。单位: 条。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#hosts-yu-ming-ying-she-ip) hosts 域名映射 IP 流水线逻辑: * 正向:如果请求的域名在 hosts 内,则将应答放入“请求上下文”,跳过后续流水线。如果不在,则继续执行后续流水线。 * 反向:无。 初始化参数说明: Copy tag: "" type: "hosts" args: hosts: - "google.com 108.177.122.113" # 可以是一条记录 - "provider:hosts" # 可以是由 data-provider 提供的外部数据,格式 "provider:tag"。 circle-exclamation 虽然都叫 hosts,但本插件所用的格式和平常 Win,Linux 系统内的那个 hosts 文件不一样。 格式: * 域名规则在前,IP 在后。支持一行多个 IP,支持 IPv6。 * 如果域名匹配规则的方式被省略,则默认是 `full` 完整匹配。域名匹配规则详见 [这里](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#yu-ming-pi-pei-gui-ze) 。 格式示例: Copy # 支持一行多个 IP dns.google 8.8.8.8 2001:4860:4860::8888 ... ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#preferipv46-you-xian-shi-yong-ipv46) \_prefer\_ipv4/6 优先使用 ipv4/6 `_prefer_ipv4` 和 `_prefer_ipv6` 是预初始化插件,可直接使用。下面为了表述方便,仅以 `_prefer_ipv4` 为例。`_prefer_ipv6` 同理。 `_prefer_ipv4` 可用让下游客户端支持双栈时优先使用 IPv4。`_prefer_ipv4` 会自动探测域名是否是双栈,然后只屏蔽双栈域名的 AAAA 请求。相比于强行禁用所有 AAAA 请求的方案,该插件不会影响纯 IPv6 域名的解析。 使用位置要求: 插件的后续序列中必须有转发请求的插件。 流水线逻辑: * 正向:同时请求 A 和 AAAA。 * 反向:根据 A 和 AAAA 的结果,判断域名双栈支持状况,决定屏蔽策略。 sequence 示例: Copy - _prefer_ipv4 - ... - forward_xxx # 配合 if 可以实现仅特定域名生效 - if: domain_matcher exec: - _prefer_ipv4 - ... - forward_xxx ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#ecs-wei-qing-qiu-fu-jia-ecs) ecs 为请求附加 ECS 流水线逻辑: * 正向:附加 ECS 至请求。 * 反向:保证请求与应答 ECS 一致。如果源请求中无 ECS (现有 ECS 是插件新附加的),则删除应答中的 ECS 回应。 初始化参数说明: Copy tag: "" type: "ecs" args: auto: false # 是否自动将用户请求的来源地址作为 ECS 附加到请求。 # 如果为 true,则预设地址不会被使用。 # 仅适用于公网的服务器。本地运行不要启用这个功能。 ipv4: "1.2.3.4" # 预设的 IPv4 地址。会优先附加在 A 请求里。 ipv6: "2001:dd8:1a::" # 预设的 IPv6 地址。会优先附加在 AAAA 请求里。 force_overwrite: false # 如果请求已有 ECS,是否强制覆盖。 mask4: 24 # 用于 ipv4 地址的掩码。默认: 24。 mask6: 48 # 用于 ipv6 地址的掩码。默认: 48。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#noecs-shan-chu-qing-qiu-he-ying-da-zhong-de-ecs) \_no\_ecs 删除请求和应答中的 ECS `_no_ecs` 是预初始化插件的 tag,可直接使用。 流水线逻辑: * 正向:删除请求中的 ECS。 * 反向:删除应答中的 ECS。 一般放在转发插件前。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#ttl-xiu-gai-ying-da-de-sheng-cun-shi-jian) ttl 修改应答的生存时间 流水线逻辑: * 正向:修改应答的生存时间。 * 反向:无。 使用位置:一般放在转发插件后。 初始化参数说明: Copy tag: "" type: "ttl" args: minimal_ttl: 300 # 最小TTL。如果非零,小于这个数的应答的TTL会被修改成这个值。 maximum_ttl: 3600 # 最大TTL。如果非零,大于这个数的应答的TTL会被修改成这个值。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#blackhole-diu-qi-ying-da-huo-sheng-cheng-jia-ying-da) blackhole 丢弃应答或生成假应答 `blackhole` 会丢弃应答,或生成特定应答来屏蔽请求。 以下预初始化的插件 `tag` 可直接使用: * `_drop_response`: 丢弃已存在的应答。 * `_new_empty_response`: 生成 Rcode 为 0 的空应答。放入“请求上下文”。(模拟域名存在但没有所请求类型的记录) * `_new_servfail_response`: 生成 Rcode 为 2 (SERVFAIL: 服务器失败)应答。放入“请求上下文”。 * `_new_nxdomain_response`: 生成 Rcode 为 3 (NXDOMAIN: 域名不存在)应答。放入“请求上下文”。 流水线逻辑: * 正向:丢弃或生成对应应答。 * 反向:无。 初始化参数说明: Copy tag: "" type: "blackhole" args: rcode: 0 # 生成`Rcode`为该值的应答。如果负数,则将应答设为空值(丢弃已存在的应答)。 ipv4: # 如果请求类型是 A,则生成包含这些 IP 地址的应答。 - "127.0.0.1" ipv6: # 如果请求类型是 AAAA,则生成包含这些 IP 地址的应答。 - "::1" ipv4 和 ipv6 的优先级高于 rcode。如果都配置了, A/AAAA 请求会生成 IP 应答,其余类型会生成状态为 RCODE 的应答。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#fastforward-zhuan-fa-qing-qiu-zhi-shang-you-zi-dai-mo-kuai) fast\_forward 转发请求至上游(自带模块) mosdns 自带模块。 流水线逻辑: * 正向:转发请求至上游,获取应答后放入“请求上下文”。 * 反向:无。 初始化参数说明: Copy tag: "" type: "fast_forward" args: # 上游服务器。至少要配置一个。可配置多个,会并发请求全部服务器。 upstream: - addr: "https://dns.google/dns-query" dial_addr: "8.8.8.8" bootstrap: "" socks5: "127.0.0.1:1080" trusted: true idle_timeout: 30 enable_pipeline: false enable_http3: false max_conns: 2 insecure_skip_verify: false so_mark: 0 bind_to_device: "" - addr: "tcp://8.8.8.8" enable_pipeline: true ca: [ ] * `addr` 必需。服务器地址。省略 scheme 默认为 UDP 协议。省略端口号会使用协议的默认值。支持 IP 和域名。格式示例: * UDP: `8.8.8.8`, `208.67.222.222:443` * TCP: `tcp://8.8.8.8` * DoT: `tls://8.8.8.8:853`, `tls://dns.google` * DoH (RFC8484 GET): `https://8.8.8.8/dns-query`, `https://dns.google/dns-query` * UDPME(v3.5.1+)(实验性): `udpme://8.8.8.8` * 这是个能过滤掉 UDP 抢答应答的方案。仍然是 UDP 协议。服务器必须支持 EDNS0。如果抢答者不支持 EDNS0,则可以过滤抢答应答。 * 使用 dig 测试 `dig +edns cloudflare.com @服务器地址` 观察返回是否有一行 `EDNS: version: 0` 来确定服务器是否支持 EDNS0。绝大多数服务器都支持。 * 优先使用 IP 地址(如果服务器官方提供)。如果 `addr` 包含域名,插件需要将其解析成 IP 地址。 * `dial_addr`: 为包含域名的 `addr` 手动指定其 IP 地址。支持端口号。指定后插件连接服务器时无需先解析服务器的域名。能更快建立连接。适用于 IP 万年不变的服务器。 * `bootstrap`: (v4.2+)(实验性) 手动指定用于解析 `addr` 中域名的 bootstrap 服务器。只能是 UDP 服务器。指定后插件**每次**连接服务器时会先通过该 bootstrap 服务器解析域名。bootstrap 服务器的延时越低越好。HTTP/3 暂不支持该选项。仅支持 Win,Unix 平台。Macos,Plan9 等不支持。 * 系统默认解析: 以上两个参数留空,会使用默认系统解析方式。 * 优先级: `dial_addr` > `bootstrap` > 系统默认。 * `socks5`: socks5 服务器地址。格式 `host:port`。数据将会通过该代理中转。暂不支持用户名密码认证。UDP 和启用了 HTTP3 的 DoH 协议暂不支持该设定。 * `trusted`: 是否是可信服务器。可信服务器的任何应答都会被接受。其余服务器只接受 RCODE 为 0 (SUCCESS) 的应答。第一个服务器一定是可信服务器且不可修改。其余默认不可信。 * `idle_timeout` TCP/DoT/DoH 连接复用空连接保持时间。单位: 秒。默认 DoH: 30 ,TCP/DoT: 10。一般不需要改。 * `enable_pipeline`: TCP/DoT 使用 RFC 7766 新的 query pipelining 连接复用模式。 * 启用后可大幅提高连接利用率,减少建立连接/握手的次数,进而降低延时。 * 并非所有服务器都支持。必须确定服务器支持后再启用该选项。 * Tips: 已知 Google 和 Cloudflare 的 TCP/DoT 都是支持的。知名的公共 DNS 服务商大多数都支持该模式。mosdns 自带一个测试命令可以测试服务器是否支持该模式。 * `enable_http3`: (v3.4.0+)(实验性) DoH 使用 HTTP/3 连接服务器。并非所有服务器都支持。必须确定服务器支持后再启用该选项。Tips: 已知 Google 和 Cloudflare 是支持的。 * `max_conns`: 默认: 2。一般不需要改。大流量场景可适当调大。 * UDP 协议: 收发数据包使用的套接字数。 * 启用了 query pipelining 模式的 TCP/DoT 协议: 最大连接数。 * DoH 协议: HTTP 的最大连接数。HTTP/3 除外。 * `insecure_skip_verify`: 禁用 TLS 服务器证书验证。 * Linux 套接字设定。需要 `CAP_NET_ADMIN` 权限 * `so_mark`:(v3.7+)。设定 SO\_MARK。 * `bind_to_device`: (v4.3+) 设定 SO\_BINDTODEVICE。 * `ca`: 用于 TLS 验证的 CA 证书路径。是数组,可填入多个证书。默认使用系统证书池。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#forward-zhuan-fa-qing-qiu-zhi-shang-you-dnsproxy) forward 转发请求至上游(dnsproxy) 这个插件使用了 AdguardHome 的请求模块 [dnsproxyarrow-up-right](https://github.com/AdguardTeam/dnsproxy/tree/master/upstream) 。 流水线逻辑: * 正向:转发请求至上游,获取应答后放入“请求上下文”。 * 反向:无。 初始化参数说明: Copy tag: "" type: "forward" args: # 上游服务器。可配置多个。至少要配置一个。会并发请求全部服务器。 upstream: - addr: "https://dns.google/dns-query" # 必需。服务器地址。 # 当服务器地址为域名时,手动指定服务器的 IP 地址。可以配置多个。 # 如果配置了,则不会使用 bootstrap 服务器。会按顺序尝试连接配置的 IP。 ip_addr: - "8.8.8.8" - addr: "https://1.1.1.1/dns-query" # 用于解析上游服务器域名的 bootstrap 服务器地址。可配置多个。为空会使用系统默认方式解析域名。 # 服务器地址不能包含域名。注意,dnsproxy 的 bootstrap 只会在启动时解析一次。服务器的 IP 在运行时不 # 会自动更新。如需更新服务器的 IP,请重启。 bootstrap: - "tls://1.1.1.1" - "https://223.5.5.5/dns-query" # ... timeout: 5 # 请求超时时间,单位: 秒。 insecure_skip_verify: false # 禁用 TLS 身份验证。 `addr` 地址格式和 AdguardHome 支持的格式一致。一些示例: * UDP: `8.8.8.8`, `208.67.222.222:443` * TCP: `tcp://8.8.8.8` * DoT: `tls://dns.google` * DoH: `https://dns.google/dns-query` * DoH3: `h3://dns.google/dns-query` * DoQ: `quic://dns.adguard.com` * DNS stamp: `sdns://...` 详见 [dnscrypt.infoarrow-up-right](https://dnscrypt.info/stamps-specifications) 上述列表和参数说明不一定是最新的,请以 [dnsproxy 的 READMEarrow-up-right](https://github.com/AdguardTeam/dnsproxy) 为准。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#ipset-jiang-ying-da-ip-xie-ru-dao-xi-tong-ipset) ipset 将应答 IP 写入到系统 ipset 流水线逻辑: * 正向:将应答 IP 写入 ipset。 * 反向:无。 初始化参数说明: Copy tag: "" type: "ipset" args: set_name4: "" # 将 ipv4 地址写入这个 set。这个 set 的 family 类型需为 `inet`。 set_name6: "" # 将 ipv6 地址写入这个 set。这个 set 的 family 类型需为 `inet6`。 mask4: 0 # 写入 ipv4 地址时使用的掩码。默认: 24。 mask6: 0 # 写入 ipv6 地址时使用的掩码。默认: 32。 * 插件添加新 IP 时相当于执行了 `ipset add /` 命令。 * 插件使用 netlink 直接与内核通信,不依靠 `/sbin/ipset` 命令。 * 该插件不会创建 set。set 需要由用户提前创建。必须为 `hash:net` 类型。建议设置非零的 `timeout` 属性。实现自动清除长时间没有用到的地址。 创建 ipset 表命令示例: Copy ipset create hash:net family inet timeout 86400 maxelem 130050 ipset create hash:net family inet6 timeout 86400 maxelem 130050 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#nftset-jiang-ying-da-ip-xie-ru-dao-xi-tong-nftables) nftset 将应答 IP 写入到系统 nftables 流水线逻辑: * 正向:将应答 IP 写入 nftables。 * 反向:无。 初始化参数说明: Copy tag: "" type: "nftset" args: table_family4: "" # 存 IPv4 地址的 table family 类型。 table_family6: "" # 存 IPv6 地址的 table family 类型。 table_name4: "" # 存 IPv4 地址 table 的名字。 table_name6: "" # 存 IPv6 地址 table 的名字。 set_name4: "" # 存 IPv4 set 的名字。 set_name6: "" # 存 IPv6 set 的名字。 mask4: 0 # 如果 set 带有 interval flag。写入 IPv4 地址时使用的掩码。默认: 24。 mask6: 0 # 如果 set 带有 interval flag。写入 IPv6 地址时使用的掩码。默认: 32。 * 插件添加新 IP 时相当于执行了 `nft add element {/...}` 命令。 * 插件使用 netlink 直接与内核通信,并不依靠 `/sbin/nft` 命令。 * 该插件不会创建对应的 set。set 需要由用户提前创建。 * set 建议设置 `timeout` 来实现自动清除长时间没有用到的地址。 * set 建议设置 `interval` flag。插件会自动识别这个 flag,然后会以 IP 段的方式存储 IP。 创建 nftables set 命令示例: Copy nft add table inet nft add set inet {type ipv4_addr\; timeout 7d3h8m45s \; flags interval\;} nft add set inet {type ipv6_addr\; timeout 7d3h8m45s \; flags interval\;} ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#bufsize-xian-zhi-qing-qiu-de-edns0-de-udp-fu-zai-da-xiao) bufsize 限制请求的 EDNS0 的 UDP 负载大小 旧插件。建议使用新的 \_misc\_optm 插件。 流水线逻辑: * 正向:修改请求的 EDNS0 UDPSIZE (如果请求有 EDNS0)。 * 反向:无。 初始化参数说明: Copy tag: "" type: "bufsize" args: size: 512 # EDNS0 UDP 负载大小上限。默认 512。最大 4096。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#padding-tian-chong-dns-bao-wen-zhi-gu-ding-chang-du-shi-yan-xing) padding 填充 DNS 报文至固定长度 (实验性) 参考 RFC 8467,使用 EDNS0 的 Padding Option 将 DNS 报文用 0 填充至固定长度。据 Google 说 ([Google Plublic DNS 文档arrow-up-right](https://developers.google.com/speed/public-dns/docs/doh#privacy_best_practices) ) 能防止流量分析保护隐私。包含 3 个预定义插件。 `_pad_query`: 填充请求 * 流水线逻辑: * 正向:将请求填充至 128 bytes。 * 反向:无。 * 使用位置要求: 该插件到转发插件之间不能有修改请求的插件。否则请求大小可能会变,影响效果。 `_enable_conditional_response_padding` 和 `_enable_response_padding`: 填充应答: * 流水线逻辑: * 正向:无。 * 反向:填充应答至 468 bytes。`_enable_response_padding` 是如果客户端请求包含 EDNS0,就会填充应答。而 `_enable_conditional_response_padding` 则是如果客户端对请求进行了填充,才会填充应答。 * 使用位置要求: 反向流水线填充应答后,直至流水线结束,不能有修改应答的插件。否则应答大小可能会变,影响效果。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#redirect-ti-huan-qing-qiu-de-yu-ming-shi-yan-xing) redirect 替换请求的域名 (实验性) 替换(重定向)请求的域名。请求域名 A,但返回域名 B 的记录。 流水线逻辑: * 正向:替换请求的 QUESTION NAME。比如将请求域名 A 替换为 B。 * 反向:修改应答的 ANSWER 的 NAME,比如将 B 替换回 A。使之看起来像请求 A 的记录。 注意: 没有能完美替换请求域名的方法。本插件的替换方式对于常见的 A,AAAA,TXT 等仅依赖 QUESTION 和 ANSWER 的请求是有效的。但不保证兼容其他类型请求以及各种 EDNS0 扩展。 初始化参数说明: Copy tag: "" type: "redirect" args: rule: # 格式 [域名匹配规则] [重定向至域名] - www.google.com dns.google - provider:tag # 可以是由 data-provider 提供的外部数据。 * `域名匹配规则`: 如果匹配方式被省略,则默认是 `full` 完整匹配。域名匹配方式详见 域名匹配规则。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#arbitrary-fan-hui-ren-yi-ji-lu-shi-yan-xing-v4.0) arbitrary 返回任意记录 (实验性) (v4.0+) arbitrary 可以载入任意记录,并在匹配到对应请求时生成包含这些记录的应答, 流水线逻辑: * 正向:如果找到对应记录,则生成应答,终止跳过后续流水线。如果不在,则继续执行后续流水线。 * 反向:无。 初始化参数说明: Copy tag: "" type: "arbitrary" args: rr: - example.com. 300 IN A 192.0.2.1 # 可以是文本格式的记录。 - _sip._tcp.example.com. 86400 IN SRV 0 5 5060 sipserver.example.com. 不同记录的文本格式请自行搜索。关键词: `<记录类型> dns record wikipedia`。在英文 wikipedia 可以直接找到绝大多数记录的格式。 暂不支持从外部数据载入记录。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#miscoptm-zhuan-fa-fu-wu-qi-you-hua-da-za-hui-shi-yan-xing-v4.0) \_misc\_optm 转发服务器优化大杂烩 (实验性) (v4.0+) 预定义插件,可直接使用。 适用于转发服务器。 流水线逻辑: * 正向: * 屏蔽掉互联网公共上游不能处理的请求(多个 QUESTION 和非 IN CLASS)。(立刻返回 REFUSE,跳过后续流水线。) * 将 EDNS0 UDPSIZE 限定在 1200。(v4.5+) * 反向 * 去除 A/AAAA 应答的 CNAME 记录。减小应答长度。 * 去除应答的 Padding。减小应答长度。 * 随机打乱 A/AAAA 应答的 IP。负载均衡。 * 如果请求无 EDNS0,去除上游应答的 EDNS0。保持 EDNS0 状态一致。 建议流水线位置: 流水线起始。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#reverselookup-ip-fan-cha-yu-ming-api-v4.2-shi-yan-xing) reverse\_lookup IP 反查域名 API (v4.2+)(实验性) 该插件会缓存应答中的 IP 与 域名的关系。可在本地实现无延时的"有效 IP -> 域名"查询。支持 PTR 和 HTTP API。 流水线逻辑: * 正向:如果是 PTR 请求,并且命中缓存,则生成应答,跳过后续流水线。如果没有命中缓存,则继续执行后续流水线。 * 反向:将 A/AAAA 应答的 IP 写入缓存。 初始化参数说明: Copy tag: "" type: "reverse_lookup" args: size: 65535 # 内置缓存大小。默认 65535。 # redis-server 外部缓存地址。填入外部缓存会自动禁用内置的内存缓存。上文的 size 参数会被忽略。 # redis-server 需要 v2 及以上版本。如果多个 cache 插件连接到同一个 redis 数据库,数据是共享的。 # reverse_lookup 会为设定记录的 TTL,不会主动删除 redis-server 内的记录。内存大小清理方式等由 # redis-server 负责。 # reverse_lookup 假设 redis-server 的距离很近/延时很低而且性能足够。 # TCP 连接: `redis://:@:/` # Unix 连接: `unix://:@?db=` redis: "redis://localhost:6379/0" # 缓存时间。秒。默认 1800 (30min)。应答记录的 TTL 也会被自动修改,限制在该值以下。 ttl: 1800 # 是否主动处理/响应 PTR 请求。如果 PTR 的 IP 命中缓存,则生成应答后自动 _return,跳过后续插件运行。 # 没有命中缓存则不会主动响应。会继续传递给后续插件。 # 该功能的一个用途是,当下游设备使用网络监视类工具查看网络连接时,开启域名反查功能大概率会看到 IP 对应的 # 真实域名(如果程序先请求域名再建立连接,而且域名经过了该插件处理。) handle_ptr: false 建议流水线位置: 流水线起始。务必放在 `cache` 前,防止 `cache` 命中缓存后不执行 `reverse_lookup` 导致无法记录 IP。 查找缓存中 IP 对应域名的 API:`http:///plugins/?ip=` 返回: 如果缓存中找到对应域名,则返回域名。如果缓存中没有找到对应域名,则返回空。如果参数不对则返回 HTTP 400。 示例: `http://127.0.0.1:8080/plugins/my_reverse_lookup?ip=8.8.8.8`,返回 `dns.google.` 注意返回的是 fully qualified 域名,末尾有 `.`。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#metricscollector-tong-ji-shu-ju-shou-ji-qi-v4.2-shi-yan-xing) metrics\_collector 统计数据收集器 (v4.2+)(实验性) 收集 prometheus metrics 数据。 流水线逻辑: * 正向:query\_total =+1,thread =+1,response\_latency\_millisecond 开始计时。 * 反向:err\_total =+1 (如果出错),thread =-1,response\_latency\_millisecond 结束计时。 Copy tag: "" type: "metrics_collector" # 没有 args 参数。 请求经过插件时,插件会收集 * query\_total 经过该插件的总请求数。 * err\_total 插件所在 sequence 的后续插件的总出错数。 * thread 当前经过该插件的线程数。 * response\_latency\_millisecond 插件所在 sequence 的后续插件的应答延时。 数据项名称为 `mosdns_plugin__`。 建议流水线位置: 放在流水线起始位置就可以统计本条流水线的数据。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#clientlimiter-xian-zhi-ke-hu-duan-de-qps-v4.2-shi-yan-xing) client\_limiter 限制客户端的 QPS (v4.2+)(实验性) 限制客户端(以 IP 或 IP 段区分)的最大每秒请求数 QPS。 流水线逻辑: * 正向:如果客户端 QPS 超过阈值,则生成 REFUSE 应答,跳过后续流水线。 * 反向:无。 Copy tag: "" type: "client_limiter" args: max_qps: 100 # 最大 QPS。客户端的请求数超过时,会 REFUSED 然后 _return。 v4_mask: 32 # ipv4 的 mask。用于限制整个 IP 段。默认 32。 v6_mask: 48 # ipv6 的 mask。默认 48。 建议流水线位置: 流水线起始。 注意: 该插件只能用于向非恶意客户端“友好”地回复 REFUSED。不能防攻击。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#edns0filter-guolqing-qiu-de-edns0-option-shi-yan-xing-v4.4.1) edns0\_filter 过滤请求的 EDNS0 OPTION (实验性)(v4.4.1+) 过滤/限制客户端可以使用 EDNS0 OPTION。 TIps: 如果后面配置有启用了 cache\_everything 的 cache 插件,该插件可用于提高缓存利用率。比如移除 Cookie 和 Padding,或只允许 ECS。 流水线逻辑: * 正向:从请求中移除/保留指定的 EDNS0 OPTION。 * 反向:无。 以下预初始化的插件 `tag` 可直接使用: * `_edns0_filter_no_edns0`: 删除应答的 EDNS0。 * `_edns0_filter_ecs_only`: 只保留 ECS。 初始化参数说明: Copy tag: "" type: "edns0_filter" args: accept: [0,1,2] # 仅接受这些 EDNS0 OPTION。其余的将被移除。 discard: [0,1,2] # 仅移除这些 EDNS0 OPTION。其余的将被保留。 # accept 和 discard 只生效一个。优先级 accept > discard。如果全为空,则插件会 # 移除所有的 EDNS0 OPTION (相当于不接受任何 EDNS0 OPTION)。 建议流水线位置: 流水线起始,cache 前,转发插件前。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#querysummary-v4.5.3-ji-lu-qing-qiu-zhai-yao) \_query\_summary (v4.5.3+) 记录请求摘要 在 info 级别记录请求。包括请求的域名,类型,客户端地址,应答状态,请求处理时间等。 建议流水线位置: 流水线起始,cache 前。 注: 如果请求没有或有多个 QUESTION,则不会有记录。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#sleep-yan-shi-zhi-xing) sleep 延时执行 调试。模拟延时用。 流水线逻辑: * 正向:延时。 * 反向:无。 初始化参数说明: Copy tag:: "" type: "sleep" args: duration: 100 # 等待时间。单位: 毫秒。 [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#pi-pei-qi-cha-jian) 匹配器插件 ----------------------------------------------------------------------------------------------------------------------- 匹配器插件匹配请求和应答状态,返回 `true` or `false`。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#querymatcher-pi-pei-qing-qiu-de-te-zheng) query\_matcher 匹配请求的特征 以下预初始化的插件 `tag` 可直接使用: * `_qtype_AAAA`: 请求的 QTYPE 是 AAAA。 * `_qtype_A_AAAA`: 请求的 QTYPE 是 A 或 AAAA。 * `_query_edns0`: 请求包含 EDNS0。 初始化参数说明: Copy tag: "" type: "query_matcher" args: qtype: [1, 2, 3] # 匹配 QTYPE qclass: [1, 2, 3] # 匹配 QCLASS domain: # 匹配请求域名。这是个`域名匹配器`。详见下文。 - "google.com" client_ip: # 匹配客户端 IP 。这是个 `IP 匹配器`。详见下文。 - "192.168.1.1/24" ecs: # 匹配 ECS 的 IP 。这是个 `IP 匹配器`。详见下文。 - "192.168.1.1/24" 如果一个匹配器内设定了多个条件,则必须满足全部条件这个匹配器才会为 `true`。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#responsematcher-pi-pei-ying-da-de-te-zheng) response\_matcher 匹配应答的特征 以下预初始化的插件 `tag` 可直接使用: * `_response_valid_answer`: 应答包含有效的 ANSWER 记录(ANSWER 中有记录能与 QUESTION 对应)。(v4.0.0+) 初始化参数说明: Copy tag: "" type: "response_matcher" args: rcode: [1, 2, 3] # 匹配 RCODE。 ip: # 匹配应答 A 和 AAAA 记录的 IP 。这是个 `IP 匹配器`。详见下文。 - "192.168.1.1/24" cname: # 匹配应答 CNAME 域名。这是个`域名匹配器`。详见下文。 - "google.com" 如果一个匹配器内设定了多个条件,则必须满足全部条件这个匹配器才会为 `true`。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#yu-ming-pi-pei-qi) 域名匹配器 配置示例: Copy # 可以是文本数据。域名匹配规则详见下文。 - "google.com" - "keyword:google" - "regexp:.+\.google\.com$" # 可以是由 data-provider 提供的外部数据,格式 "provider:tag"。 # 外部数据可以是包含多条文本数据的纯文本数据。 - "provider:data_tag" # 也可以是 v2ray 域名数据。多个标签用 "," 分割,标签后支持用 "@" 只载入有对应 attr 的数据。 # 多个 "@" 为"或"关系,域名只要有其中任意 attr 就会被载入。 - "provider:geosite:cn@attr@attr,us@attr..." 文本域名数据一条规则一行。如果域名匹配方式被省略,则默认是 `domain` 域匹配。 域名匹配规则说明详见: [这里](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#yu-ming-pi-pei-gui-ze) ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#ip-pi-pei-qi) IP 匹配器 配置示例: Copy # 可以是文本数据。每行一个 CIDR 或 IP,支持 IPv6。 - "192.168.1.1/24" - "2001:250::/31" - "192.168.1.1" # 可以是由 data-provider 提供的外部数据,格式 "provider:tag"。 - "provider:data_tag" # 可以是纯文本文件。包含多条文本数据。 - "provider:geoip:cn,us..." # 可以是 v2ray geoip 文件。多个标签用 "," 分割。 ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#guan-yu-v2ray-shu-ju-bao) 关于 v2ray 数据包 mosdns 支持从 v2ray 数据包 (俗称 dat 文件)载入数据,但受限于 v2ray 数据包的打包格式,mosdns 从中读取数据,无论读取多少,都要**完整解包**。多个插件读取多次会出现重复解包的情况。性能不好的设备(主要是嵌入式路由等)上可能造成 mosdns 启动时间显著变长(数秒)。其他设备影响不大。 优化 v2ray 数据包加载速度: * (推荐)自己提前解包: `mosdns v2dat` 小工具命令可以解包数据文件成独立的文本文件。 * 尽可能使用多标签 `geoip.dat:cn,us... 一次载入全部所需数据,而非多行。写成多行会造成重复解包。` [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#bu-chong) 补充 ---------------------------------------------------------------------------------------------------------- ### [hashtag](https://irine-sistiana.gitbook.io/mosdns-wiki/mosdns-v4/cha-jian-ji-qi-can-shu#yu-ming-pi-pei-gui-ze) 域名匹配规则 域名规则有多个匹配方式: * 以 `domain:` 开头,域匹配。e.g: `domain:google.com` 会匹配自身 `google.com`,以及其子域名 `www.google.com`, `maps.l.google.com` 等。 * 以 `full:` 开头,完整匹配。e.g: `full:google.com` 只会匹配自身。 * 以 `keyword:` 开头,关键字匹配。e.g: `keyword:google.com` 会匹配包含这个字段的域名,如 `google.com.hk`, `www.google.com.hk`。 * 以 `regexp:` 开头,正则匹配([Golang 标准arrow-up-right](https://github.com/google/re2/wiki/Syntax) )。e.g: `regexp:.+\.google\.com$`。 如果没有指定匹配方式,不同插件有不同的缺省值。 匹配方式按如下顺序生效: `full` > `domain` > `regexp` > `keyword`。 相同匹配方式的规则按如下顺序生效: * `domain` 规则: 子域名优先。比如如果同时存在规则 `google.com` 和 `com`。 `www.google.com` 会优先匹配 `google.com`,然后 `com`。(v3.9.0+) * `regexp` 和 `keyword` 规则生效顺序为规则导入的顺序。 性能: * `domain` 和 `full` 匹配使用 HashMap,复杂度 O(1)。每 1w 域名约占用 1M 内存。 * `keyword` 和 `regexp` 匹配需遍历,复杂度 O(n)。 到底了!没有找到想要的功能么?提交一个 [Feature requestarrow-up-right](https://github.com/IrineSistiana/mosdns/issues/new?assignees=&labels=&template=feature_request.md&title=%5BFeature+request%5D) 。 Last updated 3 years ago ---