Назад | Перейти на главную страницу

Одноадресная передача в многоадресную рассылку через iptables

Примечание: Хотя сейчас есть принятый ответ, это только часть; проверьте последнее правило iptables ниже.

Я получаю одноадресный поток RTP на одном интерфейсе и хочу отправить его через многоадресную рассылку на второй интерфейс. Рассматриваемая система представляет собой встроенный процессор под управлением Linux, но мне одинаково сложно настроить его на моем хосте Ubuntu 10.10. Простой и очевидный ответ, основанный на http://lists.netfilter.org/pipermail/netfilter/2002-October/038890.html и другие источники, похоже:

iptables -t nat -A PREROUTING -i [unicast-interface] -p udp --dport [unicast-incoming-port] -j DNAT --to-destination [multicast-addr]:[multicast-port]

Небольшое дополнительное исследование привело к этому соединению:

iptables -t nat -A PREROUTING -i [unicast-interface] -p udp --dport [unicast-incoming-port] -j DNAT --to-destination [multicast-addr]:[multicast-port]
iptables -A FORWARD -i [unicast-interface] -o [multicast-interface] -p udp --dport [unicast-incoming-port] -j ACCEPT

Хотя правила отображаются в списке, а tcpdump показывает входящие одноадресные пакеты, Wireshark на отдельной машине не показывал исходящих пакетов.

я смотрел на Как с помощью iptables перевести одноадресную рассылку в трансляцию через DNAT? но это, похоже, связано с особенностями трансляции.

Примечание: других правил iptables не задано. Я дважды проверил, используя iptables -L (и -t nat -L) и iptables --flush.

(Я понимаю, что есть и другие варианты, например socat - но прежде чем переключиться на них, я хотел бы убедиться, что что-то не упускаю.)

Редактировать: У меня включен ip_forward.

~ # sysctl -a 2>&1 |grep ip_forward
net.ipv4.ip_forward = 1

Редактировать: Похоже, у меня увеличивается количество пакетов в таблице NAT (iptables -t nat -L -v -n), но не в основной таблице / таблице фильтров (iptables -L -v -n)

Редактировать: Попробовав что-то, я не добился успеха. Я видел, как некоторые люди используют аналогичный процесс для работы с Cisco, например, на этом сайте: http://www.penrod.cc/?p=527

Казалось, что это сработало один момент времени но с тех пор я не смог заставить его работать ни на исходном встроенном хосте, ни на рабочей станции Linux.

Редактировать: Как оказалось, эта проблема возникла снова.

Окончательное решение, которое сработало в полной мере:

Получите smcroute (запущен демон статического многоадресного маршрута). Если вы используете встроенную систему, вам может потребоваться smcroute -d

smcroute -a [unicast-interface] [source-ip] [multicast-addr] [multicast-interface]
iptables -t nat -A PREROUTING -p UDP -d [unicast-interface-ip] -j NETMAP --to [multicast-addr]

Например:

smcroute -a eth0 192.168.0.101 239.1.1.1 eth0
iptables -t nat -A PREROUTING -p UDP -d 192.168.0.1 -j NETMAP --to 239.1.1.1

Обратите внимание, что вам может потребоваться уточнить правило iptables, чтобы гарантировать, что вы не перехватываете пакеты, которые не собираетесь использовать - это просто упрощенный пример.

У вас включен ip forward в ядре?

# sysctl -a 2>&1 | grep ip_forward
net.ipv4.ip_forward=1

Он необходим для передачи трафика от одного интерфейса к другому (также известного как правила таблицы FORWARD).

Редактировать:

Есть другой параметр sysctl, который, как я подозреваю, будет связан:

net.ipv4.conf.all.mc_forwarding

и на интерфейс, и на ipv6.

Это «mc» действительно звучит для многоадресной рассылки, но у меня нет под рукой документации по ядру, чтобы быть уверенным на 100%.

Попробуйте установить значение 1, если не работает всегда, вы можете вернуться к значению по умолчанию 0.

Редактировать:

из сети / ip-sysctl.txt:

conf / all / mc_forwarding также необходимо установить значение TRUE для включения многоадресной маршрутизации.

Вам необходимо управлять таблицей маршрутизации, чтобы после преобразования пакета через NAT он отправлял правильный интерфейс.

ip route add to $MULTICAST_ADDR dev $MULTICAST_IFACE

Это может вызвать проблемы, если вы отправляете многоадресные рассылки через входящий интерфейс, поэтому мы должны пометить пакеты.

iptables -t mangle <rules to match the packets you want to multicast> -j MARK --mark <your favorite number>
ip rule add order 10 fwmark <that favorite number> lookup table <another favorite number>
ip route add to <multicast> dev <iface> table <2nd fav number>

Наконец, вы должны понять, что conntrack не сможет сопоставить возвращаемые пакеты; вы должны сделать свой собственный трек:

iptables -t nat -A POSTROUTING -d <multicast> -o <iface> -j SNAT <router's IP>:<a port>
iptables -t nat -A PREROUTING -i <router's IP> -p udp --dport <a port> -j DNAT <orig sender>:<orig port>

Вот общий способ делать то, что хочешь. Я надеюсь, что мое (ограниченное) объяснение может направить вас на правильный путь.

Похоже, придется использовать специальный демон - посмотрите igmpproxy или mrouted - поскольку iptables просто переводит и перенаправляет входящий пакет в один комбинация адресов / портов в заданном диапазоне.

Этот модуль ядра создает новый перехватчик netfilter в цепочке предварительной маршрутизации для кражи одноадресных пакетов и отправляет их как многоадресный пакет на основе правила, установленного "utomu".

Например: интерфейс входящего одноадресного сеанса - «eth0», а интерфейс исходящего многоадресного сеанса - «eth1». Затем установите

эхо "eth0"> / proc / sys / net / utom / in_ifname

эхо "eth1"> / proc / sys / net / utom / out_ifname

предположим, что IP-адрес источника одноадресной рассылки - «192.168.56.5» и вы хотите преобразовать его в многоадресную рассылку «225.1.2.3», затем установите правило как

utomu -m 225.1.2.3 -a 192.168.56.5 -s 1194 -d 1194

Это также изменит исходный порт и порт назначения.

Источник @ https://github.com/ravi-eticala/unicast-to-multicast