原生OpenWrt的UPnP一直时好时不好,今天花了一些时间,好好研究了一下中间的原理;
首先,打开UPnP的调试日志,观察到报错的部分:
UPnP试图绑定的interface是我的IPTV接口,并且识别到是一个内部ip,所以无法绑定成功。
以此看upnp进程:
/usr/sbin/miniupnpd -f /var/etc/miniupnpd.conf
发现了问题,UPnP生成的配置文件里面看到IPv4的出口错误的指向了我的IPTV拨号接口
ext_ifname=lan1
ext_ifname6=pppoe-wan
这个配置文件的路径是软链接到tmp的,那么这个文件应该是动态生成的,没法直接修改。
/etc/init.d/miniupnpd
找到了UPnP的启动脚本在这里,那么找到127-128行有这个字段的赋值,明显是他寻找出口的逻辑在我的双wan拨号下不适用,那么我就适用了一个简单的办法,把IPv4的接口也指向IPv6,反正IPv6是对的,简单的先解决这个问题。如果是更复杂的场景,把ifname写死即可。
echo "ext_ifname=$ifname6"
echo "ext_ifname6=$ifname6"
到这里,UPnP终于是可以正常工作了。
遇到相同的问题,感谢分享,进一步研究了一下,可以通过修改/etc/config/upnpd可以手动指定接口
config upnpd ‘config’
…
option external_iface ‘wan’
option external_iface6 ‘wan’
…