Multicast issues with igmpproxy and fw4

I have a setup where I have a TP-Link WDR4300 running LEDE v17, which I built myself back then.

It is being used as a multicast router, where the upstream from the ISP is delivered on a VLAN to the WAN port of the router, and two decoders are connected to LAN1 and LAN2 on the device. I am using igmpproxy to forward the traffic between the upstream interface and the LAN on the router. This setup has been working brilliantly for years, and it still does.

However, I am now wanting to update to a modern version of OpenWRT, and since the WDR4300 is somewhat resource constrained, I've bought a used Netgear R7800 to replace it. This router is now running 22.03 stable (snapshot), and the build is based largely on @hnyman's build, I just customized it a little, adding for example igmpproxy to it.

I've manually edited the config of the new device to match the old as closely as possible, and it is almost working, but not quite. Streams can be started, but they stop after a short time, because the upstream provider isn't getting replies to the igmp queries. I suspect that it has something to do with igmpproxy, but I really can't say for sure. I can replicate the behaviour if I intentionally stop igmpproxy on the old device, but I realize that in itself that's not strong evidence of anything.

On the old device, igmpproxy would insert firewall rules, but on the new one (which uses fw4 and nftables), it does not. Not sure if that's really needed, though.

I can also see that on the old device, multicast routing is enabled (eth0.101 is the upstream IPTV interface):

root@WDR4300:/etc# sysctl -a 2>/dev/null | grep mc_forwarding
net.ipv4.conf.all.mc_forwarding = 1
net.ipv4.conf.br-lan.mc_forwarding = 1
net.ipv4.conf.default.mc_forwarding = 0
net.ipv4.conf.eth0.mc_forwarding = 0
net.ipv4.conf.eth0.101.mc_forwarding = 1
net.ipv4.conf.gre0.mc_forwarding = 0
net.ipv4.conf.gretap0.mc_forwarding = 0
net.ipv4.conf.lo.mc_forwarding = 0
net.ipv4.conf.sit0.mc_forwarding = 0
net.ipv4.conf.wlan0.mc_forwarding = 0
net.ipv6.conf.all.mc_forwarding = 0
net.ipv6.conf.br-lan.mc_forwarding = 0
net.ipv6.conf.default.mc_forwarding = 0
net.ipv6.conf.eth0.mc_forwarding = 0
net.ipv6.conf.eth0.101.mc_forwarding = 0
net.ipv6.conf.gre0.mc_forwarding = 0
net.ipv6.conf.gretap0.mc_forwarding = 0
net.ipv6.conf.lo.mc_forwarding = 0
net.ipv6.conf.sit0.mc_forwarding = 0
net.ipv6.conf.wlan0.mc_forwarding = 0

On the new device, it is not:

root@TVrouter:/etc# sysctl -a 2>/dev/null | grep mc_forwarding
net.ipv4.conf.all.mc_forwarding = 0
net.ipv4.conf.br-lan.mc_forwarding = 0
net.ipv4.conf.default.mc_forwarding = 0
net.ipv4.conf.eth0.mc_forwarding = 0
net.ipv4.conf.eth0/101.mc_forwarding = 0
net.ipv4.conf.eth1.mc_forwarding = 0
net.ipv4.conf.eth1/1.mc_forwarding = 0
net.ipv4.conf.lo.mc_forwarding = 0
net.ipv4.conf.sit0.mc_forwarding = 0
net.ipv4.conf.wlan0.mc_forwarding = 0
net.ipv4.conf.wlan1.mc_forwarding = 0
net.ipv6.conf.all.mc_forwarding = 0
net.ipv6.conf.br-lan.mc_forwarding = 0
net.ipv6.conf.default.mc_forwarding = 0
net.ipv6.conf.eth0.mc_forwarding = 0
net.ipv6.conf.eth0/101.mc_forwarding = 0
net.ipv6.conf.eth1.mc_forwarding = 0
net.ipv6.conf.eth1/1.mc_forwarding = 0
net.ipv6.conf.lo.mc_forwarding = 0
net.ipv6.conf.sit0.mc_forwarding = 0
net.ipv6.conf.wlan0.mc_forwarding = 0
net.ipv6.conf.wlan1.mc_forwarding = 0

As an experiment, I thought I'd manually enable it, but that's not possible:

root@TVrouter:/etc# sysctl -w net.ipv4.conf.all.mc_forwarding=1
sysctl: error setting key 'net.ipv4.conf.all.mc_forwarding': Permission denied

I am not sure if this is is the culprit or not. I've also made sure to disable igmp snooping everywhere, just to make sure that's not interfering with anything.

My kernel is configured with IP_MROUTE as well:

oyvind@debian-dev-owrt:~/owrt_mroek/owrt2203$ cat .config |grep MROUTE

CONFIG_KERNEL_IP_MROUTE=y
CONFIG_KERNEL_IP_MROUTE_MULTIPLE_TABLES=y
CONFIG_KERNEL_IPV6_MROUTE=y
CONFIG_KERNEL_IPV6_MROUTE_MULTIPLE_TABLES=y

Are there any incompatibilities with igmpproxy and FW4/nftables? Any pointers would be greatly appreciated.

I just discovered that igmpproxy isn't actually running on the new device, and the reason is because the config isn't valid. However, the UCI config should be valid as far as I can tell:

root@TVrouter:~# cat /etc/config/igmpproxy
config igmpproxy
        option quickleave 1
#       option verbose [0-3](none, minimal[default], more, maximum)

config phyint
        option network iptv
        option zone iptv
        option direction upstream
        list altnet 10.201.94.120/32
        list altnet 10.201.94.0/24
        list altnet 81.166.0.0/16
        list altnet 84.234.0.0/16
        list altnet 172.21.0.0/16

config phyint
        option network lan
        option zone lan
        option direction downstream

igmpproxy.conf does not reflect this, and I suppose that's at least part of the problem:

root@TVrouter:~# cat /var/etc/igmpproxy.conf
quickleave

phyint br-lan downstream ratelimit 0 threshold 1

Ok, this seems to be plain user error. igmpproxy wasn't started because the actual upstream interface was named IPTV and not iptv (which was written in the igmpproxy uci config). That caused /etc/init.d/igmpproxy to not find a valid upstream interface, and thus it did not start igmpproxy.

This topic was automatically closed 10 days after the last reply. New replies are no longer allowed.