无锡学院校园网自动认证与网络切换守护进程,运行于 OpenWrt 路由器。
无锡学院校园网在夜间定时断网:
- 周1-4、周日:23:00 断运营商网络,约 23:45 交换机断电
- 周5-6:23:30 断运营商网络
- 次日约 6:20 恢复上电
NetSwitch 自动处理网络认证、实验室网络切换和故障恢复,确保路由器全天保持最佳可用连接。
┌─ WAN (校园运营商: 中国移动)
│ 认证: 10.1.99.100:801 门户
│ 监测: ARP ping 网关
│ ARP 失败 → 按跃点数自动切 4G CPE
│
路由器 (OpenWrt) ───┼─ WG 隧道 (实验室网络,过渡用)
│ /usr/bin/proxy on 建立
│ 激活后约 48 分钟断开
│
└─ 4G CPE (兜底)
192.168.0.1:8080
跃点数最低优先级,其余路径全断时自动接管
长时间无数据会断线 → 每秒 TCP 保活
三条网络路径,优先级从高到低:
| 路径 | 用途 | 说明 |
|---|---|---|
| WAN (校园网) | 白天主力 | 需门户认证,ARP 监测网关存活 |
| WG 隧道 (实验室) | 夜间过渡 | 约 48 分钟后自动断开,用于衔接断网时段 |
| 4G CPE | 兜底 | 按跃点数自动接管,需持续保活防断 |
以周1-4为例(周5-6 的阈值从 23:00 替换为 23:30,预切换从 22:59 替换为 23:29):
0:00 1:00 6:20 6:59 7:00 22:59 23:00 ~23:48 0:00
│ │ │ │ │ │ │ │ │
▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼
校园网 不检测 抢恢复 校园网 每5分钟保活 预切换 切换窗口 WG断 校园网
每5分钟认证 (4G CPE保活) 每分钟检测 稳定 认证 proxy on 每秒确认 4G CPE 每5分钟
接管 认证
│◄── 校园网 ──►│◄── 4G CPE ──►│◄── 恢复 ──►│◄── 校园网 ──►│◄─ WG ─►│◄ 4G CPE ►│◄── 校园网 ──►│
| 时段 | 活跃网络 | 守护进程行为 |
|---|---|---|
| 0:00 ~ 0:59 | 校园网 | 每 5 分钟 tryConnect() |
| 1:00 ~ 6:19 | 4G CPE | 主循环不执行,IfAlive() 独立保活 |
| 6:20 ~ 6:59 | 校园网恢复 | 每分钟检测,抢恢复校园网认证 |
| 7:00 ~ 22:58 | 校园网 | 每 5 分钟保活 + 认证 |
| 22:59 | 切换中 | proxy on 建立 WG,注销校园认证 |
| 23:00 | 切换窗口 | 该分钟内每秒确认 WG 状态 |
| 23:01 ~ ~23:48 | WG 隧道 | IsWGUp() 直接判定已连接 |
| ~23:48 ~ 1:00 | 4G CPE | WG 断开,4G CPE 自动接管(跃点数) |
1. IsWGUp()? ─── 是 → "WG 已启用",直接返回成功
2. IsWanUp()? ─── 否 → "WAN 已下线",返回成功(无需操作)
3. IsConnected()? ── 是 → "连接正常",返回成功
4. 未连接 → 根据时间判断:
├─ 已过切换阈值 → EnableLabNet(true) + 注销校园
└─ 未到切换时间 → EnableLabNet(false) + 校园网认证
5. 等待验证(最多 2 秒,每 500ms 检查一次 WG 或连通性)
1. IsWGUp()? ─── 是 → 跳过 ARP 探测,仅保活 4G CPE
2. ARP ping WAN 网关:
├─ 成功 → failCount 清零
└─ 连续 2 次失败 → EnableLabNet(false) + ifup wan
3. 保活 4G CPE(TCP 拨号 192.168.0.1:8080)
WG 启用期间,4G CPE 没有业务流量,全靠 IfAlive() 每秒一次 TCP 拨号保活。确保 WG 约 48 分钟后断开时,4G CPE 仍然在线,可以无缝回落。
work() 调用 tryConnect(),最多重试 30 次。每次失败打印当前重试次数,全部失败后等待下次调度触发。
main.go # 主守护进程:调度、切换逻辑
utils/
├── connection.go # 连接检测、WG 状态、接口监控、4G CPE 保活
└── school-net.go # 校园网门户认证(登录/注销)
# 本地编译
go build -o netSwitch main.go
# 交叉编译 MIPS (OpenWrt)
GOOS=linux GOARCH=mipsle GOMIPS=softfloat go build -o netSwitch main.go部署到 OpenWrt 设备后,需确保以下命令可用:
ifstatus/ifup— OpenWrt netifd 接口管理arping— ARP 探测ip— WireGuard 接口状态查询/usr/bin/proxy— 实验室网络切换脚本
main.go 中的校园网账号密码需要根据实际部署修改。