通過 iptables 單播到多播
**注意:**雖然現在有一個公認的答案,但這只是一部分;檢查下面的最終 iptables 規則。
我在一個介面上接收到單播 RTP 流,並希望通過第二個介面上的多播將其發送出去。有問題的系統是一個執行 Linux 的嵌入式處理器,但我發現在我的 Ubuntu 10.10 主機上設置同樣困難。基於http://lists.netfilter.org/pipermail/netfilter/2002-October/038890.html和其他來源的簡單而明顯的答案似乎是:
iptables -t nat -A PREROUTING -i [unicast-interface] -p udp --dport [unicast-incoming-port] -j DNAT --to-destination [multicast-addr]:[multicast-port]
一些額外的研究導致了這種配對:
iptables -t nat -A PREROUTING -i [unicast-interface] -p udp --dport [unicast-incoming-port] -j DNAT --to-destination [multicast-addr]:[multicast-port] iptables -A FORWARD -i [unicast-interface] -o [multicast-interface] -p udp --dport [unicast-incoming-port] -j ACCEPT
雖然規則在列出時顯示,並且 tcpdump 顯示單播數據包進來,但單獨機器上的 Wireshark 顯示沒有數據包出去。
我看了How to translate unicast to broadcast via DNAT with iptables? 但這似乎與廣播案的細節有關。
注意:沒有設置其他 iptables 規則。我已經使用 iptables -L(和 -t nat -L)和 iptables –flush 進行了仔細檢查。
(我意識到還有其他選擇,比如
socat
- 但在我切換到它們之前,我想確保我沒有遺漏任何東西。)**編輯:**我確實啟用了 ip_forward。
~ # sysctl -a 2>&1 |grep ip_forward net.ipv4.ip_forward = 1
**編輯:**看起來我的 NAT 表(
iptables -t nat -L -v -n
)中的數據包數量增加了,但主/過濾器表(iptables -L -v -n
)中沒有**編輯:**趕上了嘗試的事情,我沒有成功。我見過一些人與思科合作的過程類似,例如在這個網站上:http ://www.penrod.cc/?p=527
似乎這確實在某個時間點起作用,但從那以後,無論是在原始嵌入式主機上還是在 Linux 工作站上,我都無法使其工作。
**編輯:**事實證明,這個問題又出現了。
完全有效的最終解決方案:
獲取 smcroute(正在執行的靜態多播路由守護程序)。如果您在嵌入式系統中,您可能需要使用
smcroute -d
smcroute -a [unicast-interface] [source-ip] [multicast-addr] [multicast-interface] iptables -t nat -A PREROUTING -p UDP -d [unicast-interface-ip] -j NETMAP --to [multicast-addr]
例如:
smcroute -a eth0 192.168.0.101 239.1.1.1 eth0 iptables -t nat -A PREROUTING -p UDP -d 192.168.0.1 -j NETMAP --to 239.1.1.1
請注意,您可能需要改進 iptables 規則以確保您不會擷取您不想要的數據包——這只是一個簡化的範例。
你在核心上啟用了 ip forward 嗎?
# sysctl -a 2>&1 | grep ip_forward net.ipv4.ip_forward=1
您需要它將流量從一個介面傳遞到另一個介面(又名 FORWARD 表規則)。
編輯:
還有其他 sysctl 設置,我懷疑這將是相關的:
net.ipv4.conf.all.mc_forwarding
和每個介面,以及 ipv6。
那個“mc”確實聽起來很適合多播,但我手頭沒有核心文件可以 100% 確定。
嘗試設置為 1,如果始終無效,您可以返回預設值 0。
編輯:
來自網路/ip-sysctl.txt:
conf/all/mc_forwarding 也必須設置為 TRUE 以啟用多播路由