Est-il possible de dupliquer un flux unicast UDP avec iptables?

8

J'ai un système propriétaire qui transmet un flux vidéo udp de l'unité n ° 1 (192.168.1.1) à l'unité n ° 2 (.1.2). Je ne peux pas apporter de modifications à ce système et j'essaie de cloner ce flux udp afin de pouvoir y accéder dans un autre programme. Ce programme fera des trucs avec la vidéo et la renverra sous forme de flux multicast.

J'espère faire cela en utilisant une machine Linux (exécutant maintenant Ubuntu Server 12.04) avec trois cartes réseau. En connectant les unités # 1 et # 2 à deux des cartes réseau (eth0 et eth1) dans la machine Linux et en utilisant bridge, je les fais communiquer. Mon / etc / network / interfaces ressemble à:

# 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

Cela fonctionne, et en utilisant tcpdump, j'ai confirmé que les paquets udp arrivent de # 1 et se dirigent vers # 2 au port 6000.

La prochaine étape, je l'espère, fonctionnera consiste à utiliser iptables pour cloner tous les paquets udp provenant de 192.168.1.1 vers le port 6000 au # 2. Je ne suis pas très familier avec iptables, mais après avoir lu en ligne et le manuel, j'ai pensé que cela fonctionnerait:

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

La règle est appliquée avec succès, mais cela ne fonctionne pas. Si j'utilise tcpdump pour surveiller eth3, je n'y vois pas les paquets.

Je voudrais saisir ce flux, travailler dessus et l'envoyer en multidiffusion sur l'interface .10.2.

Qu'est-ce que je fais mal? Y a-t-il quelque chose que j'ai mal compris?

Håkon K. Olafsen
la source

Réponses:

4

Les paquets n'atteignent jamais eth3 car 192.168.10.2 est la machine elle-même. De plus, les paquets dupliqués ont toujours l'adresse IP de destination 192.168.1.2. Vous devez les TEE sur une machine dans 192.168.10.0/24 par exemple 192.168.10.254 pour que les doublons soient réellement acheminés via eth3.

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

Ensuite, vous devez également les DNAT au 192.168.10.254, afin que vous puissiez lire le flux sur 192.168.10.254 et l'envoyer par multidiffusion.

Soit sur 192.168.10.254 lui-même:

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

Ou encore sur 192.168.10.2 avant que les paquets ne quittent eth3:

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
la source
Si je comprends bien, ce que vous avez expliqué enverrait les paquets vers une autre machine (.10.254). Je voudrais éviter cette machine supplémentaire et le faire en interne sur une seule machine. Si je règle la passerelle sur 127.0.0.1, est-ce que cela fonctionnerait =?
Håkon K. Olafsen
La passerelle n'est qu'un saut suivant, la destination reste toujours 192.168.1.2 et vous n'êtes pas en mesure de DNAT les paquets dupliqués sur la machine les "té". Donc, 127.0.0.1 ne fonctionnera pas non plus.
lsmooth
Je ne peux donc pas faire ce que j'essaie d'utiliser avec une seule machine.
Håkon K. Olafsen
0

J'ai eu un problème similaire et l'ai résolu avec un petit programme qui utilisait libpcap pour lire le contenu des paquets UDP. Il a envoyé des copies de ces paquets à une autre destination. (Qui pourrait être sur la même machine.)

fadedbee
la source