小米路由器 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 下载所需工具与固件
注意: 固件版本必须是 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 commit1.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 8080Test-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 次