管理面板
面板是同一个二进制里的 panel 子命令,前端已经嵌在里面。它以非 root 用户运行,自己不做任何特权操作:所有需要 root 的动作都经本地套接字交给特权助手 helper,助手只接受固定白名单里的操作,命令是固定数组,绝不拼接输入。
访问
默认只监听 127.0.0.1:8080,经 SSH 隧道访问:
ssh -N -L 8899:127.0.0.1:8080 root@<服务器IP>
# 浏览器打开 http://127.0.0.1:8899/要直接从公网访问,在 config.env 里把 PANEL_LISTEN 改成 0.0.0.0:<端口>。监听非回环地址时,面板必须同时满足两个条件才会启动,否则拒绝启动:
- 已经设置了密码;
- 证书可读(用的是入口那张证书的副本,由例行维护同步)。
宁可起不来,也不让一个没有密码的特权面板暴露在公网。
没设密码时,面板只接受来源是回环地址、并且 Host 是 localhost / 127.0.0.1 的请求。只看来源地址不够:经 SSH 隧道访问时,一个 DNS 重绑定的恶意网页也能让浏览器把请求发到 127.0.0.1,但它带的 Host 是自己的域名。
登录与账号
| 项 | 行为 |
|---|---|
| 用户名与密码 | sudo dns-stack panel-password 设置;用户名 2–32 位(字母、数字和 . _ -,不区分大小写),密码 12–256 位,scrypt 加盐存储 |
| 二次认证 | 可选 TOTP(30 秒、6 位);丢了手机用 sudo dns-stack panel-2fa-reset 关闭 |
| GitHub 登录 | 可选;只放行允许列表里的账号,每个账号第一次登录时记下数字 ID;验证通过一次之后才允许关闭密码登录 |
| 会话 | 默认 12 小时过期;登录时勾选「在这台设备上保持 7 天」则为 7 天,到期要重新登录。改密码、或在「账号 → 会话 → 其它设备」点「全部退出」,会让其它设备上的登录立即失效,这台设备换发一个同样时长的新会话 |
| 爆破防护 | 按来源 IP 计数,第 5 次失败起等待 30 秒,此后每次翻倍,最长 1 小时;每次尝试在校验之前就记数,全局同时最多 2 个密码校验在跑 |
| 登出 | 当前会话的令牌立即作废,不只是删掉浏览器里的 cookie |
登录失败只提示「用户名或密码错误」,不说是哪一项错了。从旧版本升级、还没设过用户名的部署,登录照旧只要密码,直到在「账号」页或用 panel-password 设一个。
改密码、改用户名都不会动二次认证和 GitHub 登录的配置;在面板里改密码也不会重新打开已经关闭的密码登录。服务器上的 dns-stack panel-password 是救急入口,它会重新启用密码登录。
密码登录关闭之后,GitHub 是唯一的入口:面板不接受清空 Client ID 或删掉最后一个允许的账号。
页面
| 页面 | 内容 |
|---|---|
| 概览 | 近 1 小时请求、缓存命中、响应速度(本机递归的中位数,鼠标停在数字上看缓存和香港)、24 小时失败率;请求趋势、线路、上游、系统、解析器 |
| 查询 | 实时请求(进入即自动连接)、域名统计。见 查询日志与统计 |
| 工具 | 解析测试、CDN 就近、IP 查询、我的位置、日志 |
| 设置 | 接入、域名规则、缓存与数据、维护、审计 |
| 账号 | 用户名与密码、二次认证、GitHub 联合登录、当前会话 |
主题按钮(桌面在侧栏底部,手机在右上角)在「跟随系统 → 浅色 → 深色」之间切换,选择记在浏览器里;每个页面上次停在哪个标签也会记住。手机、平板和桌面各有一套布局。系统设置了「减少动态效果」时,面板里的过渡动画全部关掉。
Ctrl+K(Mac 上 ⌘K,或点顶栏的放大镜)打开快速跳转:输入域名给出「解析详情 / 搜索它的请求 / 解析测试」,输入 IP 给出「查归属 / 反查」,输入页面名直接跳过去。这里只放只读的动作,清缓存、改名单这类操作仍要到对应页面点。
请求趋势
把鼠标放在图上,竖线吸附到最近的时间段,提示框列出这一段每条线的次数。点一下跳到「查询」页看这一段的请求,按住拖一段看拖选范围内的请求;回到实时点「回到实时」或筛选栏里时间段标签上的 ×。键盘可以用左右方向键移动、回车打开。
趋势图只在新的一段走完时才重新取数(1 小时视图约 50 秒一次,24 小时视图 20 分钟一次),不会每 5 秒重画一遍。
健康状态怎么看
一切正常时概览顶部不显示任何横幅。有模块停了、上游离线、分流失效或隧道断开时,顶部才出现一条提示,逐条列出问题,点「查看」跳到「设置 → 维护」,模块的完整列表在那一页底部。
工具
- 解析测试:在服务器上解析一个名字。类型按输入自动判断:IP 查 PTR,
_sip._tcp.example.com这类查 SRV,其它_开头的查 TXT,普通域名同时查 A 和 AAAA;也可以手动指定。结果给出答案归属、权威走直连还是隧道、命中了哪张名单,并能一键把域名加进国内解析或香港解析。 - CDN 就近:以电信、联通、移动三个真实 /24 解析大厂域名,看各自有没有拿到国内节点。见 ECS 就近调度。
- IP 查询:多个归属库对照。
- 我的位置:在你的浏览器里发起探测——服务器上的自查代表不了设备的实际体验。
- 日志:所有服务的日志合在一条时间线里,每行是「时间 · 服务 · 级别 · 内容」,经助手脱敏(IP 只留前两段、DoH 路径和密钥打码)。级别取自程序自己写的级别字段(mosproxy 的 JSON
level、Unbound 的error:/warning:、systemd 的启动失败),不按正文里出现的单词猜;只有「错误 / 警告」这两个字上色,正文保持中性色。扫描器打到 DoH 或面板端口留下的「路径不对」「TLS 握手失败」,以及定时任务(看门狗每分钟一次)每次启停的 systemd 记录,归为「噪声」并默认收起,点一下才显示;服务的启动、停止、失败照常显示。mosproxy 的 JSON 行展开成[模块] 消息 键=值的可读形式,原文在点开某一行后的详情里。最多保留 1 万行,但只画看得见的几十行;往上翻看时新日志不会把画面拽走,底部提示「↓ N 行新日志」。
设置
| 标签 | 内容 |
|---|---|
| 接入 | DoH / DoT / DoQ 接入地址(复制)、轮换 DoH 私密路径、TLS 证书 |
| 域名规则 | 国内解析、香港解析、拦截三张名单,访问控制。见 出口分流 |
| 缓存与数据 | 缓存策略、清缓存、分流数据集(直连域名、污染 IP)、解析失败最多的域名、CDN 直连规则集 |
| 维护 | 服务控制、自动备份周期与保留份数、迁移、清理、模块状态 |
| 审计 | 面板上做过的每一次操作;清空审计本身不再留下一条记录 |
危险操作
会中断解析、丢数据或改变对外行为的操作(重启服务、清缓存、轮换 DoH 路径、续签证书、清空统计等)都要二次确认。确认框里会写清楚后果,例如「新路径生效后,所有客户端都要同步更新」。后端同样校验:没有确认标记的危险请求直接被拒绝,前端被绕过也没用。
审计记录会去掉密码、密钥等字段后保存。
面板挂了怎么办
不影响解析。面板和助手都只是管理入口,停掉它们 DNS 照常工作。
sudo systemctl restart dns-stack-panel
sudo journalctl -u dns-stack-panel -n 50 --no-pager