ユニット#1(192.168.1.1)からユニット#2(.1.2)にudpビデオストリームを送信する独自のシステムがあります。このシステムに変更を加えることはできません。別のプログラムでアクセスできるように、このudpストリームを複製しようとしています。このプログラムはビデオを処理し、マルチキャストストリームとして再度送信します。
3つのネットワークカードを備えたLinuxマシン(Ubuntu Server 12.04を実行中)を使用してこれを実行したいと思っています。ユニット#1と#2をLinuxマシンの2つのネットワークカード(eth0とeth1)に接続し、ブリッジを使用して、それらを通信させます。私の/ etc/network/interfacesは次のようになります:
# The loopback network interface
auto lo
iface lo inet loopback
# The external interface
auto eth3
iface eth3 inet static
address 192.168.10.2
netmask 255.255.255.0
# The bridge interface
auto br0
iface br0 inet manual
bridge_ports eth0 eth1
これは機能し、tcpdumpを使用して、udpパケットが#1から到着し、ポート6000で#2に向かっていることを確認しました。
次のステップとして、iptablesを使用して、192.168.1.1からポート6000の#2に送信されるすべてのudpパケットを複製します。私はiptablesにはあまり詳しくありませんが、オンラインとマニュアルを読んだ後、これはうまくいくと思いました:
iptables -A PREROUTING -t mangle -p udp -s 192.168.1.1/32 --dport 6000 -j TEE --gateway 192.168.10.2
ルールは正常に適用されましたが、機能しません。 tcpdumpを使用してeth3を監視すると、そこにパケットが表示されません。
このストリームを取得して処理し、.10.2インターフェースでマルチキャストとして送信します。
何が悪いのですか?誤解したことがありますか?
192.168.10.2はマシン自体であるため、パケットはeth3に到達しません。また、複製されたパケットには、宛先IPアドレス192.168.1.2がまだあります。重複が実際にeth3経由でルーティングされるように、それらを192.168.10.0/24のマシン(たとえば、192.168.10.254)にTEEする必要があります。
iptables -t mangle -A PREROUTING -p udp --dport 6000 -j TEE --gateway 192.168.10.254
次に、それらを192.168.10.254にDNATして、192.168.10.254でストリームを読み取り、マルチキャストで送信できるようにする必要もあります。
192.168.10.254自体のいずれか:
iptables -t nat -A PREROUTING -p udp -d 192.168.1.2 --dport 6000 -j DNAT --to-destination 192.168.10.254:6000
または、パケットがeth3を出る前に、192.168.10.2のままにします。
iptables -t nat -A POSTROUTING -o eth3 -p udp -d 192.168.1.2 --dport 6000 -j DNAT --to-destination 192.168.10.254:6000
同様の問題があり、libpcapを使用してUDPパケットの内容を読み取る小さなプログラムで解決しました。これらのパケットのコピーを別の宛先に送信しました。 (同じマシン上にある可能性があります。)