User Tools

Site Tools


ru:doc:howto:udp_multicast

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Previous revision
ru:doc:howto:udp_multicast [2013/05/15 03:00]
ru:doc:howto:udp_multicast [2016/01/05 14:15] (current)
Pilot6 Убрал мултикастовые адреса из altnet. Нечего им там делать.
Line 1: Line 1:
 +====== IPTV / UDP multicast ======
 +Многие интернет провайдеры предоставляют услуги IPTV, обычно используя при этом IPv4 UDP multicasting. Ниже приведены инструкции по настройке для большинства случаев.
  
 +===== Основные положения =====
 +Когда хост хочет начать получать широковещательный UDP трафик,​ то он должен принадлежать к группе «UDP multicast group». Контроль для широковещательных групп базируется на протоколе IGMP. Как только хост подписан,​ весь трафик для этой группы посылается ей используя [[http://​en.wikipedia.org/​wiki/​IP_multicast#​Layer_2_delivery|broadcast L2 frames]]. Это важно, потому как многие роутеры направляют весь широковещательный трафик на все порты. В домашних сетях вы обычно используете Linux для управления проводными и беспроводными сетями,​ и если вы получаете широковещательный трафик по проводному каналу,​ то вы будете забивать им и беспроводные каналы тоже. К счастью в версии ядра Linux 2.6.34 есть возможность «IMGP snooping», которая отслеживает подобные ситуации и по умолчанию присутствует в OpenWrt. Таким образом у вас не будет нежелательного трафика на портах,​ который не были вами заданы для получения.
 +
 +Ещё одним важным фактором является так же то, что из-за использования низкого уровня скорости (чтобы все клиенты могли «слушать»),​ а так же хитрых режимов энергосбережения – широковещание в беспроводных сетях работает не так, как этого от него ожидаешь. Зачастую широковещание бесполезно для IPTV.
 +
 +===== Решение =====
 +Благодаря «IGMP snooping», утилита igmpproxy больше не должна создавать проблемы в беспроводных сетях. Теперь вы можете одновременно запускать обе утилиты igmpproxy и udpxy.
 +
 +**Проверьте,​ что поддержка «IGMP snooping» присутствует в вашей прошивке OpenWrt и включена!**
 +
 +Выполните команду:​
 +
 +<​code>​
 +# cat /​sys/​devices/​virtual/​net/​br-lan/​bridge/​multicast_snooping
 +</​code>​
 +
 +Если команда выдаст сообщение содержащие «''​No such file or directory''​»,​ то прошивка скомпилирована без поддержки «IGMP snooping» и просмотр IPTV затормозит вашу беспроводную сеть.
 +
 +Если файл существует,​ то вывод команды выдаст либо «''​1''​»,​ либо «''​0''​». Если выдается «''​1''​»,​ то ничего делать не надо, а если «''​0''​»,​ то для включения «IGMP snooping» в файл ''/​etc/​config/​network'',​ в конфигурации интерфейса «lan», необходимо добавить строку:​
 +
 +<​code>​option igmp_snooping 1</​code>​
 +
 +
 +{{:​meta:​icons:​tango:​48px-emblem-important.svg.png?​nolink |Important!}} **Примечание:​** В версии **OpenWrt Attitude Adjustment 12.09**, «IGMP snooping» по умолчанию включен,​ поэтому **никакие изменения в ''/​etc/​config/​network''​ для OpenWrt AA 12.09 не нужны!** Однако начиная с ревизии [[https://​dev.openwrt.org/​changeset/​36463|r36463]],​ «IGMP snooping» по умолчанию отключен и для его включения требуются вышеупомянутые действия.
 +
 +==== IGMP proxy ====
 +Если ваш клиент находится за NAT, то он не может подписываться на мультикаст напрямую. Для решения этой проблемы понадобится утилита [[http://​sourceforge.net/​projects/​igmpproxy|igmpproxy]].
 +
 +=== Установка igmpproxy ===
 +
 +Выполните команды устанавливающие igmpproxy:
 +
 +<​code>#​ opkg update
 +# opkg install igmpproxy
 +</​code>​
 +
 +После установки пакета,​ необходимо отредактировать файл конфигурации ''/​etc/​config/​igmpproxy'':​
 +<​code>​config igmpproxy
 + option quickleave 1
 +
 +config phyint
 + option network wan
 + option direction upstream
 + list altnet 192.168.0.0/​16
 + list altnet 172.16.0.0/​12
 + list altnet 10.0.0.0/8
 +
 +config phyint
 + option network lan
 + option direction downstream
 +
 +config phyint
 + option network loopback
 + option direction disabled
 +</​code>​
 +
 +=== Настройки Firewall ===
 +Вы так ​ же должны разрешить IGMP для WAN интерфейса и перенаправить широковещательный трафик следующими правилами в файле ''/​etc/​config/​firewall'':​
 +<​code>​config rule
 + option name '​Allow-IGMP'​
 + option src '​wan'​
 + option proto '​igmp'​
 + option target '​ACCEPT'​
 +
 +config rule
 + option name '​Allow-IPTV-IGMPPROXY'​
 + option src '​wan'​
 + option proto '​udp'​
 + option dest '​lan'​
 + option dest_ip '​224.0.0.0/​4'​
 + option target '​ACCEPT'​
 +</​code>​
 +
 +=== Запуск igmpproxy ===
 +
 +После добавления правил,​ необходимо перезапустить фаервол,​ добавить igmpproxy в автостарт и естественно запустить сам igmpproxy. Выполните следующие команды:​
 +
 +<​code>​
 +# /​etc/​init.d/​firewall restart
 +# /​etc/​init.d/​igmpproxy enable
 +# /​etc/​init.d/​igmpproxy start
 +</​code>​
 +
 +В дальнейшем igmpproxy будет сразу стартовать автоматически в процессе загрузки роутера. ​
 +
 +=== Подсети провайдера из которых идет вещание ===
 +
 +Если вы не уверены,​ что надо написать в строках ''​list altnet''​ файла конфигурации ''/​etc/​config/​igmpproxy'',​ то закомментируйте эти строки и посмотрите на вывод igmpproxy в логе роутера. Пытайтесь после запуска igmpproxy подписываться на какие-либо каналы с помощью [[http://​www.videolan.org/​|VLC]] или каким-нибудь другим клиентом (проигрывателем). Если в файле конфигурации не будет хватать сетей, то вы увидите в логе, что-то типа: «''​Warn:​ The source address 10.254.16.66 for group 233.32.240.222,​ is not in any valid net for upstream VIF''​». Адрес, указанный после source address необходимо прописать в list altnet файла конфигурации ''/​etc/​config/​igmpproxy''​. В случае нескольких адресов,​ прописать соответсвующую маску.
 +
 +Для универсальности можно разрешить igmpproxy слушать все возможные адреса,​ прописав ​
 +<​code>​config phyint
 + option network wan
 + option direction upstream
 + list altnet 0.0.0.0/0
 +</​code>​
 +Однако в этом случае возможна нестабильность.
 +
 +Также следует учитывать,​ что значение ''​0.0.0.0/​0''​ поддерживается начиная с ревизии [[https://​dev.openwrt.org/​changeset/​40729|r40729]]. На старых ревизиях igmpproxy откажется запускаться с данным значением,​ выдав ошибку:​ «''​The bits part of the address is invalid : 4286488''​».
 +==== udpxy ====
 +Альтернативным путем, который позволяет получить доступ к широковещательным UDP потокам,​ является утилита [[http://​www.udpxy.com/​|udpxy]]. Работает довольно хорошо,​ как на проводных,​ так и на беспроводных соединениях.
 +
 +=== Установка udpxy ===
 +
 +Выполните команды устанавливающие udpxy:
 +
 +<​code>#​ opkg update
 +# opkg install udpxy
 +</​code>​
 +
 +После установки пакета,​ возможно вам понадобится отредактировать стартовый скрипт ''/​etc/​init.d/​udpxy''​ в соответствии с вашими требованиями. Вас должна интересовать только строка ''​OPTIONS="​-T -S -p 4022"''​. Вы можете ее оставить так, как она есть, но если вас что-то будет не устраивать в работе udpxy, то вы можете изменить ключи для запуска udpxy в соответствии с [[http://​www.udpxy.com/​umanual-ru.html|руководством по использованию данной утилиты]].
 +
 +=== Пример изменения стартового скрипта /​etc/​init.d/​udpxy ===
 +
 +<​code>#​!/​bin/​sh /​etc/​rc.common
 +
 +# To open multicast traffic, add the following rule at the end of
 +# /​etc/​config/​firewall file:
 +#
 +# config '​rule'​
 +#     ​option '​target'​ '​ACCEPT'​
 +#     ​option '​_name'​ '​multicast'​
 +#     ​option '​src'​ '​wan'​
 +#     ​option '​proto'​ '​all'​
 +#     ​option '​dest_ip'​ '​224.0.0.0/​4'​
 +
 +START=99
 +STOP=10
 +
 +SERVICE_DAEMONIZE=1
 +SERVICE_WRITE_PID=1
 +
 +#​OPTIONS="​-T -S -p 4022"
 +OPTIONS="​-T -S -m eth0.2 -p 4022 -B 2Mb -M 600"
 +
 +start() {
 + service_start /​usr/​bin/​udpxy $OPTIONS
 +}
 +
 +stop() {
 + service_stop /​usr/​bin/​udpxy
 +}
 +</​code>​
 +
 +=== Настройки Firewall ===
 +
 +Для того, чтобы udpxy мог работать с IGMP, вы должные добавить соответствующие правила в файл ''/​etc/​config/​firewall'':​
 +
 +<​code>​config rule
 + option name '​Allow-IGMP'​
 + option src '​wan'​
 + option proto '​igmp'​
 + option target '​ACCEPT'​
 +
 +config rule
 + option name '​Allow-IPTV-UDPXY'​
 + option src '​wan'​
 + option proto '​all'​
 + option dest_ip '​224.0.0.0/​4'​
 + option target '​ACCEPT'​
 +</​code>​
 +
 +=== Запуск udpxy ===
 +
 +После добавления правил,​ необходимо перезапустить фаервол,​ добавить udpxy в автостарт и естественно запустить сам udpxy. Выполните следующие команды:​
 +
 +<​code>​
 +# /​etc/​init.d/​firewall restart
 +# /​etc/​init.d/​udpxy enable
 +# /​etc/​init.d/​udpxy start
 +</​code>​
 +
 +В дальнейшем udpxy будет сразу стартовать автоматически в процессе загрузки роутера. ​
 +
 +Теперь когда вы захотите получить доступ,​ скажем,​ к ''<​nowiki>​udp://​@239.64.64.58:​1234</​nowiki>'',​ то вы должны указать своему проигрывателю соединиться с адресом ''<​nowiki>​http://​192.168.1.1:​4022/​udp/​239.64.64.58:​1234</​nowiki>''​. В данном примере,​ IP-адрес 192.168.1.1 является адресом вашего роутера в локальной сети.
 +
 +
 +
 +==== Примечание по совместному использованию igmpproxy и udpxy ====
 +
 +Если вы планируете использовать одновременно igmpproxy и udpxy, то в файле конфигурации фаервола – ''/​etc/​config/​firewall''​ у вас в итоге должно быть два правила:​
 +
 +<​code>​config rule
 + option name '​Allow-IGMP'​
 + option src '​wan'​
 + option proto '​igmp'​
 + option target '​ACCEPT'​
 +
 +config rule
 + option name '​Allow-IPTV-ALL'​
 + option src '​wan'​
 + option proto '​all'​
 + option dest_ip '​224.0.0.0/​4'​
 + option target '​ACCEPT'​
 +</​code>​