使用iptables(或其他lartc命令)将组播限制到想要的outout接口

我有unifi服务器运行在networking上的所有我的接入点。 控制器主机位于几个networking上,但是其中只有一个应该被unifi使用。 当然,服务器没有select来控制它使用的接口。 它将组播stream传到错误的networking上。

我试图阻止所有非白名单的组播,就像这样:

iptables -A OUTPUT -d 224.0.0.0/4 -j DROP 

对我来说,这似乎是一个没有道理的,它的工作原理,除了最终unifi控制器进入一个循环(显然没有sleep()),并不断试图填充接口,我不希望它在谈论 – 谢谢你这个启示。 所以服务器坐在100%的CPU,只是因为在iptables的-j DROP规则。 整齐。

我正在寻找一种方法来丢弃数据包没有阻塞(即unifi认为数据包熄灭)或redirect到可接受的接口。 即使它来源不佳,也比让它误入错误的networking更好。

为此,我也试图将其路由到回送,但是数据包出错了接口,忽略了路由。 我觉得他们直接在接口上打开socket。

  iptables -t mangle -A PREROUTING -d 224.0.0.0/4 -j MARK --set-mark 666 ip rule add fwmark 666 table 666 ip route add 224.0.0.0/4 dev lo table 666 

我正在使用路由表和fw标记来确保我不会路由任何想要的多播(在其他地方列入白名单)。

我认为unifi全部绕过路由表。 设置标记正在触发(巨大数据包计数),但数据包继续从不需要的接口发出。 其他多播的类似规则似乎工作正常。 这是一个可怕的unifi在做什么(raw ip socket也许?)。

这真的不是一个重要的问题。 我只是将服务移动到只有一个接口的不同的虚拟机。 但我想知道我是如何做这个学术的理由。 似乎应该有一种方法来限制应用程序到你希望它们被限制的接口。

一种方法是使用unshare -n将进程放到自己的networking名称空间中。 这将有效地限制它可以绑定的接口,以至于它只会发送通过命名空间导出的接口。

这相当于把它放在只有一个接口的虚拟机上,而不需要额外的虚拟机开销。

你也可能想尝试把你的PREROUTING规则放到OUTPUT链中,因为这些数据包在本地生成(我假设)在主机上。 路由只是绕过,因为netfilter不分析在PREROUTING链本地源的数据包。

还有一些iptables规则指定你允许和多播的接口是有用的。

 iptables -o ethX -d 224.0.0.0/4 -j DROP 

这将有助于确保数据包真正在您关心的networking上发生。