本文分为两部分,第一部分适用于 Padavan 路由器,第二部分适用于 OpenWRT 路由器。
因为手机更换成 Android 设备,某家深圳公司的防火墙又开始作妖了。当手机接入 Wi-Fi 后,不出十分钟,校园网账号会因为被防火墙检测到「多设备连接」而被封禁。So?开干吧。
同学意外地发现,通过更改某项网络设置,便可「变相」解除 AC 对多设备连接的封禁。通过路由器的网页后台更改,有点慢,索性写个脚本,自动执行。
Padavan 路由器
检测能否连接互联网
在 Padavan 固件的自定义设置 - 网络检测
中,更改相关设置:
- 网络检测器检测模式:
持续监测
- 远程服务器与端口:
220.181.38.251:80、119.29.29.29:53
- 连接成功/失败后的检测间隔:
60 秒 / 10 秒
- TCP 连接超时时间:
5 秒
- 报告【网络断开】时间延迟:
5 秒
- 【网络断开】事件执行动作:
无动作
- 在网络访问状态改变时运行脚本:
#!/bin/sh
bash /etc/storage/check_ip.sh
但在执行中,即使是网络连通时,也会运行脚本,此路不通。
更换路由器 IP
感谢 Padavan 适配作者 @hiboy 的帮助。
透过 SSH 执行命令
# 获取当前 WAN 接口的 IP 地址
nvram get wan_ipaddr
# 更改 WAN 接口的 IP 地址
nvram set wan_ipaddr=X.X.X.X
# 重启 WAN 接口
restart_wan
透过 Http 请求
这种办法相对比较麻烦,需要有一定的 Http 与 JavaScript 基础。
如果在网页后台中,通过 Console 查看网络请求,会发现 POST 请求是作用于 start_apply.html
。在 Postman 重写后请求发现,IP 只在页面中得到更改,实际并未作用到 WAN 接口上,此路不通。
后来 @hiboy 提示,可以参考 Advanced_Console_Consent.asp
中的 startPost()
部分代码。
function startPost(){
if (!login_safe())
return false;
$j('#btn_exec').attr('disabled', 'disabled');
$j.post('/apply.cgi',
{
'action_mode': ' SystemCmd ',
'current_page': 'console_response.asp',
'next_page': 'console_response.asp',
'SystemCmd': $j('#SystemCmd').val()
},
function(response){
getResponse();
});
}
可惜我看不懂 🌚(x
登录校园网
因为学校里运行的 Drcom 是基于网页认证的,所以很好办,参考 2020 年写的《利用快捷指令自动登录校园 Wi-Fi》,这里通过 cURL 执行 Post 请求。
更换脚本 for Padavan
即学即用,依靠网络上的 Bash 基础教程,写出了下面的脚本。
#!/bin/sh
ip_1="第一个 IP 地址"
ip_2="第二个 IP 地址"
current_wan_ipaddr=$(nvram get wan_ipaddr)
surf_internet_firefox=$(curl http://detectportal.firefox.com/success.txt)
judge_success_firefox="success"
# 判断是否在线
if [ "$surf_internet_firefox" = "$judge_success_firefox" ]; then
logger -t "【当前状态】" "在线"
else
logger -t "【当前状态】" "已掉线"
# 获取当前 WAN IP
if [ "$current_wan_ipaddr" = "$ip_1" ]; then
nvram set wan_ipaddr=$ip_2
restart_wan
logger -t "【更改 IP】" "$ip_2"
else
nvram set wan_ipaddr=$ip_1
restart_wan
logger -t "【更改 IP】" "$ip_1"
fi
sleep 5
# 登录校园网(适用于 Drcom)
curl -d 'DDDDD=校园网用户名&upass=加密后的校园网密码&R1=0&R2=1¶=00&0MKKey=123456&R6=1' http://dr.com/a30.html
sleep 5
# 判断是否登录成功
surf_internet_microsoft=$(curl http://www.msftconnecttest.com/connecttest.txt)
judge_success_microsoft="Microsoft Connect Test"
if [ "$surf_internet_microsoft" = "$judge_success_microsoft" ]; then
logger -t "【登录校园网】" "成功"
else
logger -t "【登录校园网】" "失败"
fi
fi
在脚本中,需要根据实际情况,填写 IP 地址,以及登录校园网的 URL。
登录路由器的 SSH,将脚本放入 /etc/storage
文件夹中,并赋予执行权限。
# 新建脚本,粘贴脚本内容后,保存退出
vi check_ip.sh
# 赋予脚本执行权限
chmod a+x check_ip.sh
# 将脚本永久写入闪存中
mtd_storage.sh save
OpenWRT 路由器
OpenWRT 固件的路由器同理,不过在变更 IP、重启 WAN 的命令有一点差异。
更改路由器 WAN 接口 IP
OpenWRT 的接口 IP 默认写入配置文件 /etc/config/network
,这里使用 sed
命令进行匹配。
sed -i "s/第一个 IP 地址/第二个 IP 地址/g" /etc/config/network
重启 WAN 接口
更改完成后,使用 `/sbin/ifup wan` 命令重启 WAN 接口。
更换脚本 for OpenWRT
#!/bin/sh
ip_1="第一个 IP 地址"
ip_2="第二个 IP 地址"
current_wan_ipaddr=$(ifconfig WAN接口名称 | grep 'inet addr:' | awk '{print $2}' | tr -d "addr:")
surf_internet_firefox=$(curl http://detectportal.firefox.com/success.txt)
judge_success_firefox="success"
# 判断是否在线
if [ "$surf_internet_firefox" = "$judge_success_firefox" ]; then
echo "【联网状态】 在线"
else
echo "【联网状态】 掉线"
# 获取当前 IP
if [ "$current_wan_ipaddr" = "$ip_1" ]; then
sed -i "s/$ip_1/$ip_2/g" /etc/config/network
/sbin/ifup wan
echo "【更换 IP】 $ip_2"
else
sed -i "s/$ip_2/$ip_1/g" /etc/config/network
/sbin/ifup wan
echo "【更换 IP】 $ip_1"
fi
sleep 5
# 登录校园网(适用于 Drcom)
curl -d 'DDDDD=校园网用户名&upass=校园网加密后的密码&R1=0&R2=1¶=00&0MKKey=123456&R6=1' http://dr.com/a30.html
sleep 5
# 判断是否登录成功
surf_internet_microsoft=$(curl http://www.msftconnecttest.com/connecttest.txt)
judge_success_microsoft="Microsoft Connect Test"
if [ "$surf_internet_microsoft" = "$judge_success_microsoft" ]; then
echo "【登录校园网】 登录成功"
else
echo "【登录校园网】 登录失败"
fi
fi
在脚本中,需要根据实际情况,填写 IP 地址、WAN 接口名称,以及登录校园网的 URL。将脚本保存后,赋予执行权限即可。
尾言
脚本中,通过检测 Firefox 与 Microsoft 连通状态,来判断是否连接互联网,作为下一步执行的条件,当脚本检测到网络连接失败时,执行更换 WAN IP,并重新登录校园网。目前脚本缺少自动执行与日志输出功能,如果有网友有更好的处理方式,欢迎在评论区中留言。
好了,完事。
虽然这个操作并不能降低多设备检测的频次,只能缩短被限制后的断网时间,让网络能尽快恢复,也不知道在 AC 的后续升级中,会不会对此加以限制。
但,也只能这样了。