使用 socat 轉儲多播 UDP 流
我正在設置影片流。
在本地網路中,有兩個設備通過 UDP 多播傳輸影片。一台是普通的 Linux 電腦(串流到 239.220.221.10,埠 9200),第二個是特殊的 DVB-S 串流器(串流到 239.220.220.32,埠 9200)。網路中有幾個 IPTV 機頂盒,它們能夠播放來自任一來源的流。還有一些用於多播過濾的 Cisco 交換機,但我無法檢查它們的配置。
在不同的電腦上(執行 Ubuntu 12.04)我想擷取流,最好使用 VLC 或 FFMPEG。從電腦流媒體(239.220.221.10)它可以工作,但從特殊流媒體(239.220.220.32)我沒有流。
我試過的
我試圖縮小問題範圍,並嘗試使用 socat 和 tcpdump 擷取原始 UDP 數據報。如果我執行以下命令,我會在 video.dump 文件中獲得有效影片:
> socat UDP4-RECVFROM:9200,ip-add-membership=239.220.221.10:0.0.0.0 - > video.dump
當我同時執行 tcpdump 時,我看到傳入的數據報:
> sudo tcpdump -i eth1 18:00:39.059824 IP 10.1.2.202.41852 > 239.220.221.10.9200: UDP, length 1316 18:00:39.060789 IP 10.1.2.202.41852 > 239.220.221.10.9200: UDP, length 1316 ...
當我嘗試為特殊流媒體執行相同的命令時(只需將 socat 的 IP 成員地址更改為 239.220.220.32),tcpdump 顯示來自 239.220.220.32 的傳入數據報,但 video.dump 文件為空。
socat
看不到明顯即將到來的數據報的原因是什麼?2014 年 3 月 4 日更新:
我剛剛發現網路中有不同的IP範圍:
Computer streamer: 10.1.2.202 / 255.0.0.0 "Special" streamer: 192.168.85.5 / 255.255.255.0 Computer on which I am trying to grab stream: 10.1.2.203 / 255.0.0.0
當我將最後一個 IP 地址更改為 192.168.85.x / 255.255.255.0 時,我可以從“特殊”流媒體中擷取流,但不能從電腦流中擷取。
所以問題變成了:是否可以設置 socat、VLC 或 FFMPEG 來接受源地址超出乙太網介面範圍的多播流?
不帶 -p 呼叫的 tcpdump 將 NIC 切換到混雜模式 - 顯然一些更高級別的過濾啟動,阻止 socat 接收流量。
“通常有罪”的嫌疑人之一是 rp_filter - 您是否有通過 eth1 的兩個源網路的路由?我猜你可能通過 eth0 有預設的 gw。添加缺少的路由,或禁用 eth1 介面上的 rp_filter。
在 OP 情況下:
ip r a 192.168.85.0/24 dev eth1
或者
sysctl -w net.ipv4.conf.eth1.rp_filter=0