Files
drouter/packaging/docker/Dockerfile
T
liuzhuohua 7b321bfdce fix: 第二轮深度审计 —— 堵提权/注入、收口资源生命周期、低配置性能水位,版本号 1.0.5
安全:
- 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
2026-10-02 10:25:40 +08:00

78 lines
3.3 KiB
Docker
Raw 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.
# =============================================================================
# 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"]