Contents

小米路由器 OpenWrt 跨网段路由转发教程

记录如何在小米路由器 BE6500 上刷入 OpenWrt 系统,实现跨网段路由转发的完整教程。涵盖固件刷写、网络配置、路由表设置,打通有线与无线网络间的通讯。

前言

场景描述

在家庭有线网络中,主路由下级接入了一台小米路由器(以BE6500为例),该路由器开启了 WiFi。需要让上级有线网络中的 PC 与 WiFi 下的笔记本能够互相通讯。

网络拓扑

主路由 (10.10.10.1)
    │  LAN: 10.10.10.x
    │
    ├── PC (有线, 10.10.10.x)
    │
    └── 小米路由器 WAN (10.10.10.101)
         │  LAN: 192.168.1.x
         │
         └── 笔记本 (WiFi, 192.168.1.151)

前提条件

  • 小米路由器已获取 SSH 权限(未获取请参考下方教程)
  • 笔记本已连接到小米路由器的 WiFi

实现目标

  • PC 与笔记本之间需要双向通讯
  • 不希望逐个端口做端口映射

第一步:开启小米路由器 SSH 访问

参考来源:小米路由器 BE6500 解锁SSH教程

1.1 下载所需工具与固件

  • 小米路由器 BE6500 固件 1.0.29 版本
  • SSH 工具:Windows 使用 PuTTY,MacOS 使用 Termius

注意: 固件版本必须是 1.0.29。如果不是,请使用小米路由器修复工具进行固件降级,降级教程参考上述视频。

1.2 获取 STOK 码

浏览器登录小米路由器后台管理页面(默认 http://192.168.31.1),登录后查看浏览器地址栏,找到 URL 中的 stok= 部分,复制其后面的字符串,这就是 STOK 码。

注意: 每次登录路由器后台 STOK 码都会改变;默认 IP 地址为 192.168.31.1,如果 IP 不正确,命令会返回 {"code":401,"msg":"invalid token"}

1.3 执行开启 SSH 命令

打开终端(Windows 使用命令提示符,MacOS 使用终端),依次执行以下四条命令

<IP> 替换为路由器 IP 地址(默认 192.168.31.1),将 <STOK> 替换为获取到的 STOK 码:

curl -X POST http://<IP>/cgi-bin/luci/;stok=<STOK>/api/xqsystem/start_binding -d "uid=1234&key=1234'%0Anvram%20set%20ssh_en%3D1'"

curl -X POST http://<IP>/cgi-bin/luci/;stok=<STOK>/api/xqsystem/start_binding -d "uid=1234&key=1234'%0Anvram%20commit'"

curl -X POST http://<IP>/cgi-bin/luci/;stok=<STOK>/api/xqsystem/start_binding -d "uid=1234&key=1234'%0Ased%20-i%20's%2Fchannel%3D.*%2Fchannel%3D%22debug%22%2Fg'%20%2Fetc%2Finit.d%2Fdropbear'"

curl -X POST http://<IP>/cgi-bin/luci/;stok=<STOK>/api/xqsystem/start_binding -d "uid=1234&key=1234'%0A%2Fetc%2Finit.d%2Fdropbear%20start'"

1.4 通过 SSH 登录路由器

使用 PuTTY(Windows)或 Termius(MacOS)连接路由器:

  • 主机:路由器 IP(默认 192.168.31.1
  • 端口:22
  • 用户名:root
  • 密码:通过 密码计算网站 根据路由器 SN 计算获得

1.5 修改 SSH 登录密码

登录成功后,执行以下指令将密码修改为 admin

echo -e 'admin\nadmin' | passwd root

修改后的用户名为 root,密码为 admin

1.6 固化 SSH(防止重启后失效)

通过 SSH 工具登录路由器后分别执行以下指令,每次执行指令后路由器会重启,需重新 SSH 连接:

nvram set ssh_en=1
nvram set telnet_en=1
nvram set uart_en=1
nvram set boot_wait=on
nvram commit

1.7 添加开机自动开启 SSH 脚本

SSH 重新连接后,执行以下代码添加自动开启 SSH 端口指令:

mkdir /data/auto_ssh && cd /data/auto_ssh

curl -O https://fastly.jsdelivr.net/gh/lemoeo/AX6S@main/auto_ssh.sh

chmod +x auto_ssh.sh

uci set firewall.auto_ssh=include
uci set firewall.auto_ssh.type='script'
uci set firewall.auto_ssh.path='/data/auto_ssh/auto_ssh.sh'
uci set firewall.auto_ssh.enabled='1'
uci commit firewall

至此 SSH 开启并固化完成,后续重启路由器 SSH 也会自动开启。


第二步:查看当前防火墙配置

登录后先了解当前配置:

cat /etc/config/firewall

查询 WAN zone 的索引号

后续操作需要通过索引号定位 wan zone,执行以下命令确认:

uci show firewall | grep "option name"

输出类似:

firewall.cfg02dc81.name='lan'
firewall.cfg030c48.name='wan'
firewall.cfg09a933.name='ready'

确认 WAN zone 对应的索引编号(从 0 开始依次为 0, 1, 2…):

uci show firewall.@zone

从输出中确认 @zone[1] 对应 name='wan'(以实际输出为准)。


第三步:添加 WAN → LAN 转发规则

默认配置中只有 LAN → WAN 的转发,需要反向添加一条:

uci add firewall forwarding
uci set firewall.@forwarding[-1].src='wan'
uci set firewall.@forwarding[-1].dest='lan'

第四步:关闭 WAN 口 NAT 伪装

这是最关键的一步。默认情况下 WAN zone 开启了 masq(NAT 伪装),会导致从 WAN 方向转发进来的包在回程时源地址被改写为路由器 WAN 口地址(10.10.10.101),使得上端设备 TCP 连接因地址不匹配而断开。

uci set firewall.@zone[1].masq='0'

注意: 部分小米固件不支持 @zone[@name='wan'] 语法,如报错 Invalid argument,请使用索引号或直接编辑配置文件。

如果上述命令报错

直接编辑配置文件:

vi /etc/config/firewall

找到:

config zone
        option name 'wan'
        ...
        option masq '1'
        option input 'REJECT'

修改为:

        option masq '0'
        option input 'ACCEPT'

第五步:开放 WAN 口入站

解决 WAN 口 ping 不通的问题(可选,但建议开启以便排查网络故障):

uci set firewall.@zone[1].input='ACCEPT'

第六步:提交并重启防火墙

uci commit firewall
/etc/init.d/firewall restart

第七步:确认 IP 转发已开启

cat /proc/sys/net/ipv4/ip_forward
# 输出应为 1

如果为 0,执行:

sysctl -w net.ipv4.ip_forward=1

第八步:上游主路由添加静态路由

在主路由(10.10.10.1)管理页面添加静态路由:

项目
目标网络192.168.1.0
子网掩码255.255.255.0
下一跳/网关10.10.10.101

如果主路由管理页面不支持添加静态路由,在主路由终端执行:

ip route add 192.168.1.0/24 via 10.10.10.101

第九步:验证配置

在笔记本上开启 TCP Server 辅助测试

import socket
s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('0.0.0.0', 8080))
s.listen(1)
print('监听中,端口 8080...')
while True:
    conn, addr = s.accept()
    print(f'收到来自 {addr} 的连接')
    conn.send(b'Hello!\n')
    conn.close()

在 PC 上测试

# 测试 WAN 口是否可达
ping 10.10.10.101

# 测试笔记本服务端口
Test-NetConnection 192.168.1.151 -Port 8080

Test-NetConnection 返回 TcpTestSucceeded: True 即表示配置成功。


完整流量路径

PC (10.10.10.x)
    │ 目标地址 192.168.1.x
    │ 匹配静态路由 → 下一跳 10.10.10.101
    ▼
OpenWrt WAN (10.10.10.101)
    │ 防火墙允许 WAN → LAN 转发
    │ masq=0,不做 NAT,源 IP 保持 10.10.10.x
    ▼
OpenWrt LAN → 笔记本 (192.168.1.151)
    │ 回程包 src=192.168.1.151, dst=10.10.10.x
    │ 经路由从 WAN 口直接发出
    ▼
PC 收到回包(src=192.168.1.151 ✓)

回滚方法

如需恢复原始配置:

# 恢复 WAN zone 设置
uci set firewall.@zone[1].masq='1'
uci set firewall.@zone[1].input='REJECT'

# 查看所有转发规则
uci show firewall | grep forwarding

# 删除新加的 WAN→LAN 转发规则(根据实际索引号调整)
uci delete firewall.@forwarding[1]

uci commit firewall
/etc/init.d/firewall restart

持久化说明

操作方式是否持久化
uci set + uci commit✅ 写入 /etc/config/firewall,重启不丢失
直接编辑 /etc/config/firewall✅ 重启不丢失

本文章已被查看 0