Одноадресная рассылка для многоадресной рассылки через 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 на отдельной машине не показывал выходящих пакетов.
Я посмотрел на Как перевести одноадресную передачу для трансляции через DNAT с iptables? но это, похоже, связано со спецификой вещательного дела.
Примечание. Других установленных правил 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.
Изменить: Как выясняется, эта проблема возникла снова.
Окончательное решение, которое работало в полном объеме:
Get 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, чтобы гарантировать, что вы не перехватываете пакеты, которые вам не нужны - это просто упрощенный пример.
4 ответа
У вас в ядре включен 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, чтобы включить многоадресную маршрутизацию
Кажется, вам придется использовать специальный демон - посмотрите на igmpproxy
или же mrouted
- поскольку iptables будет просто транслировать и пересылать входящий пакет на одну комбинацию адресов / портов в заданном диапазоне.
Вам необходимо манипулировать таблицей маршрутизации, чтобы после 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 не сможет соответствовать возвращаемым пакетам; Вы должны сделать свой собственный 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>
Там общий способ делать то, что ты хочешь. Я надеюсь, что мое (ограниченное) объяснение может привести вас на правильный путь.
Этот модуль ядра создает новый хук netfilter в цепочке предварительной маршрутизации для кражи одноадресных пакетов и отправляет его как многоадресный пакет на основе правила, установленного "utomu"
Например: интерфейс входящего сеанса одноадресной передачи - "eth0", а интерфейс исходящего сеанса многоадресной передачи - "eth1". Затем установите
echo "eth0"> / proc / sys / net / utom / in_ifname
echo "eth1"> / proc / sys / net / utom / out_ifname
предположим, что IP-адрес источника одноадресной рассылки равен "192.168.56.5", и требуется преобразовать его в многоадресную рассылку "225.1.2.3", а затем установить правило как
Утому -m 225.1.2.3 -a 192.168.56.5 -s 1194 -d 1194
Это также изменит порт источника и порт назначения.
Источник @ https://github.com/ravi-eticala/unicast-to-multicast