我有一个专有系统,可将 UDP 视频流从单元 #1 (192.168.1.1) 传输到单元 #2 (.1.2)。我无法更改此系统,并且我正在尝试克隆此 UDP 流,以便我可以在不同的程序中访问它。此程序将对视频进行处理并将其作为多播流再次发送出去。
我希望使用具有三张网卡的 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 到达并且正前往端口 6000 处的 #2。
我希望下一步能成功,即使用 iptables 克隆来自 192.168.1.1 并发往 #2 端口 6000 的所有 udp 数据包。我对 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,则看不到那里的数据包。
我想抓住这个流,对其进行处理,并通过 .10.2 接口将其作为多播发送出去。
我做错了什么?我误解了什么吗?
答案1
由于 192.168.10.2 是机器本身,因此数据包永远不会到达 eth3。此外,重复的数据包仍具有目标 IP 地址 192.168.1.2。您需要将它们 TEE 到 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 上的流并通过多播将其发送出去。
在 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
答案2
我遇到了类似的问题,并使用一个小程序解决了该问题,该程序使用 libpcap 读取 UDP 数据包的内容。它将这些数据包的副本发送到另一个目的地。(可能在同一台机器上。)