Files
ros-dpi/CHANGELOG.md
T
Su Yijun 4c7784b44c feat: 发布 0.6.9,识别库面板新增「本地自学习」层(debug15-1 上屏)
- 后端 /api/library 的 sources 追加 local 行(IP 记忆条数、上次重建时间)
- 前端识别库分组的第五层「本地自学习」,中英文文案齐备;大小列显示 IP 记忆条数
2026-10-25 12:30:09 +08:00

44 KiB
Raw Blame History

Changelog

[0.6.9] - 2026-10-25

本地自学习库上屏:识别规则 → 识别库 新增「本地自学习」层

  • 识别库面板新增第五层「本地自学习」:显示本地自学习库的规模(IP 记忆条数)、上次重建时间和启用状态——0.6.8 只能通过 /api/system 查看,现在前端可见。
  • 识别顺序说明:本地自学习库排在所有公开库之后做兜底,命中本网络实测过的 IP 时直接归类。

[0.6.8] - 2026-10-25

修复落库卡死(在线终端 0 的根因)、本地自学习库、组播噪音过滤(debug15)

  • 修复落库全部卡死(在线终端 0、统计停更的根因):sing-box 代理连接的目标有时是域名,被写进了 access_log.remote(VARCHAR(45),本意只存 IP),超过 45 字符的长域名让每分钟的落库全部失败——流量、终端在线状态、访问日志从失败时刻起全部停更,缓冲 2 小时后数据开始丢弃。三处修复:① 列加宽到 255,启动时自动迁移存量库(不再需要手工 ALTER);② 代理连接的 remote 恢复"只存 IP"的语义,目标是域名时留空(域名本来就在 dest 列);③ 之前执行过手工 ALTER 的库也兼容。
  • 本地自学习库(debug15 第 1 条):本网络实测的「IP → 应用」沉淀成长期记忆(来自 31 天的 host_domain_day,每小时从数据库重建、热加载,规模见 /api/system 的 local)——之后同一个 IP 即使 DNS 缓存过期、终端改用 DoH、或流量只走裸 IP,也能按记忆归类。公开库给不了这层数据:它只属于你自己的网络;且每次历史重算都会自动纠正它,与识别库升级形成闭环。这是"自建本地库"对 Panabit 形成差异化的部分(它靠协议特征,这里多了自学习)。
  • 历史重算的落库改为 upsert + 串行化(审计报告 P1-1):自动任务和手动按钮同时触发时,两个重算会写同一批行撞主键(1062)整笔回滚——现在目标行用 ON CONFLICT 累加、源行用负增量 upsert,且整个重算加锁串行,IntegrityError 也纳入重试。
  • 组播 / 广播流量不再计数(debug15 第 2 条):SSDP(239.255.255.250)、mDNS(224.0.0.251)等设备发现协议的流量不再计入终端和应用统计——单台设备一个月能发几百 MB 的 SSDP,此前全部落进「其它」(第二站点实测 473MB)。
  • 其它和未识别的收敛路径(debug15 第 2 条):列宽修复恢复落库 → 本地自学习库 + 每日零点自动重算逐日消化历史 → AdGuard / MosDNS 映射持续积累。手工归类未识别域名大头(媒体刮削、自建隧道等)仍然有效。

[0.6.7] - 2026-10-25

修复 0.6.5 / 0.6.6 的历史重算和识别库自动登记(debug13、debug14 复查)

  • 自动重算不再反复搬走今天的流量:今天的行每分钟落库都会把应用改回实时分类、字节继续累加,0.6.6 每次自动重算都把当天累计的字节再搬一遍(实测 3 次后某应用当天流量被搬空)。现在重算(含手动按钮)只处理今天以前的数据;今天的流量本来就按最新规则实时统计,过了零点自动补算。顺带避免了重算与落库同时写同一行。
  • 重算只升级、不降级:历史行只存了域名或 IP,没有端口、目标 IP、sing-box 规则这些实时信号,0.6.6 用 0.0.0.0:443(域名行)和端口 0(IP 行)重跑,会把实时按 IP 段认出的应用改成 HTTPS、把 HTTPS 改成「其他」,反而抬高「其他 / 未识别」。现在新结果是笼统分类(HTTPS / 国内网站 / 国内网络 / 未识别 / CDN)时不搬;原本是笼统分类的认出具体应用才搬;原本已是具体应用的,只有域名规则直接命中另一个应用时才改。
  • 自动重算的触发条件:不再看 DNS 缓存行数(它几乎时刻在变,0.6.6 等于每 6 小时全量重算一次 31 天),改为识别库版本 / 规模变化或过了零点;启动后等 15 分钟再跑第一次,不会用还没加载完的识别库去算历史。
  • 上游新目录改为“投票”定归属:0.6.6 按目录名子串猜类别,会把 Facebook 认成银行(含 ceb)、Stripe 认成旅行、HeroesoftheStorm 认成代理,还会把 Tencent、Google、Alibaba 这类公司级大杂烩和 AdGuardSDNSFilter、EasyPrivacy 等广告 / 隐私列表登记成应用。现在新目录先下载,再拿它的域名和 IP 段问现有识别库:多数属于同一个已有应用就并入(如 Facebook、TelegramSG),多数属于同一大类就建该类应用,都不够才按目录名猜(按整词匹配),猜不出归「常用网站」;公司级大杂烩和广告 / 隐私 / 拦截 / 纯 IP 汇总列表不登记。Hagezi / UT1 新列表名字能明确猜出类别才登记,下载后投票明显不符的作废;登记的列表并到该类的「其他 xx 网站」,不多建应用。
  • 自动登记的新应用不用重启即生效(0.6.6 要等重启或改自定义规则后分类器才认得)。登记结果在 data/lists/bm7/rules_auto.yaml。
  • 手动选「深色」主题时 DPI 大类配色仍是旧的 9 色循环(0.6.5 只改了浅色和跟随系统的深色),HTTP协议 与 流量代理 等 8 对同色;改为同一套 17 色。
  • 操作日志不再明文记录 AdGuard Home 密码。

[0.6.6] - 2026-10-25

识别库智能化:上游更新自动建规则库、自动重算历史;修复 AdGuard Home 读到 0 条(debug14)

  • 修复 AdGuard Home 一条应答都读不到(0.6.5):新版 AdGuard Home 的查询日志 API 返回 {"data": [...]},0.6.5 按旧版的 {"entries": [...]} 解析,结果"连接成功"却永远是 0 条。现在两种格式(以及直接数组)都认。
  • 上游规则库更新后自动建新规则库(debug14):blackmatrix7 / Hagezi / UT1 的上游出现新的目录或列表时,自动登记成新应用——类别按目录名猜测(视频、游戏、购物、银行、AI 等 20 多组关键词,猜不出的归「常用网站」;分类列表猜不出则跳过),登记结果存在 data/lists/rules_auto.yaml,重启不丢;手工映射(bm7_map.yaml)优先级更高。汇总 / 区域 / 安全类目录(China、Global、Advertising 等)不参与自动登记。不再需要等新版本手工补映射。
  • 「重算历史分类」会反查 DNS 缓存:纯 IP 的历史行先查 DNS 缓存(嗅探 / MosDNS / AdGuard Home 积累的 IP→域名映射)拿到域名再分类,AdGuard 接入后积累的映射能回溯到历史流量上;DNS 缓存过期后,已经归到具体应用的行保持不动,不会倒退回「国内网络 / 未识别」。
  • 识别库更新后自动重算历史分类:识别规则保持「自动更新」开启时,识别库有实际变化(规则更新、DNS 映射积累)就自动执行一次历史重算(按内容指纹判断,没变化时只有几条计数查询的开销);点「立即检查更新」后同样触发。识别规则页的手动按钮保留。

[0.6.5] - 2026-10-25

外部数据源支持自有 DNS 服务器(AdGuard Home)、ASN 识别中国自营内容商、历史分类重算;DPI 协议 17 色去重(debug13)

  • 外部数据源新增 AdGuard Home:双层 NAT(路由器下面又挂了爱快等二级路由)时,下级客户端的 DNS 查询被上游代理,路由器侧看不到,流量只能归「国内网络 / 未识别」。在 系统设置 → 外部数据源 填入下级网络真正使用的 DNS 服务器(AdGuard Home)的地址和密码后,从它的查询日志读取「谁查了哪个域名、解析出哪些 IP」,与 MosDNS 源走同一条管线,下级终端的流量也能按域名识别。两个 DNS 源可同时启用;账号和密码都留空表示免认证访问(仅限内网监听)。
  • ASN 识别中国自营内容商:字节跳动/抖音、哔哩哔哩、爱奇艺、米哈游、京东、淘宝、网易、腾讯云的自治系统段加进对应应用的 asns 规则,没有域名的流量命中这些自营网段时直接归入正确应用(此前只有 Netflix、Telegram 等国外服务有)。
  • blackmatrix7 新增 3 个来源:政务网站(GovCN → 常用网站)、运营商 IPTV(IPTVMainland → 直播)、海外 TVB 频道(EncoreTVB → 在线视频)。
  • 识别规则页新增「重算历史分类」:规则或识别库升级后,近 31 天的历史流量按当前规则重新归类——新的识别结果立刻反映在应用统计里,不用等旧数据滚出保留期。只搬移归类发生变化的部分(按天统计;分钟/小时曲线不动,随保留期自然对齐),重复执行安全。
  • DPI 协议 17 个大类配色去重:0.6.4 的 9 色循环在第 10 类起重复(流量代理和 HTTP协议 同为蓝色等),改回 17 个互异的颜色——等距色相加语义锚定,相邻大类色相错开 20° 以上,「其他 / 未识别」用深浅两种中性灰。饼图、矩形树图、历史趋势、图例、详情弹窗同源生效。

[0.6.4] - 2026-10-24

识别库面板按层级分组;DPI 协议配色照维盟

  • 应用大类配色照维盟「DPI 协议」饼图:HTTP协议 蓝、网络游戏 绿、网络电视 黄、P2P下载 红、常用协议 浅蓝、即时通讯 深绿、网络音乐 橙、股票交易 紫、网络电话 粉,第 10 类起按同样 9 色循环(流量代理 蓝、数据库 绿、移动应用 黄……其他 橙、未识别 紫)。小类仍用所属大类颜色的深浅区分。
  • 流量构成饼图和图例改为按大类的固定顺序排列(和维盟一样,不再按大小排),同色的两个大类相隔 9 位,扇区不会挨在一起。
  • 「识别规则 → 识别库」按识别层级分成四组:① 按域名认应用(内置规则库、v2fly、blackmatrix7)② 按 IP 认应用(IP 归属库)③ 按域名认类别(Hagezi、UT1)④ 兜底(国内域名列表、官方 IP 段、国内 IP 段)。每组标题下一句话说明这一层做什么、组内谁优先,原来表格下面那一长段匹配顺序说明去掉。
  • Google、Cloudflare、AWS、GitHub 四家的官方 IP 段合并成一行「官方 IP 段」,各家的规模列在说明下面;各来源的说明改短。

[0.6.3] - 2026-10-24

应用大类改成维盟的 17 类,「查看详情」改为弹窗(debug12 第 8、9 条)

  • 应用大类照维盟 WayOS「DPI 协议」:HTTP协议、网络游戏、网络电视、P2P下载、常用协议、即时通讯、网络音乐、股票交易、网络电话、流量代理、数据库、移动应用、特殊协议、矿池、PCDN、其他、未识别,固定按这个顺序列出、没有流量也显示。小类按维盟的二级分类归入,例如 HTTPS/QUIC、DNS、邮件、软件更新、网上银行、常用办公、AI 应用归「常用协议」;短视频、移动社交、应用商店、手机游戏、新闻资讯、购物支付、出行旅游归「移动应用」;企业微信 / 钉钉 / 飞书归「常用办公」,视频会议归「即时通讯」。
  • 新小类与应用:HTTPS/QUIC(HTTPS、QUIC 网页从“普通网页”拆出,和维盟一样放在常用协议)、数据库(MySQL、PostgreSQL、SQL Server、Oracle、Redis、MongoDB,按端口)、矿池(F2Pool、AntPool、ViaBTC、NiceHash 等常见矿池,以及 UT1 的网页挖矿列表)、PCDN(网心云)。
  • 小类 ID 都没变,历史数据不受影响;升级时自动迁移:分析设置里“算娱乐”的旧大类展开成原来包含的小类,按大类的审计规则换成最接近的新大类(影音娱乐 → 网络电视、社交通讯 → 即时通讯、下载更新 → P2P下载 ……)。“游戏时长”“工作时间看视频”等指标口径不变(游戏仍含手机游戏和加速器,视频仍含短视频和音乐)。
  • 应用统计页「查看详情」改为弹窗:页面上是 17 个大类;点「查看详情」弹出「DPI 协议详情」,和维盟一样在弹窗里逐级查看小类、应用,带本级合计、刷新间隔、停止、返回顶部、返回上一级和导出。
  • 配色:8 个流量大的大类各用一个色相,其余大类用灰阶(重新用色盲模拟校验过);饼图扇区之间加 2px 间隔。

[0.6.2] - 2026-10-24

通知渠道照搬 EasySub、使用场景重做、新增三个识别库并调整识别顺序(debug12)

修复

  • 外部数据源显示“未启用”(0.6.0 / 0.6.1):升级时给访问目标回填主域名的那一步写法有误,每次启动都报错,导致排在它后面的初始化都没执行:sing-box / MosDNS 的地址保存了却没生效(页面显示“未启用”),DNS 缓存、LAN 网段设置和自定义识别规则在重启后也没有恢复。现在回填改为逐个域名更新,并且启动时各个初始化步骤互相独立,一步出错只记日志、不影响其它步骤。升级到 0.6.2 后无需重新填写,重启即生效。

通知渠道(与 EasySub 完全一致)

  • 14 种渠道,磁贴顺序、字段名、发送实现都和 EasySub 相同:Telegram Bot、飞书 Bot、QQ Bot、Bark、Email、Pushplus、Server酱、企业微信、钉钉、Discord、Slack、ntfy、Gotify、Webhook。
  • Telegram:新增 ADMIN ID、HTTP 代理;API 反代可以不带 https://;新增「验证机器人」(getMe)和「获取 Chat ID」(getUpdates,自动填入最近一条消息的会话)。
  • 飞书改为应用机器人(App ID + App Secret + 多个 Chat ID),和 EasySub 一样。旧的飞书群机器人 Webhook 配置需要重新填写。
  • 新增 QQ 机器人:App ID / Secret,可同时推送多个群聊和私聊 OpenID。
  • 企业微信:可选「群机器人」或「自建应用」。自建应用填企业ID、AgentId、Secret,可设 API 代理(应对企业可信 IP 限制),按成员 / 部门 / 标签推送,消息类型支持文本、Markdown、文本卡片(可点击跳转);新增「检查应用」(返回应用名和可见范围)、access_token 缓存和失效自动重取、接收人无效时报错,以及可展开的配置说明(含 Nginx / socat 反代示例)。
  • Bark 新增图标;Email 改为 SSL/TLS 开关(关闭时自动尝试 STARTTLS);Pushplus 可选渠道(微信 / 邮件 / Webhook / 企业微信);Webhook 新增请求超时(毫秒)和最大重试次数,模板支持 event 变量。
  • 0.6.1 及更早保存的配置自动迁移(邮件加密方式、发件人、Webhook 重试次数)。免打扰、规则选择渠道、上次发送结果保留不变。

使用场景

  • 两个场景命名为 家庭 和 企业。企业场景下菜单、页面、按钮统一称“员工 / 部门”(之前是“人员”),家庭场景是“家庭成员 / 分组”。
  • 场景改为全局设置,在 系统设置 → 场景与网络 切换(原来藏在人员页的分析设置里);切换后菜单、人员页、审计模板立即跟着变。侧边栏底部和人员、审计页头显示当前场景。
  • 浏览器记住上次的场景:企业场景刷新页面时,菜单不会再先闪出“家庭成员”。
  • 删除还有人的分组 / 部门时,提示语按场景用“成员 / 分组”或“员工 / 部门”。

新增识别库(运行时下载,不进镜像和仓库)

  • blackmatrix7/ios_rule_script(GPL-2.0,每周更新):按应用整理的规则。约 460 个目录并入已有应用(只补内置库和 v2fly 里没有、或比它们更具体的域名和 IP 段),另新增约 100 个应用(TVB、Zalo、闲鱼、晋江文学城、科大讯飞、动态域名 DDNS……)。目录名到应用的对应关系在 bm7_map.yaml:名字匹配之外还要求该目录至少 30% 的域名已被识别为同一个应用,避免同名误配(例如 ABC 电视台不会并进农业银行);China、Global、Advertising 这类汇总列表和 Tencent、Google 这种公司级大杂烩不使用。
  • Hagezi 分类列表(GPL-3.0,每天更新):成人、博彩、VPN/代理绕过、社交、广告,以及小米、华为、OPPO、vivo、三星、苹果、亚马逊、TikTok、LG、Roku、Windows/Office 的设备遥测。
  • UT1 分类列表(图卢兹大学,CC BY-SA 4.0,每天更新):游戏、购物、新闻、体育、求职、银行、金融、网页邮箱、聊天、远程控制、AI、下载、网盘、音视频、电台、漫画、社交论坛、交友、博客等 30 个列表。
  • 新分类 赌博博彩(资讯阅读大类下);分类列表认出的流量归到“其他游戏网站”“其他购物网站”“成人网站”“博彩网站”“设备遥测”等兜底应用,计入识别率。
  • 顺序与权重:① 自定义规则 → ② 应用级域名(内置、v2fly、blackmatrix7 一起比,命中的后缀越长越准,一样长时按这个先后)→ ③ 应用级 IP(内置 IP 段 → blackmatrix7 IP 段 → 专用端口 → ASN)→ ④ 分类级域名(Hagezi → UT1,同样最长后缀优先;也用来细化 v2fly 的“地区”兜底条目)→ ⑤ 国内域名列表 → 官方 / 国内 IP 段 → ⑥ 通用端口。认出具体应用的信号永远优先于只认出类别的。
  • 效果:Tranco 全球前 1 万个网站中能认出具体类别的比例从 19.6% 提高到 35.7%;国内长尾域名抽样 3000 个从 3.3% 到 5.0%(其余仍由国内域名列表兜底为“国内网站”)。
  • 分类列表约 60 万个域名,存成排序的 64 位哈希数组,常驻内存约 7MB;重新加载约 5 秒,期间旧数据照常使用。
  • 识别库面板按匹配顺序列出这三个新来源;BM7_DB / HAGEZI_DB / UT1_DB=false 可分别关闭。

识别顺序与自动更新

  • 有域名时先查完所有域名库再按 IP:国内域名列表移到官方 IP 段之前。国内网站托管在 Cloudflare / AWS 上时归「国内网站」,而不是 IP 所属的 CDN。
  • IP 段重叠按最长前缀匹配:AWS 中国区段落在国内 IP 段里、GitHub 段落在 AWS 段里时,更具体的小段优先;修复了小段之外、仍属于大段的地址查不到的问题。
  • 「识别库」面板按匹配顺序编号,并写明完整的匹配顺序。
  • 「自动更新」开关现在同时控制 ASN 库和补充库(国内域名列表、官方 IP 段)的定期下载;补充库每 6 小时检查一次、满一天才重新下载(之前 24 小时一次,可能因几秒误差拖到两天)。

[0.6.1] - 2026-10-24

识别率(未识别占比较高,补充更强的识别数据源)

  • 国内域名列表:接入 dnsmasq-china-list(约 11 万条,WTFPL,每天更新)。规则库没认出的域名在列表里就归到新分类**「国内网站」**。实测抽样 3000 个国内域名:v2fly + 内置规则只认出 5.6%,这个库把其余 94.4% 的长尾都兜住。
  • 官方 IP 段:接入 Google、Cloudflare、AWS、GitHub 官方发布的 IP 段(每天更新),以及 IANA 注册给 Apple 的 17.0.0.0/8。完全没有域名的流量(加密 DNS、ECH、直连 IP)按 IP 认出归属,不再落到 HTTPS/其他。
  • 国内 IP 段:来自 chnroutes2(APNIC 数据,CC-BY-SA 4.0),没有域名的国内直连流量归到新分类**「国内网络」**。
  • 以上都只做兜底:域名规则、自定义规则、ASN 能认出的优先,任何已有识别不会变差;「国内网站」「国内网络」计入应用识别率。
  • 数据运行时下载到数据目录(不进镜像)、每天自动更新,「识别库」面板显示每个来源的规模、更新时间与许可证;CHINA_DB=false / IPLIST_DB=false 可分别关闭。
  • 「立即检查更新」按钮同时刷新全部来源。

[0.6.0] - 2026-10-23

可靠性

  • 落库失败不丢数据:数据库抖动时这一分钟的流量、访问日志先留在内存,下次落库一起写入(超过 2 小时写不进去才放弃并记日志);之前写库一失败这分钟的数据就丢了。
  • 数据清理分批执行:按保留期删除改为每 5000 行一批、逐批提交,存量大的表(访问日志、审计事件等)不会再出现一次删除几十万行的长事务大锁。domain_geo 表也纳入保留期清理(之前只增不减)。

安全

  • 登录限速:同一 IP + 用户名连续失败 5 次锁定 15 分钟,密码正确也进不来(其它账号不受影响)。
  • 改密码 / 改权限后旧登录立即失效:token 里带上版本号,改密码、管理员重置密码或调整权限时版本号 +1,已签发的 token 马上作废。
  • 安装向导建管理员加并发保护:两个请求同时到达时只有一个能成功。
  • 服务器内部错误不再把异常详情返回给浏览器(只给错误类型,避免带出内部路径等信息)。

性能

  • 访问目标排行改为数据库侧聚合:新增 host_domain_day.base(主域名)列,按主域名合并、搜索都在 SQL 里完成,只把排到前面的目标取回来;近 30 天几十万行时不再整表拉进内存。旧数据升级时自动回填。
  • 人员列表只扫一遍访问日志:today 和近 7 天两个区间嵌套,现在共用一次查询(原来各查一次)。
  • 全网概览在“今日”范围下不再重复查询应用排行(健康指数直接复用)。

前端

  • 轮询竞态修复:快速切换时间范围时,慢的旧响应不会再覆盖新数据(同一时间只允许一个请求在飞,期间又有触发就跑完立刻补一次)。
  • 补齐加载失败的处理:上网时间线、系统设置的运行状态、人员页分析设置、流量流向的目标详情、终端命名表、识别规则、审计规则、人员详情设备绑定等十几处接口失败后不再永久“加载中”或静默空白,都会显示错误(部分可重试)。
  • 时间线快速翻日期加防抖竞态保护;ECharts 配置的深度监听去掉(每次重算都是新对象,浅比较即可);侧边栏三个启动请求改为并行。

工程

  • CI:PR 也会构建一次镜像(单架构、不推送),Dockerfile 破损在 PR 阶段就能发现;连续推送自动取消过期的构建。
  • 容器内服务进程以非 root 用户运行(启动时先把数据目录权限交给它再降权;显式指定 user: 时按原方式运行)。
  • 自带 MySQL 的 compose 改为必须设置密码变量(MYSQL_PASSWORD / MYSQL_ROOT_PASSWORD),忘改不再裸奔;MySQL 容器加内存上限。
  • 发布脚本遇到 CHANGELOG 里没有对应版本段落时直接报错(之前会发一个空的“详见提交记录”)。

[0.5.1] - 2026-10-23

成员 / 分组与国家流向图

  • 家庭成员 / 人员必须属于一个分组 / 部门(后端校验);同一分组里不能重名;添加成员时没有分组可以就地新建。
  • 成员列表每行加编辑按钮,详情页加编辑和删除(之前已有成员打不开编辑弹窗,也就删不掉)。
  • 分组 / 部门下还有成员时不能删除,会提示先移走;以前没有分组的成员单独显示为“未分组”,方便补上。
  • 国家 / 地区分布改为流向图:从本地(按 WAN 口公网 IP 判断,默认中国)飞向各国,线宽和气泡大小表示流量,流量最大的 5 个国家直接标名字和流量;右侧改为带名次的排行,“无法定位”放最后并说明原因。修正跨 180° 经线的国家在地图上画出的横线。
  • 域名的国家在记录流量时就存下(新表 domain_geo),不再依赖会过期的 DNS 缓存;之前重启或隔天后大部分目标会显示为“无法定位”。

[0.5.0] - 2026-10-23

审计参照深信服 AC(能被动实现的部分),分家用 / 企业两种场景;通知参照 EasySub

人员与场景

  • 人员 / 家庭成员:新页面。把一个人的多台设备归到一起,按人统计流量、在线时长、常用应用;可分部门(家用叫“分组”)。未分配的设备列在下面,选人即归属;终端详情里也能指定归属。
  • 使用场景:家用侧重孩子的上网健康(每日屏幕时间、游戏、短视频上限,熬夜,不良内容,学习时间玩娱乐应用);企业侧重效率与合规(工作时间娱乐占比、求职倾向、上班炒股、大流量外发、私接路由)。称呼、默认时间段、标签、审计模板随场景变化。
  • 行为洞察 / 健康提醒:最近 7 天每个人的行为标签(中 / 高两档,附依据:哪些应用、多长时间、几天),以及效率或上网时长排行。时长按访问日志计算,同一应用的重叠时段先合并。
  • 终端类型识别:手机、平板、电脑、电视、游戏机、摄像头、智能设备、NAS、网络设备。依据主机名、MAC 厂商(IEEE OUI 公开数据,每 30 天自动更新,OUI_DB=false 关闭)、用过的应用、随机 MAC;可手动指定。

审计

  • 访问日志、上网时间线、报表都能按人员 / 部门筛选;报表增加人员排行。
  • 审计规则的适用范围可以选人员、部门;新增规则类型 大流量外发(当天上传超过阈值,可限定目标大类)和 私接路由(按镜像包的 IP TTL 发现后面接了路由器或多种系统共享的设备);新增“私接检测”页。
  • 审计模板按场景提供(家用:写作业时玩游戏、该睡觉了还在上网、短视频刷太久……;企业:上班看招聘网站、大流量外发、私接路由……)。
  • 管控命令:在人员 / 终端详情生成 RouterOS 命令(按 TLS 域名封禁应用、定时断网、限速),附撤销命令;ROS-DPI 自己不写路由器。
  • Syslog 外发(RFC 5424,UDP / TCP):访问结束时发一条访问日志,审计事件实时发送。
  • 留存天数可以在网页里改(优先于环境变量),并显示数据库各表的占用。

通知(参照 EasySub)

  • 13 种渠道:企业微信、钉钉(加签)、飞书(签名)、Bark(多地址)、Telegram(可填 API 反代)、邮件、PushPlus、Server酱、ntfy、Gotify、Discord、Slack、通用 Webhook(HMAC 签名、自定义请求头、模板、重试)。磁贴选择,每种一份配置,可以用还没保存的配置测试,显示上次发送结果;密钥遮盖显示。0.4.0 的通道配置自动迁移。
  • 每条规则可以选推送到哪些渠道;免打扰时段内的提醒先记下,结束后汇总推送一次。

界面

  • 应用统计:大类、小类固定列出(没有数据也列),默认按固定顺序,可按任一列排序;应用构成改为矩形树图(大类 → 小类,一张图看两层),人员详情也用它。
  • 流量流向:访问目标排行增加世界地图和国家 / 地区分布(未知排在最后),点击国家只看该国目标;地图数据为 Natural Earth(公有领域)简化版。
  • 时间范围只保留 今日 / 昨日 / 本周 / 本月(近 7 天、近 30 天与本周、本月重复)。
  • 上下行颜色统一:所有页面上行橙色、下行青色,图表与文字一致;在线终端数改用强调色。

修复

  • 用户管理“新建用户”无反应:文案里的 @ 是 vue-i18n 的语法字符;构建前现在会把所有文案编译一遍。

[0.4.0] - 2026-10-23

审计系统与用户权限

审计(新页面「审计日志」)

  • 访问日志:按“访问”记录每台终端访问了什么:同一终端、同一目标、同一应用,间隔不超过 5 分钟算一次,超过 1 小时按小时切开;记录起止时间、目标域名 / IP、端口、应用、连接数、上下行流量、识别依据。进行中的访问每分钟写入并更新,最多慢一分钟。可按时间范围、终端、关键字、应用大类筛选,导出 CSV(最多 10 万行)。默认保留 30 天(RETENTION_LOG_DAYS)。
  • 上网时间线:终端详情新增「访问日志」「上网时间线」两个子标签,时间线按天显示在线时段和每个应用的使用时段,以及最早、最晚上网时间和在线时长。
  • 审计规则:按应用大类、分类、应用、域名、流量超额、新设备接入设置规则,可限定星期、时段(支持跨午夜)、终端和当日流量门槛;提供 5 个常用模板。命中时记审计事件,同一规则同一终端一小时最多一次(设了流量门槛的一天一次)。
  • 通知推送:企业微信、钉钉、飞书机器人,Bark,Telegram,通用 Webhook;可发测试消息。推送成功后事件才标为“已推送”。
  • 日报 / 周报:总流量、识别率、Top 终端和应用、新增终端、审计事件;日报每天 08:00、周报每周一 08:30 推送,也可立即推送。
  • 操作日志:登录(含失败)、改设置、改规则、改名、导出、用户管理等操作,密码和密钥不记录。审计事件和操作日志保留 180 天(RETENTION_EVENT_DAYS)。

用户与权限

  • 系统分管理员和普通用户。普通用户只读:能看监控、访问日志、审计事件和报表,能改自己的密码;不能改设置、规则、名称和通知,也看不到系统配置和操作日志。权限由后端统一检查。
  • 系统设置新增「用户管理」:新建用户、改角色、重置密码、删除;至少保留一个管理员,不能删除当前账号;删除后该账号的登录立即失效。升级前的账号都是管理员。

应用统计

  • 参照维盟「DPI 协议详情」改版:先列应用大类,「查看详情」进入小类,再进入具体应用;带面包屑、返回顶部、返回上一级。顶部是当前这一级的上传 / 下载总速度和总数据,每列显示“数值 | 本级占比”,可按任一列排序;10 / 30 / 60 秒自动刷新,可停止。

sing-box 与流量流向

  • 走 sing-box 的流量:域名只能认出 HTTPS 这类通用协议时,按 sing-box 命中的规则集名或策略组名(如 rule_set=Telegram0、✈️ Telegram)认出具体应用。
  • 实时连接显示每条代理连接走的策略组和出口节点(悬停看命中的规则)。
  • 流量流向新增「代理分流」:今天各策略组、各出口节点的流量、连接数和主要应用。
  • 访问目标排行显示国家 / 地区(IP 查 ASN 库;域名按它在 DNS 缓存里解析到的 IP 查),并有国家 / 地区分布,点一项只看该国家的目标。

修复

  • 实时流量上下行几乎一样:读默认路由时把策略路由表(例如导给 sing-box 旁路由的路由表)里的默认路由也当成了 WAN,LAN 网桥的收发被叠加进来。现在只看主路由表,并排除开着 DHCP 服务的接口。
  • 全网状态分成两排:多条 WAN 线路合并成一张卡逐行显示,全网状态始终一排。
  • 手机上流量构成饼图的图例改到饼图下方,不再压住饼图;访问日志表在手机上不再需要横向滑动。

[0.3.0] - 2026-10-23

接入外部数据源、识别库自动更新与全站布局调整

识别准确度

  • 接入旁路代理 sing-box(可选):在 系统设置 → 外部数据源 填写 Clash API 地址和密钥,每 5 秒读取 /connections,按“来源终端 + 域名 + 字节数”记账。路由器上看到的代理自身出口隧道和发往 FakeIP 的流量不再重复计算;没接 Clash API 时,代理机器自己的流量标为“旁路代理隧道”,不再是“其他”。
  • 接入内网 DNS MosDNS(可选):读取审计日志,建立“终端 + IP → 域名”的对应关系(终端查询内网 DNS 不经过路由器,DNS 嗅探看不到)。
  • 地址、密钥都由用户自己填写,不填不启用;也可以用环境变量 SINGBOX_URL / SINGBOX_SECRET / PROXY_IPS / MOSDNS_URL 预设。
  • IP 归属库(ASN):容器自动下载 iptoasn.com 的数据(公有领域,每天更新),没有域名的流量按 IP 归属认出公司(腾讯云、阿里云、苹果、谷歌、Netflix、Steam、Telegram 等 25 个应用 / 厂商);实时连接和访问目标里显示 IP 的归属与国家。识别优先级:域名 > IP 段 > 专用端口 > ASN > 通用端口。
  • 健康指数新增“旁路代理”一项:某台机器的流量大头是认不出的加密隧道、又没接 Clash API 时提示。
  • 域名来源新增“sing-box 连接”;概览的应用数写清楚为“今日出现 N 个 · 规则库 M 个”。

识别库自动更新

  • v2fly 规则每天自动检查上游最新提交,有更新就下载、转换、自检(抽样域名必须识别正确,应用数不能骤减),通过后热加载,不需要重启;不通过或没有外网时保留现有规则。可以关闭,也可以手动“立即检查更新”。
  • 识别规则页新增“识别库”面板:内置规则库、v2fly 域名库、IP 归属库各自的版本、规模、许可证、上次检查结果。
  • 转换逻辑移到 backend/app/classify/v2fly.py,生成的文件头记录来源提交;scripts/import_v2fly.py 仍可用于发版前更新镜像自带的规则。

布局审计

  • 所有页面在桌面、平板、手机三种宽度下检查并调整:手机上表格隐藏次要列,名称下方补充关键信息;子标签条横向滑动;统计卡改成与其他卡片一致的样式;平板上三张统计卡保持一行;终端详情底部两张表在平板上下排;全网状态小卡按实际数量排列,不再出现落单的一张;只有一两个数据点的折线图显示数据点。
  • 系统设置拆成 运行状态 / 接入与自检 / 外部数据源 / 网络与账号 四个子标签,有问题的子标签显示红点;接入向导的主机 IP 默认取自检到的地址。
  • 识别规则页的说明收进说明条,应用下拉框默认选中第一项。
  • 备注名与主机名相同时只显示一次。

图表、流量流向、接入自检

  • 图表对齐维盟 4.0:
    • 流量构成改成实心饼图,右侧是竖排可翻页的图例(名称 + 占比);应用统计页选中大类后,饼图下钻到它的小类。
    • 实时流量改成维盟的流量卡片:“实时流量 / 历史流量 / 历史用户”三个标签,右上角选单位(bit/s、Byte/s)和显示方式(全部 / 按应用大类),上方两行是上下行的累计流量和实时速度。
    • 所有折线图统一:上行钢蓝、下行青绿,都画在零线以上;图例居中,样式是线加空心圆;纵轴单位紧凑(“143.05 M”)。终端详情、应用详情、在线终端曲线同样改过。
    • 健康指数仪表盘两侧标出“差 / 中 / 良 / 优”,分数显示为“95分”。
  • 实时流量秒级采样:配置了 RouterOS API 时,每 5 秒读一次 WAN 口计数器(只读,环境变量 ROS_RATE_SECONDS 可调),实时流量曲线和“此刻速率”都按秒级更新;没配 API 时仍按每分钟的流量记录计算。
  • 流量流向页重做,去掉桑基图,改成两个标签:
    • 实时连接:此刻还在传数据的连接,显示终端、远端域名 / IP、协议端口、应用、实时速率、本次流量、持续时间,以及靠什么认出的域名(SNI / 终端 DNS / IP 表)。每 10 秒刷新,可暂停、筛选、导出。
    • 访问目标排行:流量最大的远端域名和 IP(包括认不出应用的),可按主域名合并,点开看是哪些终端在访问,可导出。只有 IP 的目标每台终端每分钟只记流量最大的 30 个。
  • 终端详情的“访问域名”改为“访问目标”,也会列出只有 IP 的目标;“未识别域名 Top”不列 IP。
  • 接入自检:用只读账号读取 RouterOS 的 /ip firewall mangle、/ipv6 firewall mangle,逐条检查镜像到 ROS-DPI 的 sniff-tzsp 规则:发往的端口和地址是否与正常工作的 DNS 规则一致、是否停用、命中了多少包;缺少 SNI 或 QUIC(UDP 443)规则、开启了 FastTrack 时也会提示。系统设置里列出每条规则的状态,并生成可以直接复制的修改命令;健康指数增加“镜像规则”一项。起因:SNI 规则发往了 37880 端口,ROS-DPI 监听的是 37008,界面上只显示“最近 SNI:从未”,看不出原因。

[0.2.0] - 2026-10-23

参考维盟路由系统 4.0(WayOS)改版,并合并原计划的应用识别增强。

界面

  • 新 logo“七层”:三层网络分层叠起来,最上面的应用层点亮;字标 ROSDPI。favicon 同步更新。
  • 整体框架改成左侧图标菜单(可折叠成只剩图标,手机上是抽屉)+ 顶栏面包屑;淡灰紫底色上铺白色大圆角卡片;品牌色钢蓝、数据色青绿。
  • 登录页和安装向导改成左侧等距插画、右侧大标题加圆角卡片的版式。
  • 主机监控改成子标签:在线终端 / 全部终端 / DHCP 租约 / 命名管理,每页带说明条和“| 小节标题”。

新功能

  • 全网概览仪表盘:路由器信息(型号、版本、运行时间、CPU、内存)、网络健康指数(0 到 100 分,逐项列出扣分原因和改进建议)、在线终端(今日新增 + 最近 1 小时在线数曲线)、DHCP 地址池(剩余可分配 / 总数)。
  • 全网状态:每条 WAN 线路的连接状态、联网方式(PPPoE / DHCP / 静态)、IP、实时速率;多 WAN 并排显示。
  • 流量图增加“在线终端”标签:历史在线终端数曲线。
  • 终端列表新增在线时长和连接数列;新增 DHCP 租约页(静态 / 动态、状态、剩余时间,附各地址池使用率)。
  • 应用统计新增实时上传 / 下载速度列,可按实时速率排序,15 秒刷新一次。
  • 顶栏功能搜索:输入终端名、IP、MAC、应用名或页面名直接跳转,按 / 键聚焦。
  • 终端、应用、DHCP 租约列表可导出 CSV(Excel 直接打开)。
  • RouterOS 只读账号额外读取 /ip/pool、/ip/dhcp-server、/ip/dhcp-client、/interface/pppoe-client(都是 GET,仍不修改路由器)。

应用识别(原 0.1.5)

  • 应用库扩充到 2800 多个应用、约 3.8 万条域名:在手工维护的规则之外,导入开源的 v2fly/domain-list-community(MIT 许可)。按它自带的分类映射到本项目的三级分类,按注释取中文名,与已有应用重合的部分并入已有应用;同一域名以手工规则为准。新增小类“网站服务”“成人内容”。转换脚本 scripts/import_v2fly.py,更新时重新运行即可。
  • 支持精确匹配的域名规则(v2fly 的 full:)。
  • 新增 SNI 识别:RouterOS 把每条 HTTPS / QUIC 连接开头的握手包镜像过来(新增两条 mangle 规则,见接入向导),ROS-DPI 从 TLS ClientHello 取出目标域名;HTTP/3 的 QUIC Initial 包按 RFC 9001 / 9369 解密后读取(支持 QUIC v1、v2)。TCP 分段和 QUIC 打散的 CRYPTO 帧都会重组。
  • 识别更准:域名查找改为 这条连接的 SNI → 这台终端对该 IP 的 DNS / SNI → 全网 IP 表。同一个 CDN IP 承载多个网站时不再互相串;终端用 DoH 加密 DNS 时也能识别。
  • 系统设置显示 SNI 握手数,以及“域名来源”占比(各来源认出了多少流量)。

[0.1.4] - 2026-10-22

应用分类三级化与图表重做

  • 应用分类改成 Panabit 那样的三级:应用大类 → 小类 → 应用。10 个大类(影音娱乐、网络游戏、社交通讯、下载更新、办公学习、购物生活、资讯阅读、智能设备、网络基础、未识别),41 个小类(新增手机游戏、主机游戏、游戏加速、语音通话、电子邮件、应用商店、视频会议、开发工具、远程控制、在线教育、出行地图、银行、证券理财、阅读漫画、监控摄像、系统服务、CDN 云服务、代理隧道、安全软件等)。
  • 内置应用从 100 多个增加到 277 个:微信视频号、B 站直播、咪咕、央视频、各大银行和券商、ToDesk / 向日葵、DeepSeek / Kimi / 豆包 / 通义 等。
  • 没法识别具体应用的流量,如果 CNAME 指向阿里云、腾讯云、网宿、Akamai、Cloudflare 等 CDN,会归到对应的 CDN 厂商,不再是“其他”。ICMP、GRE / ESP(VPN)按 IP 协议识别。
  • 已有的应用 ID 和分类 ID 都保留,历史数据不受影响。
  • 图表全部重做:
    • 流量构成:双层环图(内环大类、外环小类)加带数值的排行表,点击可筛选应用。
    • 流量趋势:可切换“按应用大类”堆叠图和“上行 / 下行”图;标出峰值。
    • Top 应用 / Top 终端:带名次和占比。
    • 流量流向:中间一列改成应用大类,连线颜色表示大类。
    • 配色按应用大类固定,用 dataviz 校验脚本检查过色盲区分度,深浅色主题各一套。
  • 终端可以重命名,按 MAC(换 IP 名字不变)或按 IP(适合随机 MAC 的手机、拿不到 MAC 的终端)。主机监控页新增“命名管理”,可以给还没上线的设备提前命名;两种都设置时 MAC 优先。旧版本的备注名会自动迁移。
  • 系统设置的 DNS 嗅探卡片说明了它的作用,并显示应答来自哪台 DNS 服务器(内网 / 外网),方便确认内网自建 DNS 的情况是否嗅探到了。接入向导和文档补充了内网自建 DNS(AdGuard Home / Pi-hole 等)的说明。

[0.1.3] - 2026-10-22

  • 修复:配置 RouterOS API(ROS_URL)后,概览页报“服务器内部错误:AttributeError: 'Response' object has no attribute 'get'”,页面打不开。原因是读取 RouterOS 返回数据时把 HTTP 响应对象当成了 JSON。
  • RouterOS 连接失败时给出具体提示:401 账号或密码错误、403 权限不足、连不上、超时。轮询失败时保留上一次成功的路由器信息。
  • 新增模拟 RouterOS REST 接口的测试。

[0.1.2] - 2026-10-22

首次使用安装向导

  • 新增首次使用安装向导(与 EasySub 相同的流程):在网页上填写 MySQL 地址、端口、账号、密码、库名,可以测试连接;保存后自动建表,并把连接信息保存到 data/db_config.json,然后设置管理员密码。
  • 连接失败时,提示具体原因和改法:地址不通、填了 127.0.0.1、账号或密码错误、没有权限、库不存在。
  • 数据库暂时不可用时(例如 MySQL 比 ROS-DPI 晚启动),页面显示“正在连接”并自动重试,后台每 30 秒重连一次,不需要重新填写;这期间采集到的流量先留在内存里,连上后一起写入。
  • 默认部署方式改为连接用户已有的 MySQL:docker-compose.yml 不再包含数据库设置。README 新增“准备数据库”(SQL、图形界面操作、远程连接注意事项)和常见问题表。
  • 自带 MySQL 的部署方式移到 docker-compose.with-mysql.yml(已预先配置连接,跳过向导)。
  • 设置环境变量 DATABASE_URL 时跳过向导;系统设置页会显示当前连接的数据库。
  • CI 增加真实 MySQL 8.4 上的安装向导测试。

[0.1.1] - 2026-10-22

开箱即用部署

  • README 与 Docker Hub 页面直接贴出完整的 docker-compose.yml;compose 改为自包含,不再需要 .env 文件。
  • 新增“首次使用”说明:首次打开网页只需设置管理员密码,MySQL 无需手动配置;补充使用已有 MySQL、修改密码、忘记管理员密码的方法。
  • 使用外部 MySQL 时,数据库不存在会自动创建(需要账号有建库权限)。
  • compose 默认镜像改为 Docker Hub(suyijun8182/ros-dpi),GHCR 同步发布。

[0.1.0] - 2026-10-21

首个版本。

  • IPFIX / NetFlow v9 流量采集,TZSP DNS 嗅探识别应用,可选 RouterOS 只读 REST 轮询。
  • 内置 100+ 应用、20+ 分类的识别规则库;支持按域名 / IP 段 / 端口自定义规则,“未识别域名 Top”一键归类。
  • 按 分钟 / 小时 / 天 汇总写入 MySQL(开发可用 SQLite),保留天数可配置。
  • 页面:全网概览、主机监控(含详情)、应用统计(含详情)、流量流向(桑基图)、识别规则、系统设置(含 RouterOS 接入向导)。
  • 中英双语,深浅色主题,适配手机。
  • Docker 镜像(amd64 / arm64)发布到 GHCR(配置了 Docker Hub 密钥时同时发布到 Docker Hub)。