一个面向北京信息科技大学(BISTU)校园网认证环境的轻量级 Docker 自动登录容器。
项目使用 BusyBox 作为基础镜像,不依赖 cron、Python、curl 等额外运行环境。容器启动后由一个常驻 Shell 脚本循环检查互联网连通性,在检测到离线时自动获取校园网出口 IP/MAC、拼接认证请求并尝试重新登录。
- 轻量化:基于
busybox:1.38.0-musl,适合 OpenWrt、软路由和其他嵌入式 Linux 设备。 - 无需 cron:PID 1 直接运行检测 → 登录 →
sleep循环,不依赖额外定时服务。 - 多架构镜像:GitHub Actions 自动构建
amd64、arm64、arm/v7和arm/v6镜像。 - 自动检测 IP/MAC:根据到认证服务器的实际路由自动判断出口接口、IPv4 地址和 MAC 地址。
- 支持强制覆盖:
CLIENT_IP和CLIENT_MAC可以分别覆盖自动检测结果。 - 外部配置文件:统一从
/data/login.conf读取配置。 - 双路日志:日志同时输出到容器标准输出和
/data/log/YYYY-MM-DD.log。 - 自动日志清理:默认保留最近 7 天的日志,可配置。
- 调试模式:开启后记录更详细的检测和认证信息,并保存最后一次认证返回内容及
wgetstderr。 - 减少闪存写入:普通模式仅在网络状态变化、执行认证或出现异常时记录关键日志。
- 最小权限运行:根文件系统只读,仅保留
ping所需的NET_RAWcapability。
.
├── .github/
│ └── workflows/
│ └── docker-image.yml
├── data/
│ └── .gitkeep
├── .dockerignore
├── .gitignore
├── Dockerfile
├── docker-compose.yml
├── login.conf.example
├── login.sh
└── README.md
data/login.conf、运行日志和调试返回数据都已通过 .gitignore 排除,不应提交到 GitHub。
cp login.conf.example data/login.conf编辑:
vi data/login.conf最简单的配置只需要:
USERNAME=your_username
PASSWORD=your_passworddocker compose up -d --build旧版 Docker Compose 可以使用:
docker-compose up -d --build容器控制台:
docker logs -f bistu-login持久化日志:
/data/log/YYYY-MM-DD.log
宿主机使用当前项目目录时对应:
./data/log/YYYY-MM-DD.log
项目已发布到 GitHub Container Registry(GHCR):
ghcr.io/lonespectator/bistu-net-login:latest
直接运行:
docker run -d \
--name bistu-login \
--restart unless-stopped \
--network host \
--read-only \
--tmpfs /tmp:size=1m,mode=1777 \
--cap-drop ALL \
--cap-add NET_RAW \
--security-opt no-new-privileges:true \
-v "$(pwd)/data:/data" \
ghcr.io/lonespectator/bistu-net-login:latest也可以继续使用本项目的 docker-compose.yml,通过环境变量指定预构建镜像:
BISTU_LOGIN_IMAGE=ghcr.io/lonespectator/bistu-net-login:latest \
docker compose up -d --no-build只有 USERNAME 和 PASSWORD 是必填项,其余配置都有默认值。
认证服务器IP默认为无线网配置,有线网需修改AUTH_SERVER_IP=10.144.0.3!
| 配置项 | 默认值 | 说明 |
|---|---|---|
USERNAME |
无 | 校园网用户名,必填 |
PASSWORD |
无 | 校园网密码,必填 |
AUTH_SERVER_IP |
10.144.49.2 |
校园网认证服务器 IP ,默认为无线网,有线网修改为10.144.0.3 |
AUTH_SERVER_PORT |
802 |
服务器认证端口,非必要勿修改 |
LOOP_INTERVAL_SECONDS |
60 |
两次联网状态检测之间的间隔秒数 |
PING_IP |
223.6.6.6 |
用于判断互联网是否已经连通的目标 IP |
LOG_RETENTION_DAYS |
7 |
日志保留天数 |
DEBUG |
false |
是否开启详细调试日志 |
CLIENT_IP |
自动检测 | 强制指定提交给认证服务器的客户端 IPv4 地址 |
CLIENT_MAC |
自动检测 | 强制指定提交给认证服务器的客户端 MAC 地址 |
完整示例:
USERNAME=your_username
PASSWORD=your_password
# 以下配置均可省略
# AUTH_SERVER_IP=10.144.49.2
# AUTH_SERVER_PORT=802
# LOOP_INTERVAL_SECONDS=60
# PING_IP=223.6.6.6
# LOG_RETENTION_DAYS=7
# DEBUG=false
# 留空或不填写时自动检测
# CLIENT_IP=10.153.123.123
# CLIENT_MAC=9f:c5:a6:0c:61:9bCLIENT_IP 和 CLIENT_MAC 可以独立设置。例如,只指定 MAC 而让脚本自动检测 IP:
CLIENT_MAC=9f:c5:a6:0c:61:9bMAC 地址中的 :、- 或 . 会在发送认证请求前自动去除并转换为小写格式。
脚本首先查询到认证服务器的实际路由:
ip route get 10.144.49.2然后获取:
- 出口网络接口;
- 对应 IPv4 source address;
- 对应接口的 MAC 地址。
由于校园网认证请求中需要使用真实校园网侧客户端 IP/MAC,因此默认使用:
network_mode: host如果使用普通 Docker bridge 网络,容器通常只能检测到 Docker 虚拟接口及其内部地址,可能导致校园网认证失败。
如果 OpenWrt 的 VLAN、Bridge、多 WAN、策略路由等配置导致自动检测结果不符合实际认证要求,可以在 login.conf 中使用 CLIENT_IP 和/或 CLIENT_MAC 强制覆盖。
日志同时写到标准输出和每日文件。
示例:
2026-08-25 19:35:02 [INFO] BISTU login service started.
2026-08-25 19:35:02 [INFO] Internet connection is available.
因此既可以使用:
docker logs -f bistu-login也可以查看:
tail -f data/log/$(date +%Y-%m-%d).log默认情况下不会每个检测周期都写一条“网络正常”,从而减少 OpenWrt、eMMC、SD 卡等设备上的无意义闪存写入。
在 login.conf 中设置:
DEBUG=true开启后会额外记录:
- 每轮联网检测结果;
- 检测到的出口接口;
- 最终使用的客户端 IP/MAC;
- IP/MAC 是否来自手动覆盖;
- 认证服务器及用户名;
wget请求退出状态;- 认证服务器返回数据大小。
密码不会写入日志。
最后一次认证请求的原始返回内容及 wget stderr会保存到:
/data/last_response.txt
/data/last_wget_stderr.txt
关闭 Debug 并重新启动容器后,上述文件会自动删除。
容器默认采用以下限制:
read_only: true
cap_drop:
- ALL
cap_add:
- NET_RAW
security_opt:
- no-new-privileges:trueNET_RAW 仅用于执行 ping。脚本不需要 NET_ADMIN,也不会修改 OpenWrt 路由、防火墙或网络接口配置。
/tmp 使用 1 MiB tmpfs,认证过程中的临时返回文件不会持久写入容器根文件系统。
真实 data/login.conf 包含校园网账号密码,请不要提交、截图或公开该文件。
推荐使用 host 网络运行,并在第一次部署时临时开启:
DEBUG=true重点确认日志中的自动检测 IP/MAC 与 OpenWrt 宿主机执行以下命令的结果一致:
ip route get 10.144.49.2确认认证流程正常后,可将 DEBUG 改回 false,减少日志量和持久存储写入。
本项目针对当前使用的 BISTU 校园网 Portal 请求方式实现。如果学校认证服务器地址、接口参数或认证协议发生变化,可能需要同步修改脚本。
请仅在本人有权使用的校园网账号和网络环境中使用本项目。项目不会绕过账号认证、访问控制或校园网计费策略。
本项目由 AI 编码。 项目代码、Docker 配置、GitHub Actions 工作流及 README 文档主要由 OpenAI ChatGPT 根据项目需求生成和整理,并由项目维护者负责实际测试、审核、部署与后续维护。