是否有可能用iptables复制UDP单播stream?

我有一个专有的系统,将单元#1(192.168.1.1)的udpvideostream传输到单元#2(.1.2)。 我不能修改这个系统,我想克隆这个udpstream,所以我可以在不同的程序中访问它。 这个程序将做video的东西,并作为一个组播stream再次发送出去。

我希望使用三台网卡的Linux机器(现在运行Ubuntu Server 12.04)执行此操作。 通过将单元#1和#2连接到Linux机器中的两个网卡(eth0和eth1)并使用桥接,我就可以进行通信。 我的/ etc / network / interfaces看起来像:

# The loopback network interface auto lo iface lo inet loopback # The external interface auto eth3 iface eth3 inet static address 192.168.10.2 netmask 255.255.255.0 # The bridge interface auto br0 iface br0 inet manual bridge_ports eth0 eth1 

这工作,并通过使用tcpdump我已经确认udp数据包从#1到达,并正在朝着#2端口6000。

下一步,我希望将工作是使用iptables克隆所有udp数据包从192.168.1.1转到端口6000#2。 我不是很熟悉iptables,但在阅读在线和手册后,我认为这将工作:

 iptables -A PREROUTING -t mangle -p udp -s 192.168.1.1/32 --dport 6000 -j TEE --gateway 192.168.10.2 

规则成功应用,但不起作用。 如果我使用tcpdump来监视eth3,那么在那里看不到数据包。

我想抓住这个stream,处理它,并在.10.2接口上以多播的forms发送出去。

我究竟做错了什么? 有什么我误解了吗?

数据包从未达到eth3,因为机器本身是192.168.10.2。 此外,重复的数据包仍然具有destincation ip-address 192.168.1.2。 您需要将它们发送到192.168.10.0/24中的计算机(例如192.168.10.254),以便重复实际上通过eth3进行路由。

 iptables -t mangle -A PREROUTING -p udp --dport 6000 -j TEE --gateway 192.168.10.254 

那么你也需要将它们DNAT到192.168.10.254,这样你就可以读取192.168.10.254上的stream并通过多播发送出去。

无论是在192.168.10.254本身:

 iptables -t nat -A PREROUTING -p udp -d 192.168.1.2 --dport 6000 -j DNAT --to-destination 192.168.10.254:6000 

或者在数据包离开eth3之前仍然在192.168.10.2上:

 iptables -t nat -A POSTROUTING -o eth3 -p udp -d 192.168.1.2 --dport 6000 -j DNAT --to-destination 192.168.10.254:6000 

我有一个类似的问题,并用一个使用libpcap读取UDP数据包内容的小程序解决了这个问题。 它发送这些数据包的副本到另一个目的地。 (可能在同一台机器上。)