一套跑在 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
76 lines
3.2 KiB
Docker
76 lines
3.2 KiB
Docker
# =============================================================================
|
|
# drouter —— Docker 镜像
|
|
#
|
|
# 定位:用于「快速体验 / 开发调试 / CI 渲染校验」。
|
|
# 真正当主路由跑,请直接装在 Debian 13 物理机或虚拟机里(需要直接操作网卡与
|
|
# nftables,容器只能以 --network host + NET_ADMIN 勉强模拟)。
|
|
#
|
|
# 构建:bash packaging/build-docker.sh [tag]
|
|
# 运行:docker run -d --name drouter \
|
|
# --network host --cap-add NET_ADMIN --cap-add NET_RAW \
|
|
# -v drouter-data:/opt/drouter/data \
|
|
# -v drouter-etc:/etc/drouter \
|
|
# drouter:1.0.0
|
|
# =============================================================================
|
|
FROM debian:trixie-slim
|
|
|
|
LABEL maintainer="火麒麟 (ajeef) <https://github.com/liuzhuohua>" \
|
|
org.opencontainers.image.title="drouter" \
|
|
org.opencontainers.image.description="Debian 13 主路由管理系统(Web 管理面板)" \
|
|
org.opencontainers.image.licenses="GPL-3.0"
|
|
|
|
ENV DEBIAN_FRONTEND=noninteractive \
|
|
PYTHONUNBUFFERED=1 \
|
|
TZ=Asia/Shanghai
|
|
|
|
# 1) 依赖。只装运行 Web 面板与渲染配置所必需的包;
|
|
# 不装 dnsmasq/radvd —— 容器里默认不启动,装了也不会跑。
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
python3 \
|
|
nftables \
|
|
iproute2 \
|
|
iputils-ping \
|
|
ethtool \
|
|
conntrack \
|
|
bridge-utils \
|
|
sqlite3 \
|
|
curl \
|
|
procps \
|
|
sudo \
|
|
openssl \
|
|
ca-certificates \
|
|
tzdata \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
# 2) 程序文件
|
|
RUN mkdir -p /opt/drouter/backend /opt/drouter/web /opt/drouter/docs \
|
|
/opt/drouter/data /opt/drouter/snapshots /opt/drouter/certs \
|
|
/opt/drouter/scripts /opt/drouter/bin \
|
|
/etc/drouter/generated /etc/drouter/themes \
|
|
/var/log/drouter /run/drouter-helper
|
|
COPY backend/*.py /opt/drouter/backend/
|
|
COPY web/ /opt/drouter/web/
|
|
COPY docs/ /opt/drouter/docs/
|
|
COPY scripts/*.sh /opt/drouter/scripts/
|
|
COPY packaging/docker/docker-init.sh /opt/drouter/bin/docker-init.sh
|
|
RUN chmod +x /opt/drouter/bin/docker-init.sh /opt/drouter/scripts/*.sh
|
|
|
|
# 3) 运行用户(容器里以低权用户跑 Web,写 /etc 走 helper 白名单)
|
|
RUN useradd -r -s /usr/sbin/nologin -d /opt/drouter -M drouter \
|
|
&& printf 'drouter ALL=(root) NOPASSWD: /usr/bin/python3 /opt/drouter/backend/drouter-helper.py *\n' \
|
|
> /etc/sudoers.d/drouter \
|
|
&& chmod 0440 /etc/sudoers.d/drouter \
|
|
&& chown -R drouter:drouter /opt/drouter/data /opt/drouter/snapshots /opt/drouter/certs /var/log/drouter \
|
|
&& chmod 700 /run/drouter-helper
|
|
|
|
EXPOSE 8080 8443
|
|
VOLUME ["/opt/drouter/data", "/opt/drouter/snapshots", "/etc/drouter", "/var/log/drouter"]
|
|
|
|
# 端口要跟着实际配置走,写死 8443 会在用户改端口后一直报 unhealthy
|
|
HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \
|
|
CMD curl -sk "https://127.0.0.1:$(cat /etc/drouter/web-port 2>/dev/null || echo 8443)/api/health" \
|
|
|| exit 1
|
|
|
|
ENTRYPOINT ["/opt/drouter/bin/docker-init.sh"]
|
|
CMD ["/usr/bin/python3", "/opt/drouter/backend/drouter-web.py"]
|