找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 2193|回复: 7

解决多线多播、单线多拨与UPNP冲突的一种办法

[复制链接]
发表于 2022-11-5 19:06 | 显示全部楼层 |阅读模式
事情的起因还是要从2年前开始,BitComet 提示受阻,才发现多播与UPNP冲突,后来开端口映射也解决了一段时间,但是总感觉难受。直到上个月看到了两篇大佬写的深度好文:

OpenWRT固件miniUPNP配置多网卡支持

Openwrt的miniupnpd不能监听/32以下子网UPNP客户端的解决方案


经检查/etc/config/upnpd文件中
config 'upnpd' 'config'
        option 'external_iface' 'wan'
        option 'internal_iface' 'lan'
        option 'port' '5000'
        option 'uuid' 'xxxxxx'


wan字段与多播之后的vwan字段不一致,导致应用程序找不到upnp设备
我将其替换成:
        option external_iface 'vwan1'
        option external_iface 'vwan2'

这一段请根据自己的网络接口名字修改。


实际上可能只有一个网口起效,BC也不支持多IP,因此无法验证。


一定要关闭STUN


重要的事情说三遍:
重启服务
重启服务
重启服务


最后看看效果吧



个人建议租约文件保存到内存里
一定要关闭STUN










本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2022-11-5 20:58 | 显示全部楼层
我记得用多拨时候没问题啊,勾上igdv1就行了,还是最近版本的bug?我那时候还是op 18的时候
回复 支持 反对

使用道具 举报

发表于 2022-11-5 21:05 | 显示全部楼层
本帖最后由 wulishui 于 2022-11-5 21:11 编辑

你配置方法获取到的ifname是:
        option external_iface 'vwan1'
        option external_iface 'vwan2'
uci get upnpd.config.external_iface = vwan2
也就是最后一个,前面一个会被覆盖。
要想两个都获取到,就要使用list
        list external_iface 'vwan1'
        list external_iface 'vwan2'
这样获取到就是: uci get upnpd.config.external_iface = vwan1 vwan2

但是启动脚本中ifname的生成命令:echo "ext_ifname=$ifname" >$tmpconf
所以最终生成的是:ext_ifname=vwan1 vwan2 ,但这种参量赋值是错误的,最终生效的应该是ext_ifname=vwan1。

所以按照你这个配置,实际上有用的是:
ext_ifname=vwan2。

按照
        list external_iface 'vwan1'
        list external_iface 'vwan2'
生效的是:ext_ifname=vwan1
也就是自始至终只会有一个有效利用。



点评

我是来膜拜大神的  详情 回复 发表于 2022-11-5 21:35
回复 支持 反对

使用道具 举报

发表于 2022-11-5 21:28 | 显示全部楼层
而内部接口却不同,可以使用多个:
                for iface in ${internal_iface:-lan}; do
                        local device
                        network_get_device device "$iface" && echo "listening_ip=$device"
                done

点评

大神,那到底怎么设置才可以单线多拨,upnp生效啊,我单线多拨,网心云都瘫痪了  详情 回复 发表于 2022-11-9 21:00
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-5 21:35 | 显示全部楼层
wulishui 发表于 2022-11-5 21:05
你配置方法获取到的ifname是:
        option external_iface 'vwan1'
        option external_iface ' ...

我是来膜拜大神的
回复 支持 反对

使用道具 举报

发表于 2022-11-9 21:00 | 显示全部楼层
wulishui 发表于 2022-11-5 21:28
而内部接口却不同,可以使用多个:
                for iface in ${internal_iface:-lan}; do
                        local device

大神,那到底怎么设置才可以单线多拨,upnp生效啊,我单线多拨,网心云都瘫痪了
回复 支持 反对

使用道具 举报

发表于 2022-11-14 11:49 来自手机 | 显示全部楼层
新路由3刷高恪可以设置,不设置甜糖和网心云就不行。红米ac2600刷老毛子固件多搏没有upnp 但不耽误用 但网速不满
回复 支持 反对

使用道具 举报

发表于 2024-2-26 16:20 | 显示全部楼层


  1. #!/bin/sh /etc/rc.common
  2. # Copyright (C) 2006-2014 OpenWrt.org

  3. START=94
  4. STOP=15
  5. USE_PROCD=1
  6. PROG=/usr/sbin/miniupnpd
  7. [ -x "$(command -v nft)" ] && FW="fw4" || FW="fw3"

  8. upnpd_get_port_range() {
  9.         local var="$1"; shift
  10.         local val

  11.         config_get val "$@"

  12.         case "$val" in
  13.                 [0-9]*[:-][0-9]*)
  14.                         export -n -- "${var}_start=${val%%[:-]*}"
  15.                         export -n -- "${var}_end=${val##*[:-]}"
  16.                 ;;
  17.                 [0-9]*)
  18.                         export -n -- "${var}_start=$val"
  19.                         export -n -- "${var}_end="
  20.                 ;;
  21.         esac
  22. }

  23. conf_rule_add() {
  24.         local cfg="$1"
  25.         local action int_addr
  26.         local ext_start ext_end int_start int_end comment

  27.         config_get action "$cfg" action "deny"                # allow or deny
  28.         upnpd_get_port_range "ext" "$cfg" ext_ports "0-65535" # external ports: x, x-y, x:y
  29.         config_get int_addr "$cfg" int_addr "0.0.0.0/0"       # ip or network and subnet mask (internal)
  30.         upnpd_get_port_range "int" "$cfg" int_ports "0-65535" # internal ports: x, x-y, x:y or range
  31.         config_get comment "$cfg" comment "ACL"               # comment

  32.         # Make a single IP IP/32 so that miniupnpd.conf can use it.
  33.         [ "${int_addr%/*}" = "$int_addr" ] && int_addr="$int_addr/32"

  34.         echo "$action $ext_start${ext_end:+-}$ext_end $int_addr $int_start${int_end:+-}$int_end #$comment"
  35. }

  36. upnpd_write_bool() {
  37.         local opt="$1"
  38.         local def="${2:-0}"
  39.         local alt="${3:-$opt}"
  40.         local val

  41.         config_get_bool val config "$opt" "$def"
  42.         if [ "$val" -eq 0 ]; then
  43.                 echo "$alt=no"
  44.         else
  45.                 echo "$alt=yes"
  46.         fi
  47. }

  48. upnpd() {
  49.         config_load "upnpd"
  50.         local external_iface external_iface6 external_zone external_ip internal_iface
  51.         local upload download log_output port config_file serial_number model_number
  52.         local use_stun stun_host stun_port uuid notify_interval presentation_url
  53.         local upnp_lease_file clean_ruleset_threshold clean_ruleset_interval
  54.         local ipv6_disable

  55.         local enabled
  56.         config_get_bool enabled config enabled 1
  57.         [ "$enabled" -eq 0 ] && return 1

  58.         config_get external_iface config external_iface
  59.         config_get external_iface6 config external_iface6
  60.         config_get external_zone config external_zone
  61.         config_get external_ip config external_ip
  62.         config_get internal_iface config internal_iface
  63.         config_get port config port 5000
  64.         config_get upload config upload
  65.         config_get download config download
  66.         config_get_bool log_output config log_output 0
  67.         config_get config_file config config_file
  68.         config_get serial_number config serial_number
  69.         config_get model_number config model_number
  70.         config_get uuid config uuid
  71.         config_get use_stun config use_stun 0
  72.         config_get stun_host config stun_host
  73.         config_get stun_port config stun_port
  74.         config_get notify_interval config notify_interval
  75.         config_get presentation_url config presentation_url
  76.         config_get upnp_lease_file config upnp_lease_file
  77.         config_get clean_ruleset_threshold config clean_ruleset_threshold
  78.         config_get clean_ruleset_interval config clean_ruleset_interval
  79.         config_get ipv6_disable config ipv6_disable 0

  80.         local conf ifname ifname6

  81.         . /lib/functions/network.sh

  82.         if [ -n "$external_iface" ] ; then
  83.                 network_get_device ifname "$external_iface"
  84.         else
  85.                 if [ -n "$external_zone" ] ; then
  86.                         ifname=$($FW -q zone "$external_zone" 2>/dev/null | head -1)
  87.                 else
  88.                         network_find_wan external_iface && \
  89.                                 network_get_device ifname "$external_iface"
  90.                 fi
  91.         fi
  92.         if [ -n "$external_iface6" ] ; then
  93.                 network_get_device ifname6 "$external_iface6"
  94.         else
  95.                 if [ -n "$external_zone" ] ; then
  96.                         ifname6=$($FW -q zone "$external_zone" 2>/dev/null | head -1)
  97.                 else
  98.                         network_find_wan6 external_iface6 && \
  99.                                 network_get_device ifname6 "$external_iface6"
  100.                 fi
  101.         fi

  102.         if [ -n "$config_file" ]; then
  103.                 conf="$config_file"
  104.         else
  105.                 local tmpconf="/var/etc/miniupnpd.conf"
  106.                 conf="$tmpconf"
  107.                 mkdir -p /var/etc

  108.                 {
  109.                 local ext_iface
  110.                 for ext_iface in $external_iface; do
  111.                         local device
  112.                         [ -n "$ext_iface" ] && network_get_device device "$ext_iface" && echo "ext_ifname=$device"
  113.                 done

  114.                 local ext_iface6
  115.                 for ext_iface6 in $external_iface6; do
  116.                         local device
  117.                         [ -n "$ext_iface6" ] && network_get_device device "$ext_iface6" && echo "ext_ifname6=$device"
  118.                 done

  119.                 [ -n "$external_zone" ] && echo "ext_zone=$external_zone"
  120.                 [ -n "$external_ip" ] && echo "ext_ip=$external_ip"

  121.                 local iface
  122.                 for iface in ${internal_iface:-lan}; do
  123.                         local device
  124.                         network_get_device device "$iface" && echo "listening_ip=$device"
  125.                 done

  126.                 config_load "upnpd"
  127.                 upnpd_write_bool enable_natpmp 1
  128.                 upnpd_write_bool enable_upnp 1
  129.                 upnpd_write_bool secure_mode 1
  130.                 upnpd_write_bool system_uptime 1
  131.                 upnpd_write_bool igdv1 0 force_igd_desc_v1
  132.                 upnpd_write_bool use_stun 0 ext_perform_stun
  133.                 upnpd_write_bool ipv6_disable $ipv6_disable

  134.                 [ "$use_stun" -eq 0 ] || {
  135.                         [ -n "$stun_host" ] && echo "ext_stun_host=$stun_host"
  136.                         [ -n "$stun_port" ] && echo "ext_stun_port=$stun_port"
  137.                 }

  138.                 [ -n "$upload" ] && [ -n "$download" ] && {
  139.                         echo "bitrate_down=$((download * 1024 * 8))"
  140.                         echo "bitrate_up=$((upload * 1024 * 8))"
  141.                 }

  142.                 [ -n "$upnp_lease_file" ] && touch "$upnp_lease_file" && echo "lease_file=$upnp_lease_file"
  143.                 [ -n "$presentation_url" ] && echo "presentation_url=$presentation_url"
  144.                 [ -n "$notify_interval" ] && echo "notify_interval=$notify_interval"
  145.                 [ -n "$clean_ruleset_threshold" ] && echo "clean_ruleset_threshold=$clean_ruleset_threshold"
  146.                 [ -n "$clean_ruleset_interval" ] && echo "clean_ruleset_interval=$clean_ruleset_interval"
  147.                 [ -n "$serial_number" ] && echo "serial=$serial_number"
  148.                 [ -n "$model_number" ] && echo "model_number=$model_number"
  149.                 [ -n "$port" ] && echo "port=$port"

  150.                 [ -z "$uuid" ] && {
  151.                         uuid="$(cat /proc/sys/kernel/random/uuid)"
  152.                         uci set upnpd.config.uuid="$uuid"
  153.                         uci commit upnpd
  154.                 }

  155.                 [ "$uuid" = "nocli" ] || echo "uuid=$uuid"

  156.                 config_foreach conf_rule_add perm_rule

  157.                 if [ "$FW" = "fw4" ]; then
  158.                         #When using nftables configure miniupnpd to use its own table and chains
  159.                         echo "upnp_table_name=fw4"
  160.                         echo "upnp_nat_table_name=fw4"
  161.                         echo "upnp_forward_chain=upnp_forward"
  162.                         echo "upnp_nat_chain=upnp_prerouting"
  163.                         echo "upnp_nat_postrouting_chain=upnp_postrouting"
  164.                 fi

  165.                 } > "$tmpconf"
  166.         fi

  167.         if [ -n "$ifname" ]; then
  168.                 # start firewall
  169.                 if [ "$FW" = "fw4" ]; then
  170.                         nft -s -t -n list chain inet fw4 upnp_forward >/dev/null 2>&1 || fw4 reload
  171.                 else
  172.                         iptables -L MINIUPNPD >/dev/null 2>&1 || fw3 reload
  173.                 fi
  174.         else
  175.                 logger -t "upnp daemon" "external interface not found, not starting"
  176.         fi

  177.         procd_open_instance
  178.         procd_set_param file "$conf" "/etc/config/firewall"
  179.         procd_set_param command "$PROG"
  180.         procd_append_param command -f "$conf"
  181.         [ "$log_output" = "1" ] && procd_append_param command -d
  182.         procd_close_instance
  183. }

  184. stop_service() {
  185.         if [ "$FW" = "fw3" ]; then
  186.                 iptables -t nat -F MINIUPNPD 2>/dev/null
  187.                 iptables -t nat -F MINIUPNPD-POSTROUTING 2>/dev/null
  188.                 iptables -t filter -F MINIUPNPD 2>/dev/null
  189.                 [ -x /usr/sbin/ip6tables ] && ip6tables -t filter -F MINIUPNPD 2>/dev/null
  190.         else
  191.                 nft flush chain inet fw4 upnp_forward 2>/dev/null
  192.                 nft flush chain inet fw4 upnp_prerouting 2>/dev/null
  193.                 nft flush chain inet fw4 upnp_postrouting 2>/dev/null
  194.         fi
  195. }

  196. start_service() {
  197.         config_load "upnpd"
  198.         config_foreach upnpd "upnpd"
  199. }

  200. service_triggers() {
  201.         procd_add_reload_trigger "upnpd"
  202. }

复制代码

评分

参与人数 1恩山币 +1 收起 理由
迦南*** + 1 膜拜大神

查看全部评分

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

欢迎大家光临恩山无线论坛上一条 /1 下一条

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-5-28 22:48

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com 举报电话:0519-86695797

快速回复 返回顶部 返回列表