- 流向图:从本地(WAN 口公网 IP 所在国家,默认中国)飞向各国,线宽 / 气泡大小表示流量,前 5 名标名字和流量;窄屏标签放上方 - 右侧排行:名次、本地标记、条形占比,“无法定位”放最后并说明原因 - 地图数据:跨 180° 经线的环(俄罗斯远东、斐济)移到东侧,不再画出横线 - 新表 domain_geo:记录流量时存下域名连到的 IP 和国家,不再依赖会过期的 DNS 缓存 - README 截图与描述同步 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
22 KiB
22 KiB
Changelog
[Unreleased]
debug11
- 家庭成员 / 人员必须属于一个分组 / 部门(后端校验);同一分组里不能重名;添加成员时没有分组可以就地新建。
- 成员列表每行加编辑按钮,详情页加编辑和删除(之前已有成员打不开编辑弹窗,也就删不掉)。
- 分组 / 部门下还有成员时不能删除,会提示先移走;以前没有分组的成员单独显示为“未分组”,方便补上。
- 国家 / 地区分布改为流向图:从本地(按 WAN 口公网 IP 判断,默认中国)飞向各国,线宽和气泡大小表示流量,流量最大的 5 个国家直接标名字和流量;右侧改为带名次的排行,“无法定位”放最后并说明原因。修正跨 180° 经线的国家在地图上画出的横线。
- 域名的国家在记录流量时就存下(新表 domain_geo),不再依赖会过期的 DNS 缓存;之前重启或隔天后大部分目标会显示为“无法定位”。
[0.5.0] - 2026-10-23
debug10:审计参照深信服 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
debug8(审计系统)、debug9
审计(新页面「审计日志」)
- 访问日志:按“访问”记录每台终端访问了什么:同一终端、同一目标、同一应用,间隔不超过 5 分钟算一次,超过 1 小时按小时切开;记录起止时间、目标域名 / IP、端口、应用、连接数、上下行流量、识别依据。进行中的访问每分钟写入并更新,最多慢一分钟。可按时间范围、终端、关键字、应用大类筛选,导出 CSV(最多 10 万行)。默认保留 30 天(
RETENTION_LOG_DAYS)。 - 上网时间线:终端详情新增「访问日志」「上网时间线」两个子标签,时间线按天显示在线时段和每个应用的使用时段,以及最早、最晚上网时间和在线时长。
- 审计规则:按应用大类、分类、应用、域名、流量超额、新设备接入设置规则,可限定星期、时段(支持跨午夜)、终端和当日流量门槛;提供 5 个常用模板。命中时记审计事件,同一规则同一终端一小时最多一次(设了流量门槛的一天一次)。
- 通知推送:企业微信、钉钉、飞书机器人,Bark,Telegram,通用 Webhook;可发测试消息。推送成功后事件才标为“已推送”。
- 日报 / 周报:总流量、识别率、Top 终端和应用、新增终端、审计事件;日报每天 08:00、周报每周一 08:30 推送,也可立即推送。
- 操作日志:登录(含失败)、改设置、改规则、改名、导出、用户管理等操作,密码和密钥不记录。审计事件和操作日志保留 180 天(
RETENTION_EVENT_DAYS)。
用户与权限(debug9)
- 系统分管理员和普通用户。普通用户只读:能看监控、访问日志、审计事件和报表,能改自己的密码;不能改设置、规则、名称和通知,也看不到系统配置和操作日志。权限由后端统一检查。
- 系统设置新增「用户管理」:新建用户、改角色、重置密码、删除;至少保留一个管理员,不能删除当前账号;删除后该账号的登录立即失效。升级前的账号都是管理员。
应用统计(debug9)
- 参照维盟「DPI 协议详情」改版:先列应用大类,「查看详情」进入小类,再进入具体应用;带面包屑、返回顶部、返回上一级。顶部是当前这一级的上传 / 下载总速度和总数据,每列显示“数值 | 本级占比”,可按任一列排序;10 / 30 / 60 秒自动刷新,可停止。
sing-box 与流量流向(debug9)
- 走 sing-box 的流量:域名只能认出 HTTPS 这类通用协议时,按 sing-box 命中的规则集名或策略组名(如
rule_set=Telegram0、✈️ Telegram)认出具体应用。 - 实时连接显示每条代理连接走的策略组和出口节点(悬停看命中的规则)。
- 流量流向新增「代理分流」:今天各策略组、各出口节点的流量、连接数和主要应用。
- 访问目标排行显示国家 / 地区(IP 查 ASN 库;域名按它在 DNS 缓存里解析到的 IP 查),并有国家 / 地区分布,点一项只看该国家的目标。
修复(debug9)
- 实时流量上下行几乎一样:读默认路由时把策略路由表(例如导给 sing-box 旁路由的路由表)里的默认路由也当成了 WAN,LAN 网桥的收发被叠加进来。现在只看主路由表,并排除开着 DHCP 服务的接口。
- 全网状态分成两排:多条 WAN 线路合并成一张卡逐行显示,全网状态始终一排。
- 手机上流量构成饼图的图例改到饼图下方,不再压住饼图;访问日志表在手机上不再需要横向滑动。
[0.3.0] - 2026-10-23
debug5 ~ debug8(含原计划的 0.2.1)
识别准确度(debug7)
- 接入旁路代理 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 个”。
识别库自动更新(debug8)
- v2fly 规则每天自动检查上游最新提交,有更新就下载、转换、自检(抽样域名必须识别正确,应用数不能骤减),通过后热加载,不需要重启;不通过或没有外网时保留现有规则。可以关闭,也可以手动“立即检查更新”。
- 识别规则页新增“识别库”面板:内置规则库、v2fly 域名库、IP 归属库各自的版本、规模、许可证、上次检查结果。
- 转换逻辑移到
backend/app/classify/v2fly.py,生成的文件头记录来源提交;scripts/import_v2fly.py仍可用于发版前更新镜像自带的规则。
布局审计
- 所有页面在桌面、平板、手机三种宽度下检查并调整:手机上表格隐藏次要列,名称下方补充关键信息;子标签条横向滑动;统计卡改成与其他卡片一致的样式;平板上三张统计卡保持一行;终端详情底部两张表在平板上下排;全网状态小卡按实际数量排列,不再出现落单的一张;只有一两个数据点的折线图显示数据点。
- 系统设置拆成 运行状态 / 接入与自检 / 外部数据源 / 网络与账号 四个子标签,有问题的子标签显示红点;接入向导的主机 IP 默认取自检到的地址。
- 识别规则页的说明收进说明条,应用下拉框默认选中第一项。
- 备注名与主机名相同时只显示一次。
图表、流量流向、接入自检(debug5、debug6)
- 图表对齐维盟 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。
- 接入自检(debug6):用只读账号读取 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
debug4:参考维盟路由系统 4.0(WayOS)改版,并合并原计划的 0.1.5。
界面
- 新 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
debug3
- 应用分类改成 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
debug2
- 新增首次使用安装向导(与 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
debug1
- 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)。