我尝试在一台机器上接收多播,将其转发到另一台机器,然后在该机器上重播它。
test_env
:可以访问原始多播流的机器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
我现在可以运行tail
pcap 文件,并将其传输到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 -