OpenWrt 下新版 MiniUPnPd 无法添加端口转发规则的原因与解决方法
泥浆
编辑于 2025年06月15日 17:06

较新版本的 MiniUPnPd 会检测外部接口上的 IP 地址

如果不存在公网 IP,则会拒绝添加端口转发规则,一般返回 501 (Action Failed)

日志提示如下:

private/reserved address 100.64.8.8 is not suitable for external IP

首选解决方法是开启 STUN 获取公网地址

但以上方法很多时候并不能解决问题,因为开启 STUN 后同时还会检测 NAT 类型

OpenWrt 默认情况下,防火墙会进行过滤而导则检测结果为 NAT3,MiniUPnPd 同样会拒绝添加端口转发规则

日志提示如下:

STUN: ext interface pppoe-wan with private IP address 100.64.8.8 is now behind restrictive or symmetric NAT with public IP address 120.8.9.10 which does not support port forwarding

NAT on upstream router blocks incoming connections set by miniupnpd

Turn off NAT on upstream router or change it to full-cone NAT 1:1 type

Port forwarding is now disabled

启用 STUN 后提示 NAT 类型受限时,可以给 upnpd 指定一个外部 IP,直接跳过检测

需要注意的是,不可同时启用 STUN 和指定外部 IP ,否则 MiniUPnPd 会报错停止

日志提示如下:

Error: options ext_ip= and ext_perform_stun=yes cannot be specified together

由于 LuCi 界面下无法指定外部 IP,因此需要直接编辑配置文件 /etc/config/upnpd

本文示例使用 uci 命令

代码块
Shell
自动换行
复制代码
uci set upnpd.config.use_stun=0
uci set upnpd.config.external_ip=1.2.3.4
uci commit upnpd
/etc/init.d/miniupnpd restart
复制成功

以上示例使用 1.2.3.4,此 IP 会通告给 UPnP 客户端

由于目的是开启 MiniUPnPd 的端口转发规则,因此只需要随便指定一个可以跳过检测的公网 IP 即可

如果希望添加真实的外部 IP,则需要使用 Hotplug 脚本,在每次网络接口更新时,自动检测外部 IP 并添加至 /etc/config/upnpd

代码块
Shell
自动换行
复制代码
cat >/etc/hotplug.d/iface/05-miniupnpd-external-ip <<EOF
[ "\$ACTION" = "ifup" ] && [ "\$INTERFACE" = "wan" ] && \
uci set upnpd.config.external_ip=\$(curl -Ls 4.ipw.cn) && \
uci commit upnpd
EOF
复制成功

MiniUPnPd 本身会创建一个文件名为 50-miniupnpd 的 Hotplug 脚本,其最后会重启 MiniUPnPd

因此把指定外部 IP 的脚本放在其之前执行,可以减少一次 MiniUPnPd 的重启

Hotplug 脚本的执行顺序基于文件名,因此使用 05-miniupnpd-external-ip

示例脚本仅在 wan 接口更新时才执行检测和添加,请改成你实际的外部接口名称

也可以把 [ "$INTERFACE" = "wan" ] && 部分删除,则会在任意接口更新时都执行脚本

示例脚本使用 curl -Ls 4.ipw.cn 检测外部 IP,请确保你的 OpenWrt 有安装 curl

如有必要 4.ipw.cn 可以更换成其他可获得外部 IP 的 URL

以上命令仅添加 Hotplug 脚本,需在 wan 接口更新时才触发

如要马上启用 MiniUPnPd 的端口转发规则,请执行先前的 uci 命令

以上 Hotplug 脚本在刷写固件后会被删除

如要保留,请打开 系统--备份与升级--配置

把 /etc/hotplug.d/iface/05-miniupnpd-external-ip 添加至列表中

MiniUPnPd 确实是有点多管闲事了