Files
liuzhuohua 64df3cf331 feat: Drouter 1.0.0 —— Debian 13 软路由管理系统
一套跑在 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
2026-09-30 19:26:24 +08:00

93 lines
3.8 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# drouter —— 安装后配置
#
# 安全红线:本脚本只启动 drouter-web(管理后台)与 drouter-snapshot.timer(快照)。
# 绝不启动 dnsmasq / radvd / miniupnpd —— 它们会抢 53/67/546 端口或向局域网发 DHCP,
# 在已经有路由器的网络里会立刻造成冲突。
set -e
export DEBIAN_FRONTEND=noninteractive
case "$1" in
configure)
# 进入构建保护模式:让后端在此期间拒绝一切可能改网络的动作
mkdir -p /etc/drouter
printf 'build' > /etc/drouter/BUILD_MODE
# 阻止 apt/包管理期间服务自动启动
printf '#!/bin/sh\nexit 101\n' > /usr/sbin/policy-rc.d
chmod +x /usr/sbin/policy-rc.d
# deploy.sh 会以 /opt/drouter 为「源码目录」把文件安装到位(幂等,可重复执行)
if [ -f /opt/drouter/scripts/deploy.sh ]; then
DROUTER_SRC=/opt/drouter bash /opt/drouter/scripts/deploy.sh || {
echo "drouter: 部署失败,请查看上面的输出" >&2
}
fi
# 安装一键运维命令
if [ -f /opt/drouter/scripts/drouter-ctl.sh ]; then
install -m 0755 /opt/drouter/scripts/drouter-ctl.sh /usr/local/bin/drouter-ctl
fi
rm -f /usr/sbin/policy-rc.d
rm -f /etc/drouter/BUILD_MODE
systemctl daemon-reload || true
# 启用/启动服务。为什么不能只靠上面的 deploy.sh:
# deploy.sh 是「源码部署」路径的脚本,.deb 里虽然也带了它,但一旦它
# 执行失败(或将来被裁掉),单元文件就只躺在 /lib/systemd/system 里没人管,
# 用户装完发现「一个服务都没起来」。这里对**随包发布的每个单元**都显式兜底。
#
# 安全红线不变:只碰 drouter 自己的单元。
# dnsmasq / radvd / miniupnpd / dhcpcd 一律不 enable、不 start。
# drouter-rescue.service 是紧急救援通道,默认关闭,绝不自动启动。
if command -v systemctl >/dev/null 2>&1 && systemctl is-system-running >/dev/null 2>&1; then
systemctl enable drouter-web >/dev/null 2>&1 || true
systemctl restart drouter-web >/dev/null 2>&1 || true
# 常驻守护:让面板请求免去每次 spawn python3+sudo 的固定开销
systemctl enable drouter-helpd >/dev/null 2>&1 || true
systemctl restart drouter-helpd >/dev/null 2>&1 || true
# Web 终端守护:预启动,用户点「终端」时能立刻进 shell
systemctl enable drouter-shelld >/dev/null 2>&1 || true
systemctl restart drouter-shelld >/dev/null 2>&1 || true
# 自动快照:默认开启(每 6 小时)
systemctl enable drouter-snapshot.timer >/dev/null 2>&1 || true
systemctl start drouter-snapshot.timer >/dev/null 2>&1 || true
# 救援通道:刻意**不** enable、**不** start(需用户在界面显式开启)
else
echo "drouter: 未检测到运行中的 systemd,跳过服务启用。" >&2
echo "drouter: 请手动执行 —— systemctl enable --now drouter-web drouter-helpd drouter-shelld" >&2
fi
# 复核红线:这几个服务必须是「未启用」状态
for s in dnsmasq radvd miniupnpd; do
if systemctl is-enabled "$s" 2>/dev/null | grep -qx enabled; then
echo "drouter: 注意 —— $s 处于 enabled 状态,为避免与现有网络冲突请自行确认" >&2
fi
done
PORT=8443
[ -f /etc/drouter/web-port ] && PORT=$(head -1 /etc/drouter/web-port)
echo ""
echo " drouter 安装完成"
echo " 管理地址:https://<本机 LAN IP>:${PORT}/"
echo " 默认账号:admin / admin123(请登录后立即修改)"
echo " 一键运维:drouter-ctl status | repair | uninstall"
echo ""
;;
abort-upgrade|abort-remove|abort-deconfigure)
;;
*)
echo "postinst called with unknown argument \`$1'" >&2
exit 1
;;
esac
#DEBHELPER#
exit 0