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_rule的badfilter解析改为一次构建 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
nftsetinterval 集合写入被内核以 EINVAL 拒绝的问题、ipset创建集合时hashsize/maxelem字节序错误,并完善 WebUIquery_recorder标签列表纵向溢出。同时为black_hole插件文档加入"行为将在后续版本改造"的预告。本版本不引入破坏性配置变更。
主要变更
- 修复
nftsetinterval 集合的 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.3;oxidns-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的部署强烈建议升级;如果集合由外部ipsetCLI 预先创建,本次修复不影响已存在的集合。 black_hole当前行为未变化,但建议关注后续版本的语义重设计;现阶段用于域名级拦截时推荐显式同时配置 IPv4 与 IPv6 兜底地址(如black_hole 0.0.0.0 :: short_circuit),或改用reject 3。
v1.1.2
版本定位
- Patch Release,重点修复 Linux
nftset在flags 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_recorderSSE 流现在能容忍非 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.2;oxidns-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 现在支持.ziparchive 解包、二进制替换和 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 的问题,并明确
bootstrap与dial_addr的解析优先级。
主要变更
- 修复
forward插件地址校验复用完整ConnectionInfo构造逻辑的问题。域名型 upstream 现在只做地址格式校验,不会在启动校验阶段触发系统 DNS 解析。 - 调整 upstream 连接信息构造:仅字面 IP 和显式
dial_addr会在启动阶段写入连接目标 IP;域名保留为server_name,后续由bootstrap或首次建连时的系统解析处理。 - 明确
dial_addr与bootstrap同时配置时的互斥行为: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,未引入新的必填配置字段。- 未配置
bootstrap或dial_addr的域名型 upstream 不再阻塞启动;首次建连时仍会使用系统解析。 - 如需完全避免运行期对本机 DNS 的依赖,域名型 upstream 建议在
bootstrap和dial_addr中二选一配置。 - 同时配置
bootstrap和dial_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.2DNS 解析配置通常可直接升级;v1.0.0主要引入完整 WebUI、管理 API、指标和打包能力。 - 从旧项目名版本升级时,不能依赖旧的自动更新流程跨过项目更名边界;请手动下载
v1.0.0release 包并完成迁移。 - 管理 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 error或H3 send_request error(Closed #78)。 - 修复 upstream
timeout字段无法从配置文件正确解析的问题。timeout: 3和timeout: "3s"均可正常反序列化并用于 forward 插件初始化(Closed #79)。 - 补充统一的 duration 配置解析逻辑,支持
ms、s、m、h、d等单位,未带单位的数字默认按秒处理。
配置与升级说明
- 本次发布不引入新的必填配置字段,
v0.5.1配置可直接升级。 timeout、idle_timeout等 duration 配置项支持3、"3"、"3s"、"500ms"等写法。- 未带单位的 duration 数字会按秒解析;毫秒级配置应显式使用
ms后缀。 - 对于配置了 upstream
timeout,或使用 DoH / DoH3 上游并遇到长时间运行后持续请求失败的部署,建议升级到v0.5.2。