一套跑在 Debian 13 (trixie) 上的软路由管理系统,提供 43 个功能页面的 Web 管理面板:WAN 接入、PPPoE 多拨、DHCP/DNS、IPv6、防火墙、QoS 限速、 访问控制、DDNS、文件共享、Docker 管理等。 核心设计原则:不重新实现任何协议 PPPoE 交给 ppp,DHCP 交给 dnsmasq,IPv6 RA 交给 radvd,NAT 交给 nftables。 Web 面板只做三件事:渲染原生配置文件 → 语法预检 → 原子写入并 reload。 面板删掉后,系统仍是一台配置完好的 Debian 路由器。 安全默认值 · 安装后不接管网络:不改默认路由、不开 IP 转发、不启动 DHCP 服务 · 所有改网络的动作都需要用户在面板上亲手点「应用」 · 避开 5900 端口,不触碰 VNC / X 会话 · 配置写入前先做语法预检,失败则回滚 架构 · backend/ Python 3 标准库,零第三方依赖(9 个模块) · web/ 原生 JS/CSS,无构建步骤 · 常驻 helper 通过 Unix socket 提供 75 个动作,socket 不可用时回退 subprocess · 鉴权走 X-Token 请求头 打包 · packaging/build-deb.sh → drouter_1.0.0_all.deb(含 6 个 systemd 单元) · scripts/make-offline-deps.sh → 236 个依赖 .deb + 本地仓库索引 · packaging/build-offline-bundle.sh → 自包含离线包,目标机零外网可装 · packaging/build-docker.sh → 容器镜像(体验用) 测试 40 套单元测试 + 3 个前端检查脚本(菜单映射 / 离线渲染 / 手机适配), 全部挂在 devtools/sync.sh 的预检链里。 许可:MIT
31 lines
1.7 KiB
Bash
31 lines
1.7 KiB
Bash
#!/bin/bash
|
||
# 模拟“用户在 WEB 里填写 PPPoE 账号密码后点击保存并应用”的完整链路
|
||
B=http://127.0.0.1:8080
|
||
TOK=$(curl -s $B/api/login -X POST -H 'Content-Type: application/json' \
|
||
-d '{"username":"admin","password":"admin123"}' \
|
||
| python3 -c 'import sys,json;print((json.load(sys.stdin).get("data") or {}).get("token",""))')
|
||
[ -z "$TOK" ] && { echo "登录失败"; exit 1; }
|
||
|
||
echo "=== A. 保存 pppoe 模块配置(仅保存)==="
|
||
curl -s $B/api/save -X POST -H "X-Token: $TOK" -H 'Content-Type: application/json' \
|
||
-d '{"module":"pppoe","data":{"iface":"ens18","username":"user@test","password":"secret999","isp":"ct","mtu":1492}}' \
|
||
| python3 -m json.tool --no-ensure-ascii 2>/dev/null || echo "(接口不存在,尝试 apply)"
|
||
|
||
echo
|
||
echo "=== B. 通过 apply 接口写盘(构建保护模式下 live=false)==="
|
||
curl -s $B/api/apply -X POST -H "X-Token: $TOK" -H 'Content-Type: application/json' \
|
||
-d '{"module":"ppp","data":{"iface":"ens18","username":"user@test","password":"secret999","isp":"ct","mtu":1492},"live":false}' \
|
||
| python3 -m json.tool --no-ensure-ascii
|
||
|
||
echo
|
||
echo "=== C. 落盘结果 ==="
|
||
echo "--- /etc/ppp/peers/drouter-wan ---"; cat /etc/ppp/peers/drouter-wan 2>/dev/null | head -12
|
||
echo "--- /etc/ppp/chap-secrets ---"; cat /etc/ppp/chap-secrets 2>/dev/null
|
||
echo "--- 权限 ---"; ls -l /etc/ppp/peers/drouter-wan /etc/ppp/chap-secrets 2>/dev/null
|
||
|
||
echo
|
||
echo "=== D. 服务是否仍未被启动(安全不变量)==="
|
||
for s in pppd dnsmasq; do printf " %-8s %s\n" "$s" "$(systemctl is-active $s 2>&1)"; done
|
||
ss -lnu | grep -E ':53 |:67 ' && echo " 端口被占用(异常)" || echo " 53/67 仍空闲 ✔"
|
||
echo "PPPOE_SAVE_PATH_OK"
|