Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
ru:doc:howto:udp_multicast [2015/03/24 16:10] – [IGMP proxy] yohimbaru:doc:howto:udp_multicast [2023/01/06 16:38] (current) – [Решение] исправил кавычки damisul
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'', в конфигурации интерфейса «br-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 будет сразу стартовать автоматически в процессе загрузки роутера. 
 +
 +Проверка сервиса igmpproxy 
 +<code>
 +# ps | grep igmp
 + 1900 root       952 S    /usr/sbin/igmpproxy /var/etc/igmpproxy.conf
 + 1941 root      1336 S    grep igmp
 +#
 +</code>
 +При отсутствии строки "/usr/sbin/igmpproxy /var/etc/igmpproxy.conf", отладка сервиса из командной строки
 +<code>
 +# igmpproxy -d -vv /var/etc/igmpproxy.conf
 +</code>
 +В случае падений сервиса, можно добавить в cron команду <code> */30 * * * * /usr/bin/pgrep igmpproxy || /etc/init.d/igmpproxy start </code>
 +=== Подсети провайдера из которых идет вещание ===
 +
 +Если вы не уверены, что надо написать в строках ''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>
  • Last modified: 2023/01/06 16:38
  • by damisul