我设法通过以下方式复制数据:Sudo iptables –t mangle –A PREROUTING –p udp –d 192.168.2.100 –dport 53260 –j TEE –gateway 192.168.2.80
Linux 在 192.168.2.80 接收数据包,但目的地仍然是 192.168.2.100,但 MAC 地址是正确的。不过,为了使我的应用程序正常工作,我也需要将目标 IP 更改为 192.168.2.80。
我尝试了 DNAT/NETMAP,但是无法使其真正发挥作用。
Sudo iptables –t nat –A OUTPUT –destination 192.168.2.130 –j DNAT –to-destination 192.168.2.100 - 有效,但问题是数据包没有复制,所以我的第一个设备上没有数据包。它们以这种方式转发。
提前致谢。
编辑:(附加信息)
设置如下:显示器和摄像机通过交换机连接,摄像机通过 udp 单播进行流式传输。
我必须实现一个连接到交换机的录像机。由于我刚开始时完全是个新手,所以我意识到/尝试了多种方法。
通过交换机对摄像机进行端口镜像,并将录像机连接到端口镜像(问题:目标 ip/mac 与录像机设备不同,所以我只能在接口级别看到数据包,但在我的应用程序中却收不到它们)
iptables(本问题:问题:不同的目标 ip 地址)
通过 tcpdump/tshark 抓包 -> 提取 payload -> gstreamer -> 效率很低,步骤很多
我还打开了混杂模式(因为我读到目标地址并不重要,但仍然无法在我的应用程序中接收数据包,用“netstat -s -u”仔细检查后发现我也没有收到 udp 数据包)
为了使我的设置正常工作,显示器和摄像头都需要接收具有各自 IP/MAC 的相同 UDP 数据包。
更新: 经过推荐,我尝试了 socat。这些是我在这里遇到的问题。
socat - udp4-listen:53260,fork,reuseaddr upd4:192.168.2.100
这可以完美地重定向具有正确目标 IP 和 MAC 的数据包,不会出现延迟。
当我尝试以下操作时:
socat – udp4-listen:53260,重用地址| tee >(socat – udp 发送到:192.168.2.100:53260) >(socat - udp 发送到:192.168.2.80:53265)
两个流都可以使用正确的目标 ip/mac,但是流非常不流畅。
我注意到 iptables TEE 和 socat TEE 之间的区别如下:socat TEE 发送一些“碎片 IP 协议(proto=UDP、off=0、ID=3a96)”数据包,据我所知,这些数据包会重新组装 UDP 数据包,因此这些数据包到下一个数据包的延迟约为 15 毫秒,而通常为 1-3 毫秒。
延迟仍然很短暂,但我能想到的它卡顿的唯一原因。
发送和接收的数据包数量大致相同。有什么办法可以解决这个问题吗?
答案1
部分答案:
DNAT 仅在 PREROUTING 链中起作用,因此您需要在 192.168.2.80 的机器上(或在单独的网络命名空间中)执行 DNAT。我不知道为什么会这样,是的,有时这很麻烦。
但我也会质疑你的用例。TEE 非常适合在单独的机器上进行日志记录等,但如果你想将一个数据包拆分成两个具有不同目的地的数据包,那么无论你想在此上运行什么,它都可能很脆弱,很容易崩溃。
存在多播,也存在代理或负载均衡器。
目的是在单播设置上配置摄像机录像机。因此,遗憾的是多播不是一种选择。我还没有读过代理/负载平衡器,这些对我来说是一种选择吗?
(下次请在您的问题中添加此信息 - 始终提供上下文。并查看XY-问题)。
有关socat
将 UDP 单播转换为广播的用法,请参见这个问题。
socat
对于与多播目标一起使用,请参见例如这里。
如果您的接收器无法处理多播,您也可以在socat中执行“tee”操作。
替代方法是使用在流协议级别上运行的东西,例如ffmpeg
。
可能还有更多应用程序可以用作代理,请稍微搜索一下。
最好的选择取决于您的相机使用的协议。