1.8.1
- 修复：manifest.json 的开发者/发布者字段名用错，应用列表里这两项一直是空的。
  平台读的是 maintainer / maintainer_url / distributor / distributor_url（安装器
  naixi 与固件 appmarket.sh 都按这几个名字取值写进 applist 表），而我们写的是
  author / homepage —— 全固件没有任何地方读它们，等于没写。现按平台字段补齐，
  并去掉 author / homepage / boot / icon 四个无人读取的字段（图标实际来自
  安装包里的 ui/ico/app.png，由安装器推导路径）。
  另补 requirements（memory / storage / os_min_version）：固件会校验 os_min_version
  的格式（xx.xx.xx），且固件内该字段的最低版本强制判断当前是注释掉的、不拦安装。

1.8.0
- 新增面板 HTTPS：默认开启，与 HTTP 共用同一个端口（9170）。
  为什么要做：面板登录是 HTTP Basic，明文 HTTP 下密码在链路上可被任何人读取。
  行为：https 正常提供服务；http 请求一律 307 跳到同地址的 https。
  证书默认用路由器自带的那张（/usr/openresty/ssl/server.crt|key，可在应用设置里改）。
  证书续期后自动重新加载，无需重启；读不到证书时自动改用自签名证书并在面板说明，
  面板仍然可用（它是唯一能关闭拦截的入口）。可用 -web-tls off 显式关闭。
  用 307 而不是 301：307 保留方法与请求体，脚本用 PUT 改设置时不会被降级成 GET 而丢参数；
  且不会被长期缓存，将来关掉 HTTPS 也不会让浏览器卡在 https 上。

1.7.0
- 新增「流量筛选」：可把进入本插件的报文限定为「仅 DNS（53）」「仅网页（80、443）」
  或自定义端口（支持范围，如 8000-8100）。
  为什么加：全量接管的开销按【报文】计（实测 4 核约 4.5 万包/秒，且本内核不会兑现
  引擎下发的流级标记，没有「每条流只看前几个包」的摊薄），而 gfwlist 这类规则只需要
  DNS。实测把队列限定为 DNS 后，代价降到几乎为零。
  实现要点：一条 iptables 规则只能带一个协议，所以端口筛选会生成两条跳转
  （53/UDP 与 53/TCP），两条都带完整的作用域与组播条件——否则辅助增强会在其中一个
  协议上被绕过。内核无法表达该匹配时拒绝启用并说明原因，而不是静默放行全部。
- 修正 option.json 的列表项标签键：有一处写成了 name（其余与爱快自家应用一致用 label），
  可能导致该项在下拉框里显示为空。
- 面板新增「流量筛选」状态行，并在「全量接管 + 全部流量」时提示可改用「仅 DNS」；
  收窄后提示「未包含的流量不会被检测」，避免把「规则没生效」误判成故障。

1.6.0
- 修复：日志等级设置此前对引擎内部记录不生效（级别只存进日志行、从未用于判断），
  于是每个报文的判定都会格式化整份 DNS 属性并写盘。真机实测这会把引擎吞吐压到
  约 9 千包/秒（同时写日志约 8.5 千行/秒）——表现为丢包，而不是「日志变慢」。
  现在级别在格式化【之前】生效，并加了每秒 500 条的预算：超出预算的记录直接丢弃
  并计数，宁可少日志也不拖转发。
- 面板补上「日志已丢弃 N 条」提示（此前面板会读这个字段，但接口从未提供，
  于是一条安静的日志会被误读成「没有流量命中」）。
- 提示：等级设得越低（info/debug）日志越详细、开销越大；排查完建议调回 warn 或 error。

1.5.0
- 【重要】明确「辅助增强 vs 全量接管」对域名类规则的影响（真机实测）：辅助增强下
  80/80 条 gfwlist DNS 查询全部放行（内核已识别的流不进本插件，规则看不到它们）；
  全量接管下 80/80 被拦、对照域名 0/40 误拦。要用域名/DNS 规则请选全量接管。
- 禁止「本机模式 + 全量接管」这个组合（实测会把设备卡死）。本机模式下设备自身的全部流量
  都会进入插件，包括你正在用的管理通道；实测在极小规则集（1 条域名）下 50 秒内设备自身
  出网即停摆，只能靠自动保护卸载拦截来恢复。现在：
  ・保存设置时直接拒绝该组合并给出原因（不会再出现「面板打不开、也关不掉」的局面）；
  ・旧版本已保存的该组合，在启动时自动改为辅助增强并在日志/面板说明；不改正则重启后会
    再次以该组合启动，人却可能已经连不上面板。
- 面板与文档补充该限制的说明。

1.4.0
- 面板登录改为默认开启：HTTP Basic，默认账号 admin / ikuai8.com（可在应用设置里修改）。
  此前默认留空=不鉴权，等于装完谁都能开关拦截。现在留空视为「沿用默认值」，升级的设备
  也会拿到默认账号；要彻底关闭鉴权，把用户名填成 off（会在日志里明确记录）。
  ・面板页面本身也纳入鉴权（此前只有 API 鉴权，页面能匿名打开）；
  ・面板显示当前登录状态，仍用默认密码时会给出提醒。
- 组播噪声：确认在「本机模式」（INPUT/OUTPUT）下同样生效——过滤条件加在所有链的队列
  跳转前，不只是转发的 FORWARD。配合 1.3.0 修的 IPv6 残留清理，路由器自身产生的
  SSDP/DLNA 组播不再进入插件。

1.3.0
- 修复一处清理遗漏（重要）：内核规则的**安装**一直是 IPv4+IPv6 双份，但清理与状态检查只覆盖
  IPv4。后果是 IPv6 侧的残留队列规则不会被清理、面板也看不见（面板显示"已停止、无挂载"，
  而路由器仍在把自身的 IPv6 流量送入队列）。本版把清理、状态检查、旁路名单下发全部改为
  按协议族处理。
  ・启动时的残留清理现在会覆盖 IPv6；
  ・面板的内核挂载计数与"未运行但有残留"判定现在包含 IPv6（此前 IPv6 残留永远被发现不了）；
  ・旁路名单按条目协议族分别下发：IPv6 条目此前会被交给 iptables 而报错，导致整个名单下发失败。
- 新增「组播噪声过滤」设置（应用设置里，默认开启）。把组播与广播报文排除在检测队列之外：
  这类报文内核从不参与分类，会持续占用队列（仅 SSDP/DLNA 的广播就足够占住），排除后不影响任何
  需要检测的流量。IPv4 用 addrtype、IPv6 用目的前缀 ff00::/8 —— 两个协议族的写法不同，
  本插件分别探测，任一协议族不支持时会明确提示该族仍会进入噪声，而不会假装已生效。
- 修正「识别范围」里对全量接管的副作用说明。此前写成会让内置的应用识别、限速、MAC 绑定
  上网控制、ping 失效，与开加速模式同类；这是错的。本插件的挂载点在 FORWARD 链末尾
  （ts-forward → ACL_MAC → CONNLIMIT → QOS → FIREWALL → NONAT → 本插件），且内核 DPI 在
  mangle PREROUTING，两者都在本插件之前完成判断，所以两种模式都不会让它们失效。
  全量接管真正的代价是性能与延迟（每个报文送到用户态），以及规则写错时的波及面。
  面板与应用设置里的文案已同步更正。

1.2.3
- 文档更新（功能与代码与 1.2.2 相同）：readme 补充「识别范围」「过载保护」「部署前提」
  与「与爱快内置功能的关系」四节，并修正本机模式的说明——此前写成"固有代价而非缺陷"，
  现在如实说明它可能卡住管理通道、内置的两重保护都只是减小影响而非消除影响。
- 应用市场描述补上「与内置应用识别协同」「内置内核级过载保护」两项，便于安装前了解。

1.2.2
- 修正 1.2.1 里对「过载保护」的说明：该选项是把「队列打满后丢包」改成「放行」，能显著减小故障影响，但并不能保证网络不断——已经进入队列的报文仍然在等待，所以插件若停止处理，最多仍会有「队列长度」这么多报文被扣住。实测（队列上限 8、发 30 个 ICMP）：关闭时 30 个全部丢弃、收 0 个；开启时前 8 个仍被扣住、其余 22 个放行后正常收到。请配合「本机模式仅作短时诊断」一起理解。

1.2.1
- 新增「过载保护」设置（应用设置里，默认开启）。这项利用爱快内核自带的 NFQUEUE 过载保护：队列占用超过 90% 后，后续报文直接放行，而不是丢弃。此前本插件用的是内核原生行为——队列一旦被打满就丢包，严重时会导致整个内网中断。
  ・这是全内核生效的开关，与其它使用 NFQUEUE 的组件（如云防火墙）共用；本插件停止时会把它还原成原值。
  ・面板会如实显示内核当前的实际状态，未开启或本内核不支持时都会给出警告。
- 辅助增强模式增加一层筛选：已经被内核裁决过的流量（云防火墙等组件已给出结论的连接）不再进入插件，减少重复处理。
- 若内核不支持 appmark 匹配，辅助增强模式会明确报错而不是静默退化成全量接管——两者对内置功能的影响完全不同，必须是明确选择。

1.2.0
- 新增「识别范围」设置，可选择两种工作方式，默认即为推荐方式：
  ・辅助增强（默认）：内核能识别的流量完全交给内核，插件只处理内核未能识别的流量。爱快内置的应用识别、限速、MAC 绑定上网控制等都不受影响。
  ・全量接管：所有转发流量都经过本插件。功能上更接近独立防火墙，但会让爱快内置的应用识别、限速、MAC 绑定上网控制、ping 等功能失效——这与开启加速模式后的后果是同一类。该选项在应用设置里，默认不开。
- 新增部署环境检查。以下情况会让插件根本看不到流量，现在会直接拒绝开启并说明原因，而不是安静地一条规则都不命中：
  ・链路模式为旁路模式或 SD-WAN 网桥（流量走二层桥接，不经过 iptables）。
  ・检测到网桥透传。
- 新增加速模式提示。开启加速模式后，插件只能看到每条流的前若干报文，依赖整条流的行为检测（如全加密流量判定）会失效；这种情况不阻止开启，但会明确提示原因。

1.1.1
- 修复绕过名单改动不生效：此前面板修改绕过名单并保存后，设置保存成功、界面也显示新名单，但内核里的绕过规则仍是旧的，需要重启插件才会生效。原因是绕过名单既不属于「引擎参数」（不触发重启），也不属于「规则集」（只做热重载），等于没有路径把它下发下去。现已修复，保存即生效，并在日志中记录实际下发的条数。
- 绕过规则的安装改为由主循环统一下发：这样「引擎启动后首次安装」与「用户修改名单」走同一条路径，不会出现两者行为不一致的情况。

1.1.0
- 引擎改为内嵌：安装包内只有一个可执行文件，不再附带独立的引擎二进制，也不再以子进程方式运行。功能与原版本一致，面板、规则、绕过名单、热重载都不变。
- 由此从根上消除了「大量日志导致设备断网」的成因：旧结构里引擎日志经过进程管道，读取侧一旦卡住，引擎就会阻塞在写日志、进而停止处理内核队列，整机流量被扣住。内嵌后日志是进程内调用，这条路径不存在了（日志仍然会丢弃多余条目以保证转发不受影响）。
- 面板新增显示内嵌引擎的上游版本，便于确认实际运行的引擎。
- 更新插件图标。

1.0.4
- 修复绕过名单不生效：iKuai 的 iptables 在每条规则前会打印 "[fastid: N]" 前缀，此前导致插件识别不到自己下发的规则，绕过名单因此静默失效。现已正确识别。
- 修复残留规则清理失效：同一原因，此前关闭拦截或异常退出后可能无法清理内核挂载。现已修复，并同时修正了停止脚本中的同类问题。
- 修复状态显示错误：此前每次保存设置都会把运行中的引擎显示为「已停止」，面板与实际状态不符（实际仍在拦截）。现状态准确。

1.0.3
- 修复日志时区：守护进程此前按 UTC 记录时间，与设备上其他日志相差 8 小时。原因是 iKuai 的时区写在 /etc/TZ（POSIX 格式，如 UTC-0800），而 Go 只认 IANA 时区名，遇到这种格式会静默退回 UTC。现由程序自行解析该格式，日志时间与设备一致。

1.0.2
- 修复版本号显示：面板与状态接口此前固定显示 1.0.0，现与插件版本一致。
- 修复日志重复：守护进程日志此前每条会写入两遍，现已去重，日志量减半。

1.0.1
- 重要修复：解决「开启拦截后路由器可能失去网络响应」的问题。此前的日志管道在大量日志时可能阻塞检测引擎，进而使内核队列停止处理报文，导致设备断网。现改为：日志读取永不阻塞、永不中断（超长行与读取错误都不再终止抽取），落盘由独立写入线程承担，队列满时宁可丢弃日志也不阻塞转发；面板会显示被丢弃的条数。
- 新增自我保护：开启本机模式拦截时，后台会周期性探测本机出网，连续失败则自动卸载内核挂载并关闭拦截，避免设备被自己的规则困住。
- 新增安全模式：检测到上次未正常退出时，开机不再自动恢复拦截；本机模式不跨重启保留。
- 新增引擎异常退出自动重启（带次数上限，避免无休止重启掩盖问题）。
- 关闭拦截或异常退出后，残留的内核规则会被自动清理。

1.0.0
- 首个版本：内嵌 OpenGFW（Netfilter NFQUEUE 深度报文检测引擎），支持网关模式（处理转发流量）与本机模式（只处理路由器自身流量）。
- 支持按协议特征过滤：DNS、TLS SNI、HTTP、QUIC、SSH、SOCKS、WireGuard、OpenVPN，以及全加密流量（Shadowsocks 类）与 Trojan 特征检测。
- 规则使用表达式编写（expr），支持放行 / 拦截 / 丢包 / 改写；保存后热重载，不中断已有连接。
- 绕过名单：指定 IP 或 CIDR 不进入检测队列，直接放行。
- 默认不启用拦截（只观察），安装即用不会切断任何流量；关闭拦截时自动卸下内核挂载。
- 安全提示：开启拦截前请先使用「只记录」规则观察日志，确认无误再改为拦截。
