校园网自动认证

首先谈谈我的网络环境

目前我们学校使用的是百兆网线接法,因此无需使用配置过高的路由器,百兆即可满足需求。

设备配置

  • 主路由:斐讯K2路由器(使用高格固件)
  • 旁路由:玩客云(运行OpenWrt系统)

网络接入方式

  • 斐讯K2路由器通过 WAN 和 WAN2 连接校园网,并通过 DHCP 自动获取 IP 地址。
  • 玩客云负责一些额外的性能处理、广告屏蔽、富强等功能。

设备图片

K2

  • 斐讯K2路由器

玩客云

  • 玩客云

主要功能

  • 主路由:提供网络连接并进行基本的路由功能。
  • 旁路由:增强性能,屏蔽广告,优化网络环境等。

校园网自动认证的实现

在本文中,我将介绍如何使用旁路由实现校园网的自动认证。这个过程包括模拟登录请求,获取认证所需的 cookies,并用它们来验证和授权访问校园网络。

一、认证流程概述

校园网的认证通常涉及多个步骤,其中包括发送请求到认证服务器并获取必要的授权信息。我们需要:

1. 发送第一次登录请求:

通过 curl 请求到校园网的认证地址,登录并获取认证 cookies

2. 提取认证 token:

从返回的 cookies 中提取认证所需的 sysauth 信息,这是后续请求所必需的。

3. 获取网络接口信息:

从路由器的管理界面获取 WAN 和 WAN2 的 IP 地址,作为认证过程中需要传递的信息。

4. 执行自动登录:

使用提取的 IP 地址,通过调用 API 接口进行自动登录。

二、代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# 获取当前时间戳
timestamp=$(date +%s)

# 执行第一次登录请求以获取 cookies 和 sysauth
curl '校园网认证地址' \
-H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7' \
-H 'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6' \
-H 'Cache-Control: max-age=0' \
-H 'Connection: keep-alive' \
-H 'Content-Type: application/x-www-form-urlencoded' \
-H 'Origin: 校园网认证地址' \
-H 'Referer: 校园网认证地址' \
-H 'Upgrade-Insecure-Requests: 1' \
-H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0' \
--data-raw 'username=用户名&password=密码&timestamp=时间戳&csrftoken=CSRF_TOKEN' \
--cookie-jar cookies.txt --insecure

# 输出 cookies 内容,查看是否包含 sysauth
cat cookies.txt

# 提取 sysauth 值
sysauth=$(grep -oP 'sysauth\s+\K[^\s]+' cookies.txt)

# 检查是否成功提取 sysauth
if [ -z "$sysauth" ]; then
echo "Error: sysauth not found in cookies.txt"
exit 1
else
echo "Retrieved sysauth: $sysauth"
fi

# 执行 curl 请求并保存结果,获取 WAN 和 WAN2 的 IP 地址
response=$(curl -s '网络接口状态获取地址?='$timestamp \
-b "sysauth=$sysauth" \
-H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0')

# 提取 WAN 和 WAN2 的 IP 地址
wan_ip=$(echo "$response" | jq -r '.[] | select(.id == "wan") | .ipaddrs[0].addr')
wan2_ip=$(echo "$response" | jq -r '.[] | select(.id == "wan2") | .ipaddrs[0].addr')

# 输出结果
echo "WAN IP: $wan_ip"
echo "WAN2 IP: $wan2_ip"

# 第一步请求成功,继续执行第二步:使用 WAN IP 执行登录请求
login_wan_response=$(curl '认证API地址' \
-H 'Accept: application/json, text/plain, */*' \
-H 'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6' \
-H 'Access-Control-Allow-Origin: *' \
-H 'Connection: keep-alive' \
-H 'Content-Type: application/json;charset=UTF-8' \
-H 'Origin: 认证网站' \
-H 'Referer: 认证网站' \
-H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0' \
--data-raw '{"username":"用户名","password":"密码","ifautologin":"0","channel":"4","pagesign":"secondauth","usripadd":"'$wan_ip'"}' \
--insecure)

# 检查 WAN 登录是否成功
if echo "$login_wan_response" | grep -q '"code": 200'; then
echo "成功使用 WAN IP 登录"
else
echo "WAN IP 登录失败"
exit 1
fi

# 第二步请求成功,继续执行第三步:使用 WAN2 IP 执行登录请求
login_wan2_response=$(curl '认证API地址' \
-H 'Accept: application/json, text/plain, */*' \
-H 'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6' \
-H 'Access-Control-Allow-Origin: *' \
-H 'Connection: keep-alive' \
-H 'Content-Type: application/json;charset=UTF-8' \
-H 'Origin: 认证网站' \
-H 'Referer: 认证网站' \
-H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0' \
--data-raw '{"username":"用户名","password":"密码","ifautologin":"0","channel":"4","pagesign":"secondauth","usripadd":"'$wan2_ip'"}' \
--insecure)

# 检查 WAN2 登录是否成功
if echo "$login_wan2_response" | grep -q '"code": 200'; then
echo "成功使用 WAN2 IP 登录"
else
echo "WAN2 IP 登录失败"
exit 1
fi

三、自动认证的实现流程

步骤 1:登录旁路由管理界面,获取 sysauth

  • 首先,通过 HTTP 请求登录旁路由管理界面,提交用户名和密码以获取认证所需的 cookiessysauth 值。
  • 通过 --cookie-jar 将返回的 Cookies 保存到 cookies.txt 文件中,然后解析文件提取 sysauth

代码片段如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 执行第一次登录请求以获取 cookies 和 sysauth
curl '旁路由登录地址' \
-H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7' \
-H 'Content-Type: application/x-www-form-urlencoded' \
--data-raw 'username=路由用户名&password=路由密码' \
--cookie-jar cookies.txt --insecure

# 提取 sysauth 值
sysauth=$(grep -oP 'sysauth\s+\K[^\s]+' cookies.txt)

# 检查是否成功提取 sysauth
if [ -z "$sysauth" ]; then
echo "Error: sysauth not found in cookies.txt"
exit 1
fi

说明:

步骤 2:获取 WAN 和 WAN2 的 IP 地址

  • 使用提取的 sysauth 值访问旁路由接口状态,解析返回数据中的 WAN 和 WAN2 的 IP 地址。
  • 使用工具 jq 处理返回的 JSON 数据,提取所需字段。

代码片段如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 执行接口状态请求,获取 WAN 和 WAN2 的 IP 地址
response=$(curl -s '网络接口状态地址?='$timestamp \
-b "sysauth=$sysauth" \
-H 'User-Agent: Mozilla/5.0')

# 提取 WAN 和 WAN2 的 IP 地址
wan_ip=$(echo "$response" | jq -r '.[] | select(.id == "wan") | .ipaddrs[0].addr')
wan2_ip=$(echo "$response" | jq -r '.[] | select(.id == "wan2") | .ipaddrs[0].addr')

# 输出结果
echo "WAN IP: $wan_ip"
echo "WAN2 IP: $wan2_ip"

说明:

  • 替换 路由用户名路由密码 为实际的管理员登录信息。
  • WAN 和 WAN2 是路由器中两个不同的网络接口,返回的 IP 地址用于下一步的认证请求。

步骤 3:使用获取的 IP 地址进行校园网认证

  • 将获取的 WAN 和 WAN2 IP 地址分别用于校园网的认证请求。
  • 模拟 POST 请求,提交认证所需的用户名、密码和其他参数。

代码片段如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 第一步:使用 WAN IP 执行登录请求
login_wan_response=$(curl '认证API地址' \
-H 'Content-Type: application/json;charset=UTF-8' \
--data-raw '{"username":"校园网用户名","password":"校园网密码","channel":"4","usripadd":"'$wan_ip'"}' \
--insecure)

# 检查 WAN 登录是否成功
if echo "$login_wan_response" | grep -q '"code": 200'; then
echo "成功使用 WAN IP 登录"
else
echo "WAN IP 登录失败"
exit 1
fi

# 第二步:使用 WAN2 IP 执行登录请求
login_wan2_response=$(curl '认证API地址' \
-H 'Content-Type: application/json;charset=UTF-8' \
--data-raw '{"username":"校园网用户名","password":"校园网密码","channel":"4","usripadd":"'$wan2_ip'"}' \
--insecure)

# 检查 WAN2 登录是否成功
if echo "$login_wan2_response" | grep -q '"code": 200'; then
echo "成功使用 WAN2 IP 登录"
else
echo "WAN2 IP 登录失败"
exit 1
fi

说明:

  • 替换 认证API地址 为校园网认证的实际接口地址。
  • 替换 校园网用户名校园网密码 为实际的认证信息。

四、完整脚本

最终完整脚本已经在 “代码实现” 部分提供,可以直接复制使用(记得替换为实际信息)。

希望这篇博客清晰地解释了校园网自动认证的过程,如果还有疑问,随时与我联系!