Tcpdump
如何隧道多播流量?
我正在嘗試在一台機器上接收多播,將其轉發到另一台機器,然後在該機器上重播。
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
無效?- 有沒有更好的方法來實現我在這裡想要做的事情?
這不起作用,因為您需要將 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 -