一.前言

二.必要准备

1.首先我们必须要有一台刷好OpenWrt的设备,因为我们需要再路由器设备上对进出的流量进行修改,路由器原厂固件是不具备这样的功能

我这里使用一台小米AX3000T作为演示

2.我们需要一个校园网账号,因为我们只是解除校园网对我们的限制了而已,我们的流量还是要经过学校的服务器的

3.将路由器wan口连上校园网(或者无线中继把路由器连上学校的WiFi),LAN口连我们的电脑(连路由器的WiFi也是一样的),

做完这几步理论上你的电脑应该会弹出熟悉的登录页面,如果不弹出可以点击上图wan/wwan右边的重启按钮

软件准备:1.SSH工具,推荐iShellPro这个软件,因为好看、多平台兼容且集成直观的文件管理功能

三.账号自动登录

1.抓校园网登录包

自动登录的原理简单来说就是抓到校园网登录时候的包,然后用脚本检测是否网络是否畅通,如果不畅通那么就执行我们抓下来的登录包,这样就可以实现自动登录了

跟着上面这两张图就进行操作可以复制到一串类似这样的登陆命令

curl 'http://172.26.3.60:801/eportal/portal/login?callback=dr1003&login_method=1&user_account=%2C0%2C智慧校园账号%40cmccyt&user_password=智慧校园密码&wlan_user_ip=172.31.170.134&wlan_user_ipv6=&wlan_user_mac=000000000000&wlan_ac_ip=&wlan_ac_name=&jsVersion=4.2.1&terminal_type=1&lang=zh-cn&v=9391&lang=zh' \
  -H 'Accept: */*' \
  -H 'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6' \
  -H 'Connection: keep-alive' \
  -H 'DNT: 1' \
  -H 'Referer: http://172.26.3.60/' \
  -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0' \
  --insecure

2.替换自动登录脚本的参数

最下面给出已经写好的脚本,我们需要修改这个脚本的两个地方

1.把我们上面抓到的登录包黏贴到脚本LOGIN_RAW_CMD后面的双引号里面

2.获取网络接口名称并填入到WAN_INTERFACE后面的双引号里面

获取网络接口名称方法如下:

1.打开我们下载好的iShellPro软件,SSH连接上路由器

2.执行下面命令,将返回的网络接口名称填入WAN_INTERFACE后面的双引号内

ip route show default


到这里我们已经获得了专属于我们自己的登录脚本,接下来就是将这个登录脚本上传到路由器系统测试功能,及设置开机自启

#!/bin/sh

# 基础配置
PING_TARGET="www.baidu.com"          # 网络检测目标(可替换为稳定IP如8.8.8.8)
LOG_FILE="/var/log/auto_net.log"      # 日志文件路径
WAN_INTERFACE="phy1-sta0"             # 你的WAN口接口名称(已确认正确)

# 直接在两个双引号之间粘贴贴从浏览器复制的登录命令
LOGIN_RAW_CMD=""

# 确保日志文件存在
[ -f "$LOG_FILE" ] || touch "$LOG_FILE"

# 函数:获取WAN口当前IPv4地址(兼容BusyBox,不依赖grep -P)
get_wan_ip() {
    # 提取格式:inet 172.26.252.78/24 → 取172.26.252.78
    local wan_ip=$(ip -4 addr show dev "$WAN_INTERFACE" | grep 'inet ' | awk '{print $2}' | cut -d '/' -f 1 | head -n 1)
    if [ -z "$wan_ip" ]; then
        echo "$(date "+%Y-%m-%d %H:%M:%S") - 警告:无法获取WAN口IP(接口:$WAN_INTERFACE),请检查接口是否在线" >> "$LOG_FILE"
        return 1
    fi
    echo "$wan_ip"
    return 0
}

# 函数:从登录命令自动生成登出命令(无需手动输入)
generate_logout_cmd() {
    local login_cmd="$1"
    # 替换关键参数生成登出命令(匹配用户提供的登出格式)
    local logout_cmd=$(echo "$login_cmd" | \
        sed 's/portal\/login/portal\/logout/g' | \
        sed 's/callback=dr1003/callback=dr1004/g' | \
        sed 's/user_account=[^&]*/user_account=drcom/g' | \
        sed 's/user_password=[^&]*/user_password=123/g' | \
        sed 's/terminal_type=[^&]*//g'  # 移除登出命令中多余的参数
    )
    echo "$logout_cmd"
}

# 初始化:生成登出命令模板
LOGOUT_RAW_CMD=$(generate_logout_cmd "$LOGIN_RAW_CMD")
echo "$(date "+%Y-%m-%d %H:%M:%S") - 脚本启动,自动生成登出命令模板" >> "$LOG_FILE"
echo "$(date "+%Y-%m-%d %H:%M:%S") - 监控开始(目标:$PING_TARGET,WAN口:$WAN_INTERFACE)" >> "$LOG_FILE"

while true; do
    # 1. 获取当前WAN口IP
    WAN_IP=$(get_wan_ip)
    if [ -z "$WAN_IP" ]; then
        sleep 1
        continue  # 获取IP失败,跳过本次循环
    fi

    # 2. 检测网络连通性
    ping -c 1 -W 1 "$PING_TARGET" > /dev/null 2>&1
    PING_RESULT=$?

    if [ "$PING_RESULT" -ne 0 ]; then
        echo "$(date "+%Y-%m-%d %H:%M:%S") - 网络不通(当前WAN IP:$WAN_IP),尝试登录..." >> "$LOG_FILE"
        
        # 3. 动态替换登录命令中的wlan_user_ip为当前WAN IP,并添加静默参数
        LOGIN_CMD=$(echo "$LOGIN_RAW_CMD" | sed "s/wlan_user_ip=[^&]*/wlan_user_ip=$WAN_IP/g" | sed 's/curl /curl -sS /')
        
        # 执行登录并捕获输出
        LOGIN_OUTPUT=$(eval "$LOGIN_CMD" 2>&1)
        CURL_EXIT=$?
        echo "$LOGIN_OUTPUT" >> "$LOG_FILE"  # 记录登录返回结果

        # 4. 判断是否已在线(需要登出)
        echo "$LOGIN_OUTPUT" | grep -q '"result":0.*"已经在线!".*"ret_code":2'
        IS_ONLINE=$?

        if [ "$IS_ONLINE" -eq 0 ]; then
            echo "$(date "+%Y-%m-%d %H:%M:%S") - IP已在线,执行登出..." >> "$LOG_FILE"
            
            # 5. 动态替换登出命令中的wlan_user_ip为当前WAN IP,并添加静默参数
            LOGOUT_CMD=$(echo "$LOGOUT_RAW_CMD" | sed "s/wlan_user_ip=[^&]*/wlan_user_ip=$WAN_IP/g" | sed 's/curl /curl -sS /')
            
            # 执行登出并捕获输出
            LOGOUT_OUTPUT=$(eval "$LOGOUT_CMD" 2>&1)
            LOGOUT_EXIT=$?
            echo "$LOGOUT_OUTPUT" >> "$LOG_FILE"  # 记录登出返回结果

            # 记录登出状态
            if [ "$LOGOUT_EXIT" -eq 0 ]; then
                echo "$(date "+%Y-%m-%d %H:%M:%S") - 登出完成(退出码:0)" >> "$LOG_FILE"
            else
                echo "$(date "+%Y-%m-%d %H:%M:%S") - 登出异常(退出码:$LOGOUT_EXIT)" >> "$LOG_FILE"
            fi
        else
            # 记录登录状态
            if [ "$CURL_EXIT" -eq 0 ]; then
                echo "$(date "+%Y-%m-%d %H:%M:%S") - 登录完成(退出码:0)" >> "$LOG_FILE"
            else
                echo "$(date "+%Y-%m-%d %H:%M:%S") - 登录异常(退出码:$CURL_EXIT)" >> "$LOG_FILE"
            fi
        fi
    else
        :  # 网络正常,不记录日志
    fi

    sleep 1
done

3.将修改好的脚本上传并测试

创建好一个名叫auto_net的sh脚本,将修改好的登录脚本黏贴到这个文件中保存

进行下面的操作把sh脚本上传

对下面的命令依次执行

# 赋予权限
chmod +x /root/auto_net.sh

# 后台运行脚本,并将输出重定向到日志(与脚本内的日志记录不冲突)
/root/auto_net.sh > /dev/null 2>&1 &

#查看日志
tail -f /var/log/auto_net.log

此时你如果手动登出校园网,应该可以看到脚本自动帮你又连接上校园网了!

到这里我们只要让这个脚本可以开机自启动就可以了,因为后面的校园网解除多设备限制也会修改开机自启的参数,所以把设置开机自启这部分挪到了后面。

这里附上停止自动登录后台执行的命令

# 终止旧进程
ps | grep auto_net.sh | grep -v grep | awk '{print $1}' | xargs kill -9

四.校园网解除多设备限制

目前突破校园网限制的工具基本就两种UA2F和UA3F,他们都是通过修改用户的UA-Agent让系统误以为我们只要一台设备。

这两种工具都会有点小问题,UA2F无法代理腾讯系流量,无法稳定解除且与科学上网一起用还会有莫名其妙的问题。UA3F代理彻底但配置复杂(需要搭配clash),哪怕在clash纯代理国内流量的时候也会出现有些网页打不开的情况。这段时间看到了一个挺有意思的项目,叫UA3F-tproxy,它就是UA3F的简化版,可以不和clash捆绑,大幅简化了操作流程,同时也减小了操作的出错率。

1.安装并且启用UA3F-tproxy

只需要在项目的Release页下载适用于你系统的ipk包 在路由器后台的软件包页面安装即可。

我这里下载的是ua3f-tproxy_0.2.1-1_aarch64_cortex-a53.ipk,如果你不知道应该下载什么版本,你可以SSH输入uname -m来查看你的系统架构

安装好后刷新路由器后台登录页,把启用勾选保存并应用即可,就是这么简单!

我们可以通过这个网页:UA检测-HTTP查看我们是否修改UA成功

2.其他防检测措施及设置开机自启

接下来我们设置一些其他措施来防止校园网检测到多设备。

1.安装好相关软件包及开启NTP时钟

还是一样在路由器后台的软件包页面(系统->软件包)安装下面的软件包

在路由器后台的软件包页面安装这三个软件包

iptables-mod-ipopt

kmod-ipt-ipopt

rkp-ipid

在系统->系统->时间同步中配置NTP时钟

2.然后把下面的开机自启脚本修改后黏贴到系统->启动项->本地启动脚本的“exit 0”之前即可

注意修改1.# 防时钟偏移检测最后一行的IP为你的网关IP地址(路由器后台管理地址)

2.iptables -t mangle -A IPID_MOD -d 10.0.0.0/8 -j RETURN一行,若你校局域网是A类网络,则注释下面这一行

# 启动自动登录脚本并后台运行
/root/auto_net.sh > /dev/null 2>&1 &

iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 53
iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 53

# 通过 rkp-ipid 设置 IPID
iptables -t mangle -N IPID_MOD
iptables -t mangle -A FORWARD -j IPID_MOD
iptables -t mangle -A OUTPUT -j IPID_MOD
iptables -t mangle -A IPID_MOD -d 0.0.0.0/8 -j RETURN
iptables -t mangle -A IPID_MOD -d 127.0.0.0/8 -j RETURN
# 若你校局域网是A类网络,则注释下面这一行
iptables -t mangle -A IPID_MOD -d 10.0.0.0/8 -j RETURN
iptables -t mangle -A IPID_MOD -d 172.16.0.0/12 -j RETURN
iptables -t mangle -A IPID_MOD -d 192.168.0.0/16 -j RETURN
iptables -t mangle -A IPID_MOD -d 255.0.0.0/8 -j RETURN
iptables -t mangle -A IPID_MOD -j MARK --set-xmark 0x10/0x10

# 防时钟偏移检测
iptables -t nat -N ntp_force_local
iptables -t nat -I PREROUTING -p udp --dport 123 -j ntp_force_local
iptables -t nat -A ntp_force_local -d 0.0.0.0/8 -j RETURN
iptables -t nat -A ntp_force_local -d 127.0.0.0/8 -j RETURN
iptables -t nat -A ntp_force_local -d 192.168.0.0/16 -j RETURN
iptables -t nat -A ntp_force_local -s 192.168.0.0/16 -j DNAT --to-destination 192.168.5.1

# 通过 iptables 修改 TTL 值
iptables -t mangle -A POSTROUTING -j TTL --ttl-set 64

# iptables 拒绝 AC 进行 Flash 检测
iptables -I FORWARD -p tcp --sport 80 --tcp-flags ACK ACK -m string --algo bm --string " src=\"http://1.1.1." -j DROP