在openwrt上安装miniupnp的话可能会遇到这2个问题,第一个问题就是客户端无法识别到有效的miniupnpd服务,第二个就是即使识别到了服务,但是也没办法完成映射端口的添加
一、无法识别到有效的miniupnpd服务
在其他设备上尝试查找upnp服务的时候会提示找不到有效的miniupnpd网关设备,例如
> upnpc -l
upnpc : miniupnpc library test client, version 2.2.4.
(c) 2005-2022 Thomas Bernard.
Go to http://miniupnp.free.fr/ or https://miniupnp.tuxfamily.org/
for more information.
List of UPNP devices found on the network :
desc: http://192.168.1.1:5000/rootDesc.xml
st: urn:schemas-upnp-org:device:InternetGatewayDevice:1
Found a (not connected?) IGD : http://192.168.1.1:5000/ctl/IPConn
No valid UPNP Internet Gateway Device found.ShellScript客户端提示尽管找到upnp服务但是无法找到网关设备,如果不进行配置直接启动默认服务的话,upnp是没办法正常使用的,因为upnp检测到IGD状态是无效的,即无法获取到实际外部有效的公网ip地址,这种情况尽管upnp服务处于开启状态,但是无法获取到真实的公网IP地址,则会显示无法找到网关设备。这是由于我们的服务器拨号获取到的WAN地址是运营商提供的内网地址,因此miniupnp检测到我们的WAN口不是真实的公网IPV4地址,则认为不具备upnp的开启条件
这种情况有2种解决的方式
1、手动开启STUN检测
因为miniupnp服务没有办法直接获取到真实的公网IP地址,因此我们可以使用STUN来辅助我们获取到真实的公网IPV4地址,在服务设置->高级设置里面勾选使用STUN并填入STUN服务器地址即可让upnp正常显示了

当然也可以使用命令行开启
uci set upnpd.config.use_stun=1
uci set upnpd.config.stun_host='stun.miwifi.com'
uci set upnpd.config.stun_port='3478'
uci commit upnpd
/etc/init.d/miniupnpd restartShellScript
2、手动指定静态地址
既然是因为没有检测到有效的WAN地址,那么我们其实是可以手动指派一个地址,跳过有效性检测,让其强制开启的upnp服务
uci set upnpd.config.use_stun=0
uci set upnpd.config.external_ip=1.2.3.4
uci commit upnpd
/etc/init.d/miniupnpd restartShellScript由于手动指派外部IP在Web页面上是没有这个选项的,因此我们只能通过直接修改配置文件开设置。这里有个需要注意的是STUN功能是和手动指派静态地址是互斥的,因此在指派之前,请先关闭miniupnp的STUN功能。配置完成upnp就恢复正常了。
如果还想配置真实的IP地址的话,可以使用下面命令来添加动态IP
uci set upnpd.config.use_stun=0
uci set upnpd.config.external_ip=`curl -4 https://api.ip.sb/ip`
uci commit upnpd
/etc/init.d/miniupnpd restartShellScript如果想实现动态更新IP的话,可以通过添加一个Hotplug 脚本来实现钩子更新
cat >/etc/hotplug.d/iface/05-miniupnpd-external-ip <<EOF
[ "\$ACTION" = "ifup" ] && [ "\$INTERFACE" = "wan" ] && \
uci set upnpd.config.external_ip=`curl -4 https://api.ip.sb/ip` && \
uci commit upnpd
EOFShellScript这个脚本的作用就是在WAN接口启动的时候会动态执行更新external_ip的地址,从而实现每次WAN接口重启都会自动更新upnp的静态外部地址
二、无法完成映射端口的添加
在上一章节如果你是使用STUN的方式来upnp服务的,但是实际上你是无法正常使用upnpc -a命令添加转发规则的,通常会提示类似AddPortMapping(45141, 10086, 192.168.1.50) failed with code 501 (Action Failed),这个是因为使用STUN的话由于拨号获取到大内网地址的情况下,端口映射行为与实际在经过运营商的CGNAT结果不一致,MiniUPnP会拒绝添加端口转发规则。因此我们可以通过添加外部STUN使能配置来实现让其放行规则允许添加过滤规则
uci set upnpd.config.ext_perform_stun='allow-filtered'
uci commit upnpd
/etc/init.d/miniupnpd restartShellScript但是你会发现将miniupnp重启之后依旧是没办法添加upnp转发规则的,这个问题是由于系统服务不是直接使用/etc/config/upnpd的配置文件,而是读取配置文件进行解析后在/var/etc/miniupnpd.conf生成一份用于运行时候的配置,因此我们只是修改了原始配置的话再经过系统服务启动的话依旧是没有办法正常开启upnp转发的
我们可以直接通过修改/etc/init.d/miniupnpd的启动配置来强制修改配置让其开启,甚至连/etc/config/upnpd都不需要添加ext_perform_stun参数。这个命令的作用其实就是当STUN开启的时候自动设置ext_perform_stun=’allow-filtered’
sed -i 's/upnpd_write_bool use_stun 0 ext_perform_stun/\[ "$use_stun" = "1" \] \&\& echo "ext_perform_stun=allow-filtered" || echo "ext_perform_stun=no"/' /etc/init.d/miniupnpdShellScript修改完成后重启服务/etc/init.d/miniupnpd restart










