一套跑在 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
93 lines
3.8 KiB
Bash
93 lines
3.8 KiB
Bash
#!/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
|