Tcpdump

如何隧道多播流量?

  • August 7, 2017

我正在嘗試在一台機器上接收多播,將其轉發到另一台機器,然後在該機器上重播。

  • test_env:可以訪問原始多播流的機器
  • mcast_sender:我試圖將多播轉發到並重新多播的機器

到目前為止我已經嘗試過:

結合tcpdump,我嘗試了以下方法netcattcpreplay

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

我的問題:

-管道似乎正在工作tcpdumpnetcat我已經驗證我正在寫一個文件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 -

引用自:https://serverfault.com/questions/866138