本文信息核实于2026-08-06
先给你吃颗定心丸:小米B12路由器在刷入第三方固件(如OpenWrt、Padavan)后,端口转发失灵,90%以上不是硬件坏了,也不是固件有坑,而是“新旧系统参数打架”导致的。 我上周刚帮一个粉丝远程搞定,他刷的是2026年最新的OpenWrt 23.05分支,折腾了三天,最后发现是“防火墙区域配置”和“旧版DMZ残留”双重作祟。下面我把踩过的坑、试过的方法,全给你摊开讲,保证你按步骤走,半小时内能恢复端口映射。
一、核心观点:刷机后端口转发失效,本质是“三层错位”
先说结论,再解释。你刷完固件,原来小米官方系统里的端口转发规则,不会自动迁移到新固件。但更坑的是,很多时候你明明在新固件里重新设置了端口转发,却依然不通。我总结为“三层错位”:
- 配置错位:旧固件的“端口转发”概念,对应新固件的“端口转发”或“防火墙规则”,但默认防火墙区域(zone)不同。比如OpenWrt里,LAN口流量默认信任,但WAN口入站默认拒绝,你只加了转发规则,没放行防火墙,等于白搭。
- IP绑定错位:小米B12默认DHCP分配的IP可能和刷机后不一致。你原来给设备绑定了192.168.31.100,刷机后网段变成了192.168.1.1,规则全指向了空气。
- 内核模块错位:部分第三方固件为了精简,去掉了
iptables的NAT模块(比如nf_nat_pptp、nf_conntrack_ftp),导致特殊协议(如FTP、PPTP)的端口转发直接失效。这属于“隐性坑”,不查日志根本发现不了。
一句话总结:刷机后,你等于换了一台新路由器,必须从零开始配置,而且要按新系统的逻辑来,不能沿用旧习惯。
二、详细解读:5步排查法(按顺序做,别跳步)
第1步:确认你的“端口转发”到底加对地方了没
在OpenWrt里,路径是 网络 → 防火墙 → 端口转发。注意看: - 协议要选对(TCP、UDP或TCP+UDP)。 - 外部端口(WAN口端口)和内部端口(LAN口设备端口)别填反。 - 内部IP地址必须是当前设备实际获取的IP,不是你想当然的IP。
小技巧:在OpenWrt的“状态 → 概览”里看LAN口IP段,用arp -a或手机连上后查看网关IP,确认设备IP。
第2步:检查防火墙区域(Zone)——这是90%的坑
OpenWrt默认规则:LAN区域允许转发到WAN,但WAN区域禁止转发到LAN。你添加端口转发时,系统会自动创建一条“DNAT”规则,但如果你手动改过防火墙区域,或者刷的固件默认没有“lan→wan”的转发规则,就会失败。
检查方法:网络 → 防火墙 → 区域,确保:
- lan区域的“Allow forward to destination zones”包含wan。
- wan区域的“Allow forward to destination zones”留空(不需要)。
- lan区域的“Masquerading”勾选(NAT伪装),否则内网设备无法上网,端口转发更不可能通。
如果没勾选,点击“编辑”补上,保存并应用。
第3步:清掉旧固件的“残留规则”——DMZ和UPnP
很多小米B12用户刷机前开了DMZ或UPnP,刷机后这些规则还残留在NVRAM里(虽然界面看不到)。这会导致你新加的端口转发和残留的DMZ冲突,流量被DMZ劫持。
解决方法:
- SSH进路由器,执行nvram show | grep -i dmz,如果有输出,用nvram unset dmz_ip、nvram unset dmz_enable清掉,然后nvram commit。
- 关闭UPnP:在OpenWrt里,服务 → UPnP,取消勾选“启用”,保存。
第4步:检查固件内核模块是否缺失
如果你转发的是FTP(21端口)或PPTP(1723端口),大概率是模块问题。SSH进路由器,执行:
lsmod | grep nf_nat
看有没有nf_nat_ftp、nf_conntrack_ftp。如果没有,执行:
opkg update && opkg install kmod-nf-natftp kmod-nf-conntrack-ftp
装完重启防火墙(/etc/init.d/firewall restart)。
第5步:用“外部测试”而非“内部测试”
很多人用手机连上WiFi,然后通过公网IP去访问端口,发现不通,就以为失败了。这是错的! 因为内网访问外网IP会经过NAT回流(NAT loopback),很多固件默认不支持。你要用手机4G/5G网络(关闭WiFi)去访问公网IP:端口,或者用在线端口扫描工具。
三、5个FAQ(你大概率会问)
Q1:刷了OpenWrt后,小米B12的WiFi信号变差了,和端口转发有关系吗? 完全无关。WiFi信号取决于驱动和发射功率,端口转发是网络层的事。如果信号差,检查无线信道和带宽,别混在一起。
Q2:我刷的是Padavan(老毛子),界面和OpenWrt不一样,怎么排查? Padavan的端口转发在“高级设置 → 防火墙 → NAT端口映射”。核心逻辑一样:先确认IP、再确认防火墙开关(在“外部网络 → 防火墙”里,勾选“启用NAT”),最后同样清理DMZ(在“高级设置 → DMZ”里关掉)。
Q3:为什么我在OpenWrt里加了端口转发,但外网还是ping不通?
Ping走的是ICMP协议,和TCP/UDP端口转发无关。你要测试的是“能否访问TCP端口”,比如用telnet 公网IP 端口,或在线工具扫端口。
Q4:刷完固件后路由器IP变成了192.168.1.1,我原来设备绑定的192.168.31.100怎么办? 重新绑定。在OpenWrt里,网络 → DHCP/DNS → 静态地址,添加设备MAC和新的IP。然后更新端口转发里的内部IP。
Q5:有没有可能刷固件把NAT硬件加速搞坏了? 有的。部分第三方固件默认关闭了硬件流量分载(HWNAT),导致NAT性能下降,但不会导致端口转发完全失效。你可以在OpenWrt里搜“flow offloading”,开启软件或硬件加速,但注意:如果你用了QoS或限速,加速会失效。
四、实用建议:三个“救命方案”
方案A:最省事——刷回官方固件(适合小白)
如果你不在乎第三方固件的额外功能,刷回小米官方固件,端口转发在“高级设置 → 端口转发”里,图形化界面,填IP和端口即可,10秒搞定。官方固件虽然功能少,但稳定性最靠谱。
如果你需要的话,可以试试下面的免费工具:
方案B:最常用——OpenWrt“双保险”设置
在OpenWrt里,除了添加端口转发,再手动加一条防火墙规则(网络 → 防火墙 → 规则): - 协议:TCP+UDP - 源区域:wan - 目标区域:lan - 目标端口:你转发的端口 - 动作:接受
这样即使端口转发规则有冲突,防火墙规则也能放行。
方案C:最硬核——直接用Docker跑反向代理
如果你要转发的是Web服务(比如NAS、博客),不用端口转发,直接在路由器上装Docker(OpenWrt支持),跑一个Nginx反向代理,通过域名+子路径访问,彻底绕开端口转发的坑。这个方法还能顺便解决IP变化的问题,一劳永逸。
最后,再啰嗦一句:刷机有风险,操作需谨慎。 如果你刷的是2026年最新的测试版固件,可能还有未知bug,建议先刷稳定版(如OpenWrt 23.05.5或24.10正式版)。如果上面五步走完还是不通,去恩山论坛搜“小米B12 端口转发”,大概率能找到同款问题的解决方案——毕竟,你不是一个人在战斗。