Ist es möglich, einen UDP-Unicast-Stream mit iptables zu duplizieren?

8

Ich habe ein proprietäres System, das einen udp-Videostream von Einheit 1 (192.168.1.1) zu Einheit 2 (.1.2) überträgt. Ich kann keine Änderungen an diesem System vornehmen und versuche, diesen udp-Stream zu klonen, damit ich in einem anderen Programm darauf zugreifen kann. Dieses Programm macht Sachen mit dem Video und sendet es erneut als Multicast-Stream.

Ich hoffe, dies mit einem Linux-Computer (auf dem Ubuntu Server 12.04 jetzt ausgeführt wird) mit drei Netzwerkkarten zu tun. Indem ich die Einheiten 1 und 2 mit zwei der Netzwerkkarten (eth0 und eth1) auf dem Linux-Computer verbinde und Bridge verwende, können sie miteinander kommunizieren. Meine / etc / network / interfaces sieht folgendermaßen aus:

# 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

Dies funktioniert, und durch die Verwendung von tcpdump habe ich bestätigt, dass die udp-Pakete von # 1 ankommen und an Port 6000 in Richtung # 2 gehen.

Der nächste Schritt, von dem ich hoffe, dass er funktioniert, ist die Verwendung von iptables, um alle udp-Pakete zu klonen, die von 192.168.1.1 an Port 6000 auf # 2 kommen. Ich bin mit iptables nicht sehr vertraut, aber nachdem ich online und im Handbuch gelesen hatte, dachte ich, dass dies funktionieren würde:

iptables -A PREROUTING -t mangle -p udp -s 192.168.1.1/32 --dport 6000 -j TEE --gateway 192.168.10.2

Die Regel wird erfolgreich angewendet, funktioniert aber nicht. Wenn ich tcpdump zur Überwachung von eth3 verwende, werden die Pakete dort nicht angezeigt.

Ich möchte diesen Stream abrufen, daran arbeiten und ihn als Multicast auf der .10.2-Schnittstelle senden.

Was mache ich falsch? Gibt es etwas, das ich missverstanden habe?

Håkon K. Olafsen
quelle

Antworten:

4

Die Pakete erreichen niemals eth3, da 192.168.10.2 die Maschine selbst ist. Auch die duplizierten Pakete haben noch die Ziel-IP-Adresse 192.168.1.2. Sie müssen sie in 192.168.10.0/24 an einen Computer senden, z. B. 192.168.10.254, damit die Duplikate tatsächlich über eth3 geleitet werden.

iptables -t mangle -A PREROUTING -p udp --dport 6000 -j TEE --gateway 192.168.10.254

Dann müssen Sie sie auch auf 192.168.10.254 DNAT, damit Sie den Stream auf 192.168.10.254 lesen und per Multicasting senden können.

Entweder am 192.168.10.254 selbst:

iptables -t nat -A PREROUTING -p udp -d 192.168.1.2 --dport 6000 -j DNAT --to-destination 192.168.10.254:6000

Oder noch am 192.168.10.2, bevor die Pakete eth3 verlassen:

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
lsmooth
quelle
Wenn ich das richtig verstehe, würde das, was Sie erklärt haben, die Pakete an einen anderen Computer senden (.10.254). Ich möchte diese zusätzliche Maschine vermeiden und dies nur intern auf einer Maschine tun. Wenn ich das Gateway auf 127.0.0.1 setze, würde das funktionieren =?
Håkon K. Olafsen
Das Gateway ist nur ein nächster Sprung, das Ziel bleibt noch 192.168.1.2 und Sie können die duplizierten Pakete auf dem Computer, der sie "abschlägt", nicht DNAT. 127.0.0.1 funktioniert also auch nicht.
lsmooth
Ich kann also nicht das tun, was ich versuche, nur eine Maschine zu verwenden.
Håkon K. Olafsen
0

Ich hatte ein ähnliches Problem und löste es mit einem kleinen Programm, das libpcap verwendete, um den Inhalt der UDP-Pakete zu lesen. Es wurden Kopien dieser Pakete an ein anderes Ziel gesendet. (Welches könnte auf der gleichen Maschine sein.)

Fadedbee
quelle