web-dev-qa-db-ja.com

iptablesを介したマルチキャストへのユニキャスト

注:現在受け入れられている回答がありますが、それは一部にすぎません。以下の最終的なiptablesルールを確認してください。

1つのインターフェイスでユニキャストRTPストリームを受信して​​いて、2番目のインターフェイスでマルチキャスト経由で送信したい。問題のシステムはLinuxを実行している組み込みプロセッサですが、見つけています私のUbuntu10.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は送信されるパケットを表示しませんでした。

私は ユニキャストをiptablesを使用してDNAT経由でブロードキャストに変換する方法は? を見ましたが、それはブロードキャストケースの詳細に関係しているようです。

注:設定されている他の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ルールを調整して、意図しないパケットを確実にキャッチしないようにする必要があることに注意してください。これは単純化された例にすぎません。

3

カーネルでIPフォワードを有効にしていますか?

# 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に戻すことができます。

編集:

networking/ip-sysctl.txtから:

マルチキャストルーティングを有効にするには、conf/all/mc_forwardingもTRUEに設定する必要があります

5
poisonbit

ルーティングテーブルを操作して、パケットをNAT処理した後、正しいインターフェイスに送信されるようにする必要があります。

ip route add to $MULTICAST_ADDR dev $MULTICAST_IFACE

着信インターフェイスを介してマルチキャストを送信すると問題が発生する可能性があるため、パケットにマークを付ける必要があります

iptables -t mangle <rules to match the packets you want to multicast> -j MARK --mark <your favorite number>
ip rule add order 10 fwmark <that favorite number> lookup table <another favorite number>
ip route add to <multicast> dev <iface> table <2nd fav number>

最後に、conntrackが戻りパケットと一致しないことを理解する必要があります。あなた自身のconntrackを行う必要があります。

iptables -t nat -A POSTROUTING -d <multicast> -o <iface> -j SNAT <router's IP>:<a port>
iptables -t nat -A PREROUTING -i <router's IP> -p udp --dport <a port> -j DNAT <orig sender>:<orig port>

そこで、あなたがやりたいことをする一般的な方法。私の(限られた)説明があなたを正しい道に導くことができることを願っています。

1
pepoluan

特別なデーモンを使用する必要があるようです-igmpproxyまたはmroutedを見てください-iptablesは単に着信パケットをoneアドレス/ポートの組み合わせに変換して転送するため与えられた範囲内。

1
alexm

このカーネルモジュールは、ユニキャストパケットを盗むために、事前ルーティングチェーンに新しいnetfilterフックを作成し、「utomu」によって設定されたルールに基づいてマルチキャストパケットとして送信します。

torの例:着信ユニキャストセッションインターフェイスは「eth0」、発信マルチキャストセッションインターフェイスは「eth1」です。次に設定します

echo "eth0">/proc/sys/net/utom/in_ifname

echo "eth1">/proc/sys/net/utom/out_ifname

ユニキャストソースIPが「192.168.56.5」であり、それをマルチキャスト「225.1.2.3」に変換する場合、ルールを次のように設定します。

utomu -m 225.1.2.3 -a 192.168.56.5 -s 1194 -d 1194

送信元ポートと宛先ポートも変更されます。

ソース@ https://github.com/ravi-eticala/unicast-to-multicast

0
user2133204