¿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?

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

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).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.