我试图在一台机器上接收多播,将其转发到另一台机器,然后在该机器上重播。
test_env :可以访问原始组播stream的机器 mcast_sender :我试图转发多播并重新组播的机器 结合tcpdump , netcat和tcpreplay我已经尝试了以下内容:
在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
tcpdump – netcatpipe道似乎正在工作。 我已经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 -