一套跑在 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
73 lines
2.6 KiB
Bash
73 lines
2.6 KiB
Bash
#!/bin/bash
|
||
# Debian13 主路由系统 —— 底座安装脚本 v2(干净环境版)
|
||
#
|
||
# 安全约束(重要):
|
||
# 1. 安装期间禁止任何服务自动启动(policy-rc.d 返回 101)
|
||
# 2. 不触碰 NetworkManager(ens18 的网络保持原样)
|
||
# 3. 不触碰 RealVNC / LightDM / X 会话
|
||
# 4. 不加载任何 nftables 生效规则
|
||
set -e
|
||
export DEBIAN_FRONTEND=noninteractive
|
||
|
||
MARK=/etc/drouter-build-phase
|
||
echo "=== 阶段 1/6:进入构建保护模式 ==="
|
||
mkdir -p "$(dirname "$MARK")"
|
||
printf 'build' > "$MARK"
|
||
|
||
# 阻止一切服务在安装期间自动启动/重启
|
||
printf '#!/bin/sh\nexit 101\n' > /usr/sbin/policy-rc.d
|
||
chmod +x /usr/sbin/policy-rc.d
|
||
|
||
# 记录 RealVNC 状态用于事后校验
|
||
echo "--- 安装前 RealVNC 状态 ---"
|
||
systemctl is-active vncserver-x11-serviced 2>/dev/null || true
|
||
ss -lnt 2>/dev/null | grep ':5900' || echo "5900 未监听"
|
||
echo "--- 安装前网络 ---"
|
||
ip -4 -o addr show ens18 2>/dev/null || echo "(ens18 不存在,跳过)"
|
||
|
||
echo "=== 阶段 2/6:apt update ==="
|
||
apt-get update -qq 2>&1 | tail -3
|
||
|
||
echo "=== 阶段 3/6:安装软件包 ==="
|
||
# 注意:这里刻意不含 samba / nfs-kernel-server / docker.io ——
|
||
# 它们装完会自动拉起常驻服务,属于用户在界面上按需安装的组件,
|
||
# 不应在「装底座」这一步就被带起来。
|
||
PACKAGES="
|
||
ppp pppoe pppoeconf
|
||
dnsmasq radvd
|
||
nftables
|
||
miniupnpd chrony
|
||
ethtool iperf3 mtr-tiny traceroute dnsutils conntrack
|
||
bridge-utils vlan iproute2
|
||
sqlite3 logrotate rsyslog
|
||
curl wget
|
||
python3
|
||
exfatprogs ntfs-3g dosfstools xfsprogs btrfs-progs f2fs-tools
|
||
etherwake zip unzip p7zip-full iputils-ping vim-tiny
|
||
"
|
||
apt-get install -y --no-install-recommends $PACKAGES 2>&1 | tail -25
|
||
|
||
echo "=== 阶段 4/6:确保新装服务处于停止+禁用 ==="
|
||
for s in dnsmasq radvd dhcpcd miniupnpd chrony rsyslog; do
|
||
systemctl stop "$s" 2>/dev/null || true
|
||
systemctl disable "$s" 2>/dev/null || true
|
||
done
|
||
|
||
echo "=== 阶段 5/6:退出保护模式 ==="
|
||
rm -f /usr/sbin/policy-rc.d
|
||
|
||
echo "=== 阶段 6/6:校验 ==="
|
||
echo "--- RealVNC 状态 ---"
|
||
systemctl is-active vncserver-x11-serviced 2>/dev/null || true
|
||
ss -lnt 2>/dev/null | grep ':5900' || echo "5900 未监听(异常!)"
|
||
echo "--- 网络(应与安装前一致)---"
|
||
ip -4 -o addr show ens18 2>/dev/null || echo "(ens18 不存在,跳过)"
|
||
echo "--- 服务状态 ---"
|
||
for s in dnsmasq radvd miniupnpd chrony NetworkManager; do
|
||
printf "%-16s active=%-10s enabled=%s\n" "$s" \
|
||
"$(systemctl is-active $s 2>/dev/null)" "$(systemctl is-enabled $s 2>/dev/null)"
|
||
done
|
||
echo "--- 端口占用 ---"
|
||
ss -lntup 2>/dev/null | grep -E ':(53|67|546|5900)\b' || echo "(53/67/546 均未被占用,符合预期)"
|
||
echo "INSTALL_DONE"
|