通过 iptables 单播到多播

Art*_*ski 3 iptables multicast

注意:虽然现在有一个可以接受的答案,但这只是一部分;检查下面的最终 iptables 规则。

我在一个接口上接收单播 RTP 流,并希望通过多播在第二个接口上将其发送出去。有问题的系统是一个运行 Linux 的嵌入式处理器,但我发现在我的 Ubuntu 10.10 主机上设置同样困难。基于http://lists.netfilter.org/pipermail/netfilter/2002-October/038890.html和其他来源的简单而明显的答案似乎是:

iptables -t nat -A PREROUTING -i [unicast-interface] -p udp --dport [unicast-incoming-port] -j DNAT --to-destination [multicast-addr]:[multicast-port]
Run Code Online (Sandbox Code Playgroud)

一些额外的研究导致了这种配对:

iptables -t nat -A PREROUTING -i [unicast-interface] -p udp --dport [unicast-incoming-port] -j DNAT --to-destination [multicast-addr]:[multicast-port]
iptables -A FORWARD -i [unicast-interface] -o [multicast-interface] -p udp --dport [unicast-incoming-port] -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

尽管列出时会显示规则,并且 tcpdump 显示传入的单播数据包,但单独机器上的 Wireshark 显示没有数据包传出。

我查看了如何使用 iptables 通过 DNAT 将单播转换为广播?但这似乎与广播案件的细节有关。

注意:没有设置其他的 iptables 规则。我已经使用 iptables -L(和 -t nat -L)和 iptables --flush 进行了双重检查。

(我意识到还有其他选择,比如socat- 但在我切换到它们之前,我想确保我没有遗漏一些东西。)

编辑:我确实启用了 ip_forward。

~ # sysctl -a 2>&1 |grep ip_forward
net.ipv4.ip_forward = 1
Run Code Online (Sandbox Code Playgroud)

编辑:看起来我的 NAT 表 ( iptables -t nat -L -v -n) 中的数据包计数正在增加,但在主/过滤器表 ( iptables -L -v -n) 中却没有增加

编辑:在尝试尝试之后,我没有成功。我看到有些人使用类似的流程与 Cisco 合作,例如在此站点上:http : //www.penrod.cc/?p=527

看起来这确实在某个时间点起作用,但从那以后我一直无法使其工作,无论是在原始嵌入式主机上还是在 Linux 工作站上。

编辑:事实证明,这个问题又出现了。

完全有效的最终解决方案:

获取 smcroute(正在运行的静态多播路由守护程序)。如果您在嵌入式系统中,您可能需要使用smcroute -d

smcroute -a [unicast-interface] [source-ip] [multicast-addr] [multicast-interface]
iptables -t nat -A PREROUTING -p UDP -d [unicast-interface-ip] -j NETMAP --to [multicast-addr]
Run Code Online (Sandbox Code Playgroud)

例如:

smcroute -a eth0 192.168.0.101 239.1.1.1 eth0
iptables -t nat -A PREROUTING -p UDP -d 192.168.0.1 -j NETMAP --to 239.1.1.1
Run Code Online (Sandbox Code Playgroud)

请注意,您可能需要改进 iptables 规则以确保您不会捕获您不想要的数据包——这只是一个简化的示例。

poi*_*bit 5

你在内核上启用了 ip forward 吗?

# sysctl -a 2>&1 | grep ip_forward
net.ipv4.ip_forward=1
Run Code Online (Sandbox Code Playgroud)

您需要它将流量从一个接口传递到另一个接口(也就是 FORWARD 表规则)。

编辑:

还有其他 sysctl 设置,我怀疑这会相关:

net.ipv4.conf.all.mc_forwarding
Run Code Online (Sandbox Code Playgroud)

和每个接口,以及 ipv6。

那个“mc”听起来真的很适合多播,但我手头没有内核文档可以 100% 确定。

尝试设置为 1,如果始终不起作用,您可以返回默认值 0。

编辑:

来自网络/ip-sysctl.txt:

conf/all/mc_forwarding 也必须设置为 TRUE 以启用多播路由