¿Es posible duplicar una secuencia de unidifusión UDP con iptables?

8

Tengo un sistema propietario que transmite una transmisión de video udp desde la unidad n. ° 1 (192.168.1.1) a la unidad n. ° 2 (.1.2). No puedo hacer cambios en este sistema, y ​​estoy tratando de clonar este flujo de udp para poder acceder a él en un programa diferente. Este programa hará cosas con el video y lo enviará nuevamente como una transmisión de multidifusión.

Espero hacer esto usando una máquina Linux (ejecutando Ubuntu Server 12.04 ahora) con tres tarjetas de red. Al conectar la unidad n. ° 1 y n. ° 2 a dos de las tarjetas de red (eth0 y eth1) en la máquina Linux y usar bridge, las tengo comunicando. Mi / etc / network / interfaces se ve así:

# 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

Esto funciona, y al usar tcpdump, he confirmado que los paquetes udp están llegando desde el # 1 y se dirigen hacia el # 2 en el puerto 6000.

El siguiente paso que espero que funcione es usar iptables para clonar todos los paquetes udp que vienen desde 192.168.1.1 que van al puerto 6000 en el n. ° 2. No estoy muy familiarizado con iptables, pero después de leer en línea y el manual pensé que esto funcionaría:

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

La regla se aplica con éxito, pero no funciona. Si uso tcpdump para monitorear eth3, no veo los paquetes allí.

Me gustaría tomar esta secuencia, trabajar en ella y enviarla como multidifusión en la interfaz .10.2.

¿Qué estoy haciendo mal? ¿Hay algo que haya entendido mal?

Håkon K. Olafsen
fuente

Respuestas:

4

Los paquetes nunca alcanzan eth3 ya que 192.168.10.2 es la máquina misma. Además, los paquetes duplicados todavía tienen la dirección IP de destino 192.168.1.2. Debe TEE a una máquina en 192.168.10.0/24 por ejemplo 192.168.10.254 para que los duplicados realmente se enruten sobre eth3.

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

Entonces también necesita DNAT a 192.168.10.254, para que pueda leer la transmisión en 192.168.10.254 y enviarla a través de multidifusión.

Ya sea en 192.168.10.254 en sí:

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

O aún en 192.168.10.2 antes de que los paquetes salgan de 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
fuente
Si entiendo esto correctamente, lo que ha explicado enviaría los paquetes a una máquina diferente (.10.254). Me gustaría evitar esta máquina adicional, y solo hacer esto internamente en una máquina. Si configuro la puerta de enlace a 127.0.0.1, ¿funcionaría eso =?
Håkon K. Olafsen
La puerta de enlace es solo el siguiente salto, el destino sigue siendo 192.168.1.2 y no puede DNAT los paquetes duplicados en la máquina "empalmados". Entonces 127.0.0.1 tampoco funcionará.
lsmooth
Así que no puedo hacer lo que estoy tratando de usar con una sola máquina.
Håkon K. Olafsen
0

Tuve un problema similar y lo resolví con un pequeño programa que usaba libpcap para leer el contenido de los paquetes UDP. Envió copias de estos paquetes a otro destino. (Que podría estar en la misma máquina).

fadedbee
fuente