Iptables

通過 iptables 單播到多播

  • April 5, 2013

**注意:**雖然現在有一個公認的答案,但這只是一部分;檢查下面的最終 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 以啟用多播路由

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