如何通过隧道传输多播流量?

如何通过隧道传输多播流量?

我尝试在一台机器上接收多播,将其转发到另一台机器,然后在该机器上重播它。

  • test_env:可以访问原始多播流的机器
  • mcast_sender:我尝试将多播转发到该机器并重新从该机器进行多播

到目前为止我已经尝试过:

结合tcpdumpnetcattcpreplay尝试了以下操作:

test_env

我有一个执行 IGMP 加入的 Python 脚本,它永远坐在那里,从套接字读取并丢弃数据(只是保持套接字打开)

$ ./mcast_sub INADDR_ANY 239.194.5.1 21001 &

现在,有问题的接口将接收多播数据,因此我可以运行tcp_dump

$ sudo tcpdump -i eth5 host 239.194.5.1 > /tmp/capture.pcap

我现在可以运行tailpcap 文件,并将其传输到netcat

$ tail -f /tmp/capture.pcap -n+1 | nc -l 12345

mcast_sender

然后mcast_sender我可以从 netcat 端口接收这些数据,并将其转储到本地文件中:

$ nc test_env 12345 > /tmp/capture.pcap

然后tcpreplay我可以读取捕获文件mcast_sender并重放它

$ sudo tcpreplay --intf1=eth8 /tmp/capture.pcap

我的问题:

tcpdump-管道netcat似乎正在运行。我已确认我正在写入文件mcast_sender

但是,当我尝试运行tcpreplay它时,出现错误:

$ sudo tcpreplay --intf1=eth8 /tmp/capture.pcap
Failed: Error opening pcap file: unknown file format

问题:

  • 我在这里尝试的事情可以实现吗?
  • 为什么写入的文件mcast_sender无效?
  • 有没有更好的方法来实现我在这里尝试做的事情?

答案1

这不起作用,因为你需要将 tcpdump 的标准输出设置为行缓冲

man tcpdump

-l     Make stdout line buffered.  
         Useful if you want to see the data while capturing it.  

       E.g.
            tcpdump -l | tee dat 
            tcpdump -l > dat & tail -f dat

您还可以省去中间文件,netcat通过将输出tcpdump直接传输到tcpreplay

这是通过tcpdump在 ssh 会话上运行、将输出转储到 stdout 并通过管道传输到 stdin 来实现的tcpreplay

通过 ssh 会话运行命令:

$ ssh remote_server "command"

运行tcpdump并输出到标准输出,行缓冲:

$ sudo tcpdump ... -l -w -

tcpreplay从标准输入运行读取:

$ sudo tcpreplay ... -

综合起来:

$ ssh test_env "sudo tcpdump -i eth5 host 239.194.5.1 -l -w -" | 
    sudo tcpreplay --intf1=eth8 -

相关内容