Skip to content

srcenchen/NetSwitch

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

NetSwitch

无锡学院校园网自动认证与网络切换守护进程,运行于 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 自动接管(跃点数)

核心逻辑

tryConnect() 连接检测

1. IsWGUp()?  ─── 是 → "WG 已启用",直接返回成功
2. IsWanUp()?  ─── 否 → "WAN 已下线",返回成功(无需操作)
3. IsConnected()? ── 是 → "连接正常",返回成功
4. 未连接 → 根据时间判断:
   ├─ 已过切换阈值 → EnableLabNet(true) + 注销校园
   └─ 未到切换时间 → EnableLabNet(false) + 校园网认证
5. 等待验证(最多 2 秒,每 500ms 检查一次 WG 或连通性)

IfAlive() 后台监控(独立 goroutine,每秒循环)

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() 重试机制

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 中的校园网账号密码需要根据实际部署修改。

About

无锡学院OpenWRT断网自动切换网络

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages