Можно ли дублировать одноадресный поток UDP с iptables?

8

У меня есть патентованная система, которая передает видеопоток udp с устройства № 1 (192.168.1.1) на устройство № 2 (.1.2). Я не могу внести изменения в эту систему, и я пытаюсь клонировать этот поток udp, чтобы получить доступ к нему в другой программе. Эта программа будет делать материал с видео и отправлять его снова как многоадресный поток.

Я надеюсь сделать это с помощью Linux-машины (сейчас работает Ubuntu Server 12.04) с тремя сетевыми картами. Подключив модуль № 1 и № 2 к двум сетевым картам (eth0 и eth1) на компьютере с Linux и используя мост, я получил их связь. Мой / etc / network / interfaces выглядит так:

# 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

Это работает, и с помощью tcpdump я подтвердил, что пакеты udp прибывают из # 1 и направляются в # 2 на порт 6000.

Следующим шагом, который, я надеюсь, будет работать, является использование iptables для клонирования всех пакетов udp, поступающих с 192.168.1.1, идущих на порт 6000 в # 2. Я не очень знаком с iptables, но после прочтения и руководства я подумал, что это сработает:

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

Правило применяется успешно, но оно не работает. Если я использую tcpdump для мониторинга eth3, я не вижу там пакетов.

Я хотел бы захватить этот поток, поработать над ним и отправить его как многоадресную рассылку по интерфейсу .10.2.

Что я делаю неправильно? Есть что-то, что я неправильно понял?

Хокон К. Олафсен
источник

Ответы:

4

Пакеты никогда не достигают eth3, поскольку 192.168.10.2 является самой машиной. Кроме того, дублированные пакеты по-прежнему имеют IP-адрес назначения 192.168.1.2. Вам нужно подключить их к машине в 192.168.10.0/24, например, 192.168.10.254, чтобы дубликаты фактически передавались через eth3.

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

Затем вам также нужно DNAT их к 192.168.10.254, чтобы вы могли прочитать поток на 192.168.10.254 и отправить его через многоадресную рассылку.

Либо на самом 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

Или до 192.168.10.2 до того, как пакеты покинут 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
источник
Если я правильно понимаю, то, что вы объяснили, отправит пакеты на другой компьютер (.10.254). Я хотел бы избежать этой дополнительной машины, и просто сделать это внутренне на одной машине. Если я установлю шлюз на 127.0.0.1, это будет работать =?
Хакон К. Олафсен,
Шлюз - это всего лишь следующий переход, пункт назначения по-прежнему остается 192.168.1.2, и вы не можете DNAT дублировать пакеты на машине, «разделяющей» их. Так что 127.0.0.1 тоже не будет работать.
2013 года
Поэтому я не могу делать то, что пытаюсь использовать только одну машину.
Хакон К. Олафсен
0

У меня была похожая проблема, и я решил ее с помощью небольшой программы, которая использовала libpcap для чтения содержимого пакетов UDP. Он отправил копии этих пакетов в другое место назначения. (Который может быть на той же машине.)

fadedbee
источник