È possibile duplicare un flusso unicast UDP con iptables?


8

Ho un sistema proprietario che trasmette un flusso video udp dall'unità n. 1 (192.168.1.1) all'unità n. 2 (.1.2). Non riesco ad apportare modifiche a questo sistema e sto provando a clonare questo flusso udp in modo da poterlo accedere in un altro programma. Questo programma farà cose con il video e lo invierà nuovamente come flusso multicast.

Spero di farlo usando una macchina Linux (che esegue Ubuntu Server 12.04 ora) con tre schede di rete. Collegando l'unità n. 1 e n. 2 a due delle schede di rete (eth0 ed eth1) nella macchina Linux e usando bridge, le faccio comunicare. La mia / etc / network / interfaces assomiglia a:

# 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

Funziona e usando tcpdump ho confermato che i pacchetti udp arrivano dal n. 1 e si dirigono verso il n. 2 alla porta 6000.

Il prossimo passo che spero funzionerà è usare iptables per clonare tutti i pacchetti udp che vanno dalla 192.168.1.1 alla porta 6000 al numero 2. Non ho molta familiarità con iptables, ma dopo aver letto on line e il manuale ho pensato che avrebbe funzionato:

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

La regola viene applicata correttamente, ma non funziona. Se uso tcpdump per monitorare eth3 non vedo i pacchetti lì.

Vorrei prendere questo stream, lavorarci su e inviarlo come multicast sull'interfaccia .10.2.

Che cosa sto facendo di sbagliato? C'è qualcosa che ho frainteso?

Risposte:


4

I pacchetti non raggiungono mai eth3 poiché 192.168.10.2 è la macchina stessa. Anche i pacchetti duplicati hanno ancora l'indirizzo IP di destinazione 192.168.1.2. È necessario TEE su una macchina in 192.168.10.0/24, ad esempio 192.168.10.254 in modo che i duplicati vengano effettivamente instradati su eth3.

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

Quindi devi anche DNAT su 192.168.10.254, in modo da poter leggere lo stream su 192.168.10.254 e inviarlo via multicast.

O sul 192.168.10.254 stesso:

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

O ancora su 192.168.10.2 prima che i pacchetti lascino 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

Se lo capisco correttamente, ciò che hai spiegato avrebbe inviato i pacchetti a una macchina diversa (.10.254). Vorrei evitare questa macchina aggiuntiva e farlo solo internamente su una macchina. Se imposto il gateway su 127.0.0.1, funzionerebbe =?
Håkon K. Olafsen,

Il gateway è solo un passaggio successivo, la destinazione rimane ancora 192.168.1.2 e non è possibile DNAT i pacchetti duplicati sulla macchina "cercandoli". Quindi anche 127.0.0.1 non funzionerà.
Smooth

Quindi non posso fare quello che sto cercando di usare solo una macchina.
Håkon K. Olafsen,

0

Ho avuto un problema simile e l'ho risolto con un piccolo programma che utilizzava libpcap per leggere il contenuto dei pacchetti UDP. Ha inviato copie di questi pacchetti a un'altra destinazione. (Che potrebbe essere sulla stessa macchina.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.