跳到主要内容

2026 年 5 月版本

本页归档 2026 年 5 月发布记录。

2026-05

v1.1.4

版本定位

  • Patch Release,重点优化 provider 与规则匹配路径的内存占用与重载开销,并修复 WebUI 在移动端的配置编辑器与插件筛选可用性、查询记录图表标签显示,及 Monaco 编辑器改为本地自托管。同时新增"从 mosdns 迁移"文档。本版本不引入破坏性配置变更,查询热路径行为保持不变。

主要变更

  • client_ip / resp_ip / ptr_ip 内联 IP 匹配器编译后改用 finalize_compact,不再保留一份重复的源 IP 区间副本(ip_set / geoip 此前已如此)。
  • finalize_compact 现在将合并后的 IPv6 区间移动进编译结构,而非克隆。
  • geoip 加载时通过 add_v4_network / add_v6_network 直接喂入 CIDR 字节,省去每条记录 String 格式化再重新解析的往返,加快加载与 reload。
  • adguard_rulebadfilter 解析改为一次构建 HashSet,替换原先每次比较都重新分配 cache key 的 O(n²) 扫描。
  • 修复 WebUI 配置编辑器与插件筛选在移动端无法正常使用的问题。
  • 修复 WebUI 查询记录图表 Top-N 标签被截断、无法完整显示的问题。
  • WebUI Monaco 编辑器改为本地自托管,不再从 jsdelivr CDN 加载,便于离线或受限网络环境下使用。
  • 文档:新增"从 mosdns 迁移"指南。

配置与升级说明

  • 根 crate 版本号升级为 1.1.4;本版本无 crates/ 子 crate 改动,无需同步升级;release tag 应使用 v1.1.4
  • v1.1.3 配置可直接升级到 v1.1.4,未引入新的必填配置字段。
  • provider / 匹配器优化为内部实现改进,不改变匹配语义与查询热路径行为,无需调整配置。
  • 受限或离线网络环境下使用 WebUI 配置编辑器的部署可受益于 Monaco 本地自托管,无需访问外部 CDN。

v1.1.3

版本定位

  • Patch Release,重点修复 Linux nftset interval 集合写入被内核以 EINVAL 拒绝的问题、ipset 创建集合时 hashsize / maxelem 字节序错误,并完善 WebUI query_recorder 标签列表纵向溢出。同时为 black_hole 插件文档加入"行为将在后续版本改造"的预告。本版本不引入破坏性配置变更。

主要变更

  • 修复 nftset interval 集合的 ADD / DEL / TEST 编码:ADD / DEL 改为 nft 用户态使用的两元素列表形式,解决真实内核以 EINVAL 拒绝写入的问题(issue #127);TEST 改为仅发送起始 key,交由内核 interval 树判定包含关系。同时修正元素 timeout 的字节序,并放宽 dump 解析对孤立 INTERVAL_END 锚点的容错。
  • 修复 ipset 创建集合时 hashsize / maxelem 以本机字节序写入的问题:小端主机上 hashsize=2048 会被内核读成 524288。同时移除多余的 IPSET_ATTR_LINENO=0 嵌套属性,与 libipset 行为对齐。
  • 大幅扩充 ripset 报文格式单元测试与 ipset 集成测试覆盖。
  • 修复 WebUI query_recorder 详情面板长内容时标签栏纵向溢出。
  • 文档:在 black_hole 执行器章节加入醒目提示,说明后续版本将引入 mode 字段(nxdomain / nodata / null / custom / refused)以覆盖所有 qtype,并解释重设计的动机;现版本行为保持不变。

配置与升级说明

  • 根 crate 版本号升级为 1.1.3oxidns-ripset 同步升级到 0.1.2;release tag 应使用 v1.1.3
  • v1.1.2 配置可直接升级到 v1.1.3,未引入新的必填配置字段。
  • 在 Linux 上使用 nftset 插件、且集合声明了 flags interval 的部署强烈建议升级,否则 ADD / DEL 会在真实内核上以 EINVAL 失败。
  • 在 Linux 上通过 OxiDNS 创建 ipset 集合并显式设置 hashsize / maxelem 的部署强烈建议升级;如果集合由外部 ipset CLI 预先创建,本次修复不影响已存在的集合。
  • black_hole 当前行为未变化,但建议关注后续版本的语义重设计;现阶段用于域名级拦截时推荐显式同时配置 IPv4 与 IPv6 兜底地址(如 black_hole 0.0.0.0 :: short_circuit),或改用 reject 3

v1.1.2

版本定位

  • Patch Release,重点修复 Linux nftsetflags interval 集合上的写入失败、Windows 服务安装脚本问题,并完善 systemd 部署的工作目录语义、WebUI 运行日志与 query_recorder 排行查看体验。本版本不引入破坏性配置变更。

主要变更

  • 修复 nftset 执行器在小端主机上读取集合 flags 时使用本机字节序,导致 flags interval 集合的 is_interval 永远为 false,所有 CIDR 写入均以 Unsupported entry for set type 失败的问题;改为按大端解码并新增字节序回归测试。
  • nftset 写入器现在按前缀独立处理:将 IpSetError::ElementExists 视为可跳过的 no-op,仅在结构化 warn 日志中聚合 ok / skipped / failed 计数,不再因为单次 EEXIST 整体禁用插件。
  • 修复 Debian 打包的 systemd 单元因 WorkingDirectory 预启动 CHDIR 失败的问题;现以 -d/--working-dir 作为运行时相对路径(包含 WebUI 资源)的唯一基准。
  • 修复 Windows 安装/卸载脚本:调整服务管理流程、二进制路径处理与卸载顺序,避免残留进程或路径异常。
  • WebUI 运行日志查看器新增整行换行开关;同时后端 LogEntry.timestamp 升级到毫秒精度,UI 在 T+elapsed 旁补充本地 HH:MM:SS.mmm,方便与外部时间线对齐。
  • WebUI 的 JSON 响应与 query_recorder SSE 流现在能容忍非 JSON 错误、心跳帧、空载与异常事件,避免控制台在偶发网络抖动时报错。
  • query_recorder 移除 top client / top qname / slow-query 排行接口固定的 200 行上限,WebUI 排行榜和慢查询列表新增“加载更多”按钮以支持更大的结果集。
  • WebUI 插件字段说明文档与 Rust 插件配置同步刷新。
  • 文档站点新增 Hero 组件、改进安装步骤与 Docker 运行命令展示,新增多平台快速上手指引;补齐 Debian /etc/oxidns/var/lib/oxidns 目录约定、WebUI 符号链接说明与 client_ip 排错章节。

配置与升级说明

  • 根 crate 版本号升级为 1.1.2oxidns-ripset 同步升级到 0.1.1;release tag 应使用 v1.1.2
  • v1.1.1 配置可直接升级到 v1.1.2,未引入新的必填配置字段。
  • 在 Linux 上使用 nftset 插件、且集合声明了 flags interval 时强烈建议升级,否则该集合在小端架构上完全无法写入。
  • 通过 deb 包升级的部署,新版本不会再设置 systemd WorkingDirectory;如果此前依赖该值改写相对路径,请改用 -d/--working-dir 显式指定。
  • 已使用 query_recorder 排行接口的客户端可以传入更大的 limit;旧的 200 行响应仍能按原方式解析,行为兼容。

v1.1.1

版本定位

  • Patch Release,重点补齐 query_recorder 历史记录清理能力,并修复 WebUI 插件删除流程中的交互闭环问题。本版本不引入破坏性配置变更。

主要变更

  • query_recorder 新增 DELETE /api/plugins/<tag>/records 管理接口,可清空当前 recorder 的历史查询记录、执行路径 steps 和内存 tail;清空前会先 flush 后台写入队列,并返回 cleared_records
  • WebUI 查询记录面板新增“清空历史”按钮,提供二次确认、清空中状态反馈,并在完成后刷新记录列表、选中详情和插件命中统计。
  • WebUI 插件删除弹窗体验优化:引用提示弹窗加宽,长字段可换行,并更清晰展示引用来源、目标类型和不可安全移除的原因。
  • 修复插件删除弹窗取消后误打开插件详情抽屉的问题。
  • 修复“进入编辑器修复”会提前从插件中心移除插件的问题;现在该操作只进入编辑器,由用户手动处理引用。
  • 修复配置存在错误时删除 icon 常显且无法点击的问题;现在仍可打开弹窗查看错误原因。

配置与升级说明

  • 根 crate 版本号升级为 1.1.1;release tag 应使用 v1.1.1
  • v1.1.0 配置可直接升级到 v1.1.1,未引入新的必填配置字段。
  • query_recorder 清空历史是可选管理能力,不影响现有查询记录采集、保留期清理或统计查询行为。
  • “清空历史”操作不可撤销,会删除当前 recorder 已持久化的查询记录和路径事件;生产环境建议确认不再需要这些审计数据后再执行。

v1.1.0

版本定位

  • Minor Release,重点增强配置安全性、升级与重启流程、query_recorder 统计分析和 WebUI 运维体验,同时补齐插件文档导航与路线图。本版本包含 upgrade 配置的破坏性变更,请升级前检查相关配置或自动化脚本。

破坏性变更

  • upgrade 的重启配置已从枚举型 restart: none|service 和 CLI 参数 --restart <none|service> 改为布尔型 no_restart: true--no-restart
  • 默认行为也同步变化:upgrade apply 成功后现在会自动重启服务;需要保持旧版本“不自动重启”行为时,必须显式设置 no_restart: true 或传入 --no-restart

主要变更

  • 配置加载链路支持 YAML 环境变量占位符:${VAR}${VAR:-default}$${...}。占位符会在启动、oxidns check、管理 API 校验和保存前校验时展开,支持 include 路径,并在变量缺失或语法错误时报告变量名、行号和列号。
  • upgrade 流程重构为跨平台 apply:Windows 现在支持 .zip archive 解包、二进制替换和 WebUI 目录升级;zip 解包会拒绝不安全路径,避免 zip-slip。
  • upgrade 新增 GitHub token 支持,可用于提高 API 速率限制或访问私有仓库;CLI 使用 --github-token,插件配置使用 github_token
  • upgrade 成功后默认重启服务:CLI 通过系统服务管理器重启已安装服务,插件内升级通过应用控制通道触发优雅重启并加载新二进制。需要跳过重启时,CLI 使用 --no-restart,插件配置使用 no_restart: true
  • 应用控制面新增 POST /restart,进程在 Unix 上通过 exec 原地重启,在 Windows 服务场景下配合 SCM 重启,并在二进制替换前捕获原始可执行文件路径,避免 Linux 上 /proc/self/exe (deleted) 导致重启失败。
  • query_recorder 新增聚合统计 API 和 WebUI 图表:Top clients、Top qnames、qtype / rcode 分布、延迟直方图、慢查询排行和按分钟/小时聚合的查询趋势;SQLite 读写参数也针对统计查询做了优化。
  • WebUI 配置应用生命周期更清晰:顶层 runtime / api / log 等变更会提示重启而不是热重载;配置回滚会根据变更类型自动选择热重载或重启,并在重启过程中展示连接恢复状态。
  • WebUI 插件管理增强:删除插件前会检查依赖引用,可选择替换引用、移除可安全删除的引用,或进入编辑器手动修复;插件重命名会同步更新引用并在有影响时要求确认。
  • 文档更新插件总览和侧边栏导航,新增路线图页面,并补充 redirect 规则形式、qname / cname 域名规则说明、README 路线图与免责声明。

配置与升级说明

  • 根 crate 版本号升级为 1.1.0;release tag 应使用 v1.1.0
  • v1.0.2 的 DNS 解析配置通常可直接升级到 v1.1.0;环境变量占位符是新增能力,不使用占位符的配置行为保持不变。
  • Breaking Change:旧的 restart: none|service 和 CLI --restart <none|service> 已不再接受;请改用 no_restart: true / --no-restart。如果希望保持旧版本“升级后不自动重启”的行为,需要显式设置 no_restart: true 或传入 --no-restart
  • ${VAR} 占位符缺失会阻止配置解析;需要保留字面量 ${...} 时写作 $${...},环境变量值包含 YAML 特殊字符时建议给占位符加引号。
  • 新增 github_token / --github-token 为可选字段,不影响现有公开仓库升级配置。
  • 已启用 query_recorder 的部署无需修改配置即可使用新增统计 API 和 WebUI 图表;统计查询会读取 SQLite 历史数据,数据库较大时建议关注磁盘与查询延迟。

v1.0.2

版本定位

  • Patch Release,修复域名型 upstream 在启动和配置校验阶段依赖本机 DNS 的问题,并明确 bootstrapdial_addr 的解析优先级。

主要变更

  • 修复 forward 插件地址校验复用完整 ConnectionInfo 构造逻辑的问题。域名型 upstream 现在只做地址格式校验,不会在启动校验阶段触发系统 DNS 解析。
  • 调整 upstream 连接信息构造:仅字面 IP 和显式 dial_addr 会在启动阶段写入连接目标 IP;域名保留为 server_name,后续由 bootstrap 或首次建连时的系统解析处理。
  • 明确 dial_addrbootstrap 同时配置时的互斥行为:dial_addr 优先生效,bootstrap 会被忽略,并在初始化时输出 warning。
  • 更新 forward 插件参考文档和 WebUI 插件字段说明,补充域名解析时机、bootstrap / dial_addr 二选一建议以及运行期优先级。
  • 补充回归测试,覆盖域名 upstream 不预解析、dial_addr 保留 SNI 主机名,以及 dial_addr 覆盖 bootstrap 的行为。

配置与升级说明

  • 根 crate 版本号升级为 1.0.2;release tag 应使用 v1.0.2
  • v1.0.1 配置可直接升级到 v1.0.2,未引入新的必填配置字段。
  • 未配置 bootstrapdial_addr 的域名型 upstream 不再阻塞启动;首次建连时仍会使用系统解析。
  • 如需完全避免运行期对本机 DNS 的依赖,域名型 upstream 建议在 bootstrapdial_addr 中二选一配置。
  • 同时配置 bootstrapdial_addr 的现有配置仍可启动,但只有 dial_addr 生效。

v1.0.1

版本定位

  • Patch Release,修复 v1.0.0 中的 DNS 响应合规性问题、客户端 IP 规范化缺陷和 WebUI 使用问题,同时新增服务管理能力、安装器脚本和查询审计交互改进。

主要变更

  • 修复 redirect 插件合成 DNS 响应中 CNAME 未置于 answer section 首位的问题,确保与 RFC 规范对齐。
  • 修复双栈 socket 接收 IPv4-mapped IPv6 地址(::ffff:x.x.x.x)时,DnsContext 未将其规范化为真实 IPv4 地址,导致 client_ip 匹配器等依赖 IP 的逻辑错判。
  • 修复 WebUI 刷新页面出现 404 的问题,并在首次加载时自动连接 /api 后缀以适配全量后端托管场景。
  • 新增 service restart 命令,支持以系统服务方式运行时通过 CLI 重启 OxiDNS。
  • 新增 Linux / macOS / Windows 托管服务安装器脚本(install.sh / install.ps1),实现一条命令安装、注册并启动系统服务。
  • query_recorder 面板新增按 matcher 行点击过滤查询记录的能力,补充延迟着色视觉提示和 record-count 列名信息浮层。
  • WebUI 插件详情面板、缓存管理对话框和配置字段编辑器整体打磨:替换原生 confirm 为 shadcn AlertDialog、采用响应式双列布局、居中约束 max-w-6xl 内容区域。

配置与升级说明

  • 根 crate 版本号升级为 1.0.1;release tag 应使用 v1.0.1
  • v1.0.0 配置可直接升级到 v1.0.1,未引入新的必填配置字段。
  • 使用双栈 socket 且依赖 client_ip 匹配器、ECS 或 IP 相关策略的部署,升级后客户端 IP 将正确规范化为 IPv4。
  • 安装脚本默认将应用注册为系统服务;仅需便携安装时设置 OXIDNS_INSTALL_SERVICE=0

v1.0.0

版本定位

  • Major Release,标志 OxiDNS 从实验性插件化 DNS 引擎进入 1.0 稳定阶段。v1.0.0 正式内置 WebUI 管理控制台,并包含 v0.5.2 以来的管理 API、插件运行时、观测能力、发布打包和性能稳定性改进。

重要升级提醒

  • v1.0.0 完成项目名迁移,项目正式更名为 OxiDNS,GitHub 仓库、release asset、二进制文件名、包元数据、服务文件、README、文档站、logo 与启动 banner 均已切换到 oxidns
  • 由于旧版本的自动更新逻辑仍指向更名前的项目与旧 release 资产,无法直接更新到 v1.0.0。从旧版本升级到 v1.0.0 时,必须手动下载对应平台的 OxiDNS release 包,替换二进制文件,并同步部署包内 WebUI 静态资源。
  • 完成这次手动迁移后,后续版本应使用新的 svenshi/oxidns 仓库和 oxidns-* release 资产进行升级。

WebUI 能力

  • OxiDNS WebUI 将运行状态、配置、插件、指标、日志、查询审计和缓存管理集中到一个控制台中,日常运维不再依赖分散的命令行、日志文件和手写 API 调用。
  • 配置管理更适合生产环境:YAML 编辑、在线校验、配置历史、diff、应用与回滚集中在同一流程内,复杂策略调整可以先确认再生效,降低误改配置后的恢复成本。
  • 插件编排更直观:插件拓扑、插件详情、字段化配置和 sequence composer 帮助理解 DNS 请求处理链路,减少手写 YAML 时的引用错误、依赖遗漏和排查成本。
  • 故障定位更直接:指标、在线日志、查询记录、执行流和缓存详情可以串联查看,便于从异常域名追踪到命中规则、上游行为、缓存状态和最终响应。
  • 部署与访问更简单:WebUI 随 release archive、Docker 镜像、Debian 包和 upgrade 流程分发,也可由 OxiDNS 管理 API 直接托管静态资源,单个 OxiDNS 进程即可同时服务 API 与控制台。

主要变更

  • 管理 API 重构为带前缀的统一入口,新增认证/CORS、runtime state、日志流、指标、配置保存/应用/回滚、插件 API 汇聚等能力。
  • 插件体系从全局可变 registry 重构为不可变 catalog + runtime manager,插件工厂创建上下文更简洁,reload 路径更稳健,并将 registry 拆分为 catalog、context、init_plan、runtime 等模块。
  • 新增共享插件指标层,覆盖 server、forward upstream、cache、query recorder、side-effect executor 等路径,并统一暴露给管理 API。
  • query_recorder 具备 matcher 命中采样统计、过滤查询、执行流可视化和记录详情展示能力;相关 model 和 store 结构完成清理。
  • cache 新增管理 API,可读取缓存 DNS 响应详情、TTL、命中信息、记录内容和缓存快照。
  • upgrade、release、Docker、Debian packaging、systemd service 和 CI workflow 更新为 OxiDNS 1.0 发布链路。
  • 项目品牌从 ForgeDNS 完成迁移到 OxiDNS,更新 GitHub 模板和所有面向用户的项目标识。
  • 性能与稳定性方面,TCP upstream 禁用 Nagle、减少 split lock;dual-selector 探测逻辑从 forward 中解耦;支持 dual-stack port-only listener;全局 runtime manager reload 更稳健。
  • 文档系统更新 README、quickstart、configuration、API、plugin reference、scenarios、benchmarks 和 MikroTik policy routing。

配置与升级说明

  • 根 crate 版本号升级为 1.0.0;release tag 应使用 v1.0.0
  • 现有 v0.5.2 DNS 解析配置通常可直接升级;v1.0.0 主要引入完整 WebUI、管理 API、指标和打包能力。
  • 从旧项目名版本升级时,不能依赖旧的自动更新流程跨过项目更名边界;请手动下载 v1.0.0 release 包并完成迁移。
  • 管理 API 入口已收敛为带前缀的路由;如果外层反向代理、ACL 或脚本直接调用旧 API 路径,需要按新版 API 文档确认路径。
  • 使用自动升级、Docker 或 Debian 包部署时,建议同时确认控制台静态资源目录和服务文件已随新包安装。
  • 依赖插件 reload、配置在线编辑或运行时 API 的部署,建议先在测试环境验证权限、CORS、认证和回滚流程。

v0.5.2

版本定位

  • Patch Release,重点修复 DoH / DoH3 上游长连接复用和 upstream duration 配置解析问题。

主要变更

  • 修复 DoH(HTTP/2)和 DoH3(HTTP/3)上游连接池可能复用已关闭连接的问题。远端关闭空闲连接后,连接池会及时淘汰失效连接并重建可用连接,避免后续查询持续出现 H2 send_request errorH3 send_request error(Closed #78)。
  • 修复 upstream timeout 字段无法从配置文件正确解析的问题。timeout: 3timeout: "3s" 均可正常反序列化并用于 forward 插件初始化(Closed #79)。
  • 补充统一的 duration 配置解析逻辑,支持 mssmhd 等单位,未带单位的数字默认按秒处理。

配置与升级说明

  • 本次发布不引入新的必填配置字段,v0.5.1 配置可直接升级。
  • timeoutidle_timeout 等 duration 配置项支持 3"3""3s""500ms" 等写法。
  • 未带单位的 duration 数字会按秒解析;毫秒级配置应显式使用 ms 后缀。
  • 对于配置了 upstream timeout,或使用 DoH / DoH3 上游并遇到长时间运行后持续请求失败的部署,建议升级到 v0.5.2

返回版本更新索引