路由器自动更改 WAN IP 脚本

路由器自动更改 WAN IP 脚本
本文分为两部分,第一部分适用于 Padavan 路由器,第二部分适用于 OpenWRT 路由器。

因为手机更换成 Android 设备,某家深圳公司的防火墙又开始作妖了。当手机接入 Wi-Fi 后,不出十分钟,校园网账号会因为被防火墙检测到「多设备连接」而被封禁。So?开干吧。

同学意外地发现,通过更改某项网络设置,便可「变相」解除 AC 对多设备连接的封禁。通过路由器的网页后台更改,有点慢,索性写个脚本,自动执行。

Padavan 路由器

检测能否连接互联网

在 Padavan 固件的自定义设置 - 网络检测中,更改相关设置:

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 接口上,此路不通。

Postman 请求
Postman 请求

后来 @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&para=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&para=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 的后续升级中,会不会对此加以限制。

但,也只能这样了。

展示评论