安全:
- 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
100 lines
5.1 KiB
YAML
100 lines
5.1 KiB
YAML
# =============================================================================
|
|
# Drouter —— Docker Compose 编排
|
|
#
|
|
# 用法:
|
|
# docker load -i drouter-1.0.5-docker.tar
|
|
# docker compose up -d
|
|
# 浏览器打开 https://<宿主IP>:8443/
|
|
#
|
|
# ⚠️ 先读这三条,否则会踩坑:
|
|
#
|
|
# 1) 必须是 network_mode: host
|
|
# 容器要直接读写宿主网络接口和 nftables 规则,bridge 模式下看到的是
|
|
# 容器自己的网络命名空间,读不到真实网卡,也管不了宿主的 NAT。
|
|
#
|
|
# 2) NET_ADMIN 不能省
|
|
# 少了它 nft 操作会报 "Operation not permitted",防火墙页直接失效。
|
|
# 实测:加上之后 /api/nft 正常返回真实规则集。
|
|
#
|
|
# 3) 这是「体验 / 调试」形态,不建议当主路由
|
|
# 容器里没有 systemd,服务管理页会显示 active: unknown(优雅降级,不是 bug),
|
|
# 且无法持久化 systemd 单元。真正长期当路由器跑请用 .deb 装到物理机/虚拟机上。
|
|
# =============================================================================
|
|
|
|
services:
|
|
drouter:
|
|
# 镜像从 tar 加载后即为这个名字。若你改过标签,这里同步改。
|
|
image: drouter:1.0.5
|
|
|
|
# 固定容器名,方便 docker exec / logs 直接引用
|
|
container_name: drouter
|
|
|
|
# host 网络是硬要求,见文件头说明
|
|
network_mode: host
|
|
|
|
# ── 权限 ───────────────────────────────────────────────────────────
|
|
# 这里**不用** privileged(过度授权)。只给真正需要的能力:
|
|
cap_add:
|
|
- NET_ADMIN # nft / iptables / 路由表 / 接口配置
|
|
- NET_RAW # ping / traceroute 等原始套接字探测
|
|
- NET_BIND_SERVICE # 绑定 8443(<1024 的端口才严格需要,这里保守给上)
|
|
# 若你想省事、且接受更大权限面,可以注释掉上面三行改用:
|
|
# privileged: true
|
|
|
|
# ── 端口 ───────────────────────────────────────────────────────────
|
|
# network_mode: host 下 ports 会被忽略,端口由 /etc/drouter/web-port 决定。
|
|
# 这里写出来只是**文档作用**,让 `docker compose config` 能看出监听什么。
|
|
expose:
|
|
- "8443" # HTTPS 管理面板
|
|
- "8080" # 备用 HTTP(默认关闭,可在「系统设置」里开)
|
|
|
|
# ── 持久化 ─────────────────────────────────────────────────────────
|
|
# 这四个目录**必须**挂出来,否则 docker compose down 一次配置就全丢了。
|
|
volumes:
|
|
# 配置核心:settings、web-port、active-theme、证书索引
|
|
- drouter-etc:/etc/drouter
|
|
# 运行时数据:SQLite 库、流量统计
|
|
- drouter-data:/opt/drouter/data
|
|
# 配置快照:出问题时的回滚依据
|
|
- drouter-snapshots:/opt/drouter/snapshots
|
|
# 日志
|
|
- drouter-log:/var/log/drouter
|
|
|
|
# ── 环境变量 ───────────────────────────────────────────────────────
|
|
environment:
|
|
TZ: Asia/Shanghai
|
|
# Web 端口只在**首次启动**时播种进 /etc/drouter/web-port。
|
|
# 之后想改端口,请到「系统设置」界面改 —— 别再改这里的环境变量,
|
|
# 否则会出现「界面里改了却没生效」的困惑(环境变量优先级高于配置文件)。
|
|
DROUTER_WEB_PORT: "8443"
|
|
|
|
# ── 启动策略 ───────────────────────────────────────────────────────
|
|
# unless-stopped:重启宿主后自动拉起,但用户手动 stop 后不会自己回来
|
|
restart: unless-stopped
|
|
|
|
# ── 健康检查 ───────────────────────────────────────────────────────
|
|
# /api/health 是免鉴权接口,适合探活。
|
|
# ⚠️ 面板走 HTTPS 且用自签证书,curl 必须加 -k,否则永远 unhealthy。
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "PORT=$(cat /etc/drouter/web-port 2>/dev/null || echo 8443); curl -fsSk --max-time 4 https://127.0.0.1:${PORT}/api/health >/dev/null 2>&1 || exit 1"]
|
|
interval: 30s
|
|
timeout: 5s
|
|
start_period: 20s
|
|
retries: 3
|
|
|
|
# ── 日志 ───────────────────────────────────────────────────────────
|
|
logging:
|
|
driver: json-file
|
|
options:
|
|
max-size: "10m"
|
|
max-file: "3"
|
|
|
|
# =============================================================================
|
|
# 命名卷
|
|
# =============================================================================
|
|
volumes:
|
|
drouter-etc:
|
|
drouter-data:
|
|
drouter-snapshots:
|
|
drouter-log:
|