| Both sides previous revision Previous revision Next revision | Previous revisionLast revisionBoth sides next revision |
| ru:doc:howto:udp_multicast [2016/01/05 13:15] – Убрал мултикастовые адреса из altnet. Нечего им там делать. Pilot6 | ru:doc:howto:udp_multicast [2023/01/06 16:37] – [Решение] Было неверное указано имя интерфейса, для ручного включения igmp_snooping damisul |
|---|
| | ====== 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> |