如何隧道组播stream量?

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

  • test_env :可以访问原始组播stream的机器
  • 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 

我现在可以在pcap文件上运行tail ,并将其pipe理到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 

我的问题:

tcpdumpnetcatpipe道似乎正在工作。 我已经validation了我正在mcast_sender上写入一个文件。

但是,当我尝试运行tcpreplay时,我得到一个错误:

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

问题:

  • 是否有可能做我在这里尝试的?
  • 为什么写在mcast_sender上的文件无效?
  • 有没有更好的方法来实现我在这里要做的事情?

这是行不通的,因为你需要设置tcpdump的stdout被行缓冲

man tcpdump

 -l Make stdout line buffered. Useful if you want to see the data while capturing it. Eg tcpdump -l | tee dat tcpdump -l > dat & tail -f dat 

您也可以通过将tcpdump的输出直接input到tcpreplay取消中间文件和netcat

这是通过在ssh会话上运行tcpdump ,将输出转储到stdout,然后将其输出到tcpreplay stdin来实现的:

通过ssh会话运行命令:

 $ ssh remote_server "command" 

运行tcpdump并输出到stdout,线路缓冲:

 $ sudo tcpdump ... -l -w - 

从标准input读取tcpreplay读数:

 $ sudo tcpreplay ... - 

把它放在一起:

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