É possível duplicar um fluxo unicast UDP com iptables?

8

Eu tenho um sistema proprietário que transmite um fluxo de vídeo udp da unidade 1 (192.168.1.1) para a unidade 2 (.1.2). Não posso fazer alterações neste sistema e estou tentando clonar esse fluxo udp para acessá-lo em um programa diferente. Este programa fará coisas com o vídeo e o enviará novamente como um fluxo multicast.

Espero fazer isso usando uma máquina Linux (executando o Ubuntu Server 12.04 agora) com três placas de rede. Ao conectar as unidades 1 e 2 a duas das placas de rede (eth0 e eth1) na máquina Linux e usar bridge, eu as comunico. Meu / etc / network / interfaces é parecido com:

# 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

Isso funciona e, usando o tcpdump, confirmei que os pacotes udp estão chegando do ponto 1 e estão indo para o ponto 2 na porta 6000.

O próximo passo que espero que funcione é usar o iptables para clonar todos os pacotes udp que vêm de 192.168.1.1 e vão para a porta 6000 na segunda posição. Eu não estou muito familiarizado com o iptables, mas depois de ler on-line e o manual, pensei que isso funcionaria:

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

A regra é aplicada com sucesso, mas não funciona. Se eu usar o tcpdump para monitorar o eth3, não vejo os pacotes lá.

Eu gostaria de pegar esse fluxo, trabalhar nele e enviá-lo como um multicast na interface .10.2.

O que estou fazendo errado? Existe algo que eu não entendi?

Håkon K. Olafsen
fonte

Respostas:

4

Os pacotes nunca chegam ao eth3, pois 192.168.10.2 é a própria máquina. Além disso, os pacotes duplicados ainda têm o endereço IP de destino 192.168.1.2. Você precisa conectá-los a uma máquina em 192.168.10.0/24, por exemplo, 192.168.10.254, para que as duplicatas sejam roteadas pelo eth3.

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

Também é necessário DNAT-los para 192.168.10.254, para que você possa ler o fluxo em 192.168.10.254 e enviá-lo por multicast.

No próprio 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

Ou ainda em 192.168.10.2 antes dos pacotes saírem do 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
fonte
Se eu entendi direito, o que você explicou enviaria os pacotes para uma máquina diferente (.10.254). Gostaria de evitar essa máquina extra e fazer isso internamente em uma máquina. Se eu definir o gateway como 127.0.0.1, isso funcionaria =?
Håkon K. Olafsen 23/02
O gateway é apenas um salto seguinte, o destino ainda permanece 192.168.1.2 e você não pode DNAT os pacotes duplicados na máquina "teeing" eles. Portanto, 127.0.0.1 também não funcionará.
Lsmooth
Portanto, não posso fazer o que estou tentando usar apenas uma máquina.
Håkon K. Olafsen,
0

Eu tive um problema semelhante e o resolvi com um pequeno programa que usava libpcap para ler o conteúdo dos pacotes UDP. Ele enviou cópias desses pacotes para outro destino. (Que pode estar na mesma máquina.)

fadedbee
fonte