Примечание: Хотя сейчас есть принятый ответ, это только часть; проверьте последнее правило 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». Затем установите
предположим, что IP-адрес источника одноадресной рассылки - «192.168.56.5» и вы хотите преобразовать его в многоадресную рассылку «225.1.2.3», затем установите правило как
Это также изменит исходный порт и порт назначения.
Источник @ https://github.com/ravi-eticala/unicast-to-multicast