今天想给家里路由器 (XiaoMi R3D) 做个端口映射给同事演示做的东西,但是发现通过网页设置路由器端口映射直接返回 500 错误,查了下日志也看到什么错误,然后查看了一下相关代码,并通过 lua
交互式客户端调试了一下
> do |
发现错误发生在校验指定的目标端口是否已经使用的代码中,代码如下
function _portRangeOverlap(port1, port2) |
错误出现在这一行代码中,错误的原因是 range1.f
的值为 nil
而 range2.f
的数据类型为 number
不能进行比较
if (range1.f >= range2.f and range1.f <= range2.t) |
为什么 range1.f
会是 nil
呢,笔者看了一下前面的代码
uci:foreach("firewall", "redirect", |
是对 uci (lua 统一配置接口) 中的 firewall.redirect
这部分内容进行迭代,与指定的目标端口进行对比,那么原因就出现在笔者环境中的 firewall.redirect
里面了,通过命令查看配置内容
uci show firewall.@redirect[1] |
可以看到这个配置里面的 dport 不是标准的格式,那么问题就是出现在这里了,通过以下命令删除对应的配置就搞定了
uci delete firewall.@redirect[1] |
为什么会出现这个问题,笔者认为应该是之前配置 smb
外网访问导致的