安全:
- chpasswd 换行注入可改 root 密码:用户名/密码拒绝换行与控制字符
- 删用户保护从写死两个名字改为 UID<1000 系统账号
- WOL 接口名白名单 + 目标地址 IPv4 校验,去 sh -c 管道
- ACL hosts 改 ipaddress 严格校验;存储挂载点限定 /mnt|/media|/srv
- 文件管理器拒绝清单扩到目录级 + 按文件名拦截(authorized_keys/shadow 等)
- 前端 201 处 value="${...}" 补 esc();href 只放行 http/https;
主题导出注释同时剥 /* 与 */
丢数据/假功能:
- ACL/文件共享/DDNS 三页切走再回来草稿被静默覆盖:新增 PAGE_DIRTY 脏页登记
- LAN 页网关/域名写进 system 死键,改绑 dnsmasq 同源
- UPnP 映射表按钮不再顺手起服务,走只读接口 read:upnpmap
资源:
- PTY 缓冲 8MB 封顶 + 会话信号量 + 后台空闲回收 + 离开页面主动断开
- Web 工作线程 48 封顶、请求体 16MB 封顶、会话 500 封顶改单调时钟、
审计 2 万行裁剪、helpd 并发 6 封顶
- helper 日志 32MB 轮转;快照前查磁盘余量;fs 下载 512MB→20MB
(通道单条响应 32MB,超限只会静默失败)
- 11 处配置写入改原子写;rescue/snapshot 单元补 MemoryMax(三处同步)
性能:
- /api/config 16 次开库 → 1 次 IN 查询
- cleanup 状态扫描 30s 缓存;gzip 缓存加 24MB 字节闸
- 后台标签页心跳暂停、终端轮询降频
杂项:DHCPv6 停用只留注释;租约回收用 dhcp_release(DEPS 可选登记);
VLAN 只删自建接口;公网探测清残留结果文件;快照根白名单;
心跳定时器防重复;keep_days/keep_rows 不吞 0
78 lines
3.3 KiB
Docker
78 lines
3.3 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.5
|
||
# =============================================================================
|
||
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="MIT"
|
||
|
||
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/
|
||
# 只拷顶层 .md:docs/screenshots/ 是给 GitHub README 用的 78 张截图,
|
||
# 进镜像纯属白白撑大体积
|
||
COPY docs/*.md /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"]
|