IPTV / UDP multicast
Многие интернет провайдеры предоставляют услуги IPTV, обычно используя при этом IPv4 UDP multicasting. Ниже приведены инструкции по настройке для большинства случаев.
Основные положения
Когда хост хочет начать получать широковещательный UDP трафик, то он должен принадлежать к группе «UDP multicast group». Контроль для широковещательных групп базируется на протоколе IGMP. Как только хост подписан, весь трафик для этой группы посылается ей используя broadcast L2 frames. Это важно, потому как многие роутеры направляют весь широковещательный трафик на все порты. В домашних сетях вы обычно используете Linux для управления проводными и беспроводными сетями, и если вы получаете широковещательный трафик по проводному каналу, то вы будете забивать им и беспроводные каналы тоже. К счастью в версии ядра Linux 2.6.34 есть возможность «IMGP snooping», которая отслеживает подобные ситуации и по умолчанию присутствует в OpenWrt. Таким образом у вас не будет нежелательного трафика на портах, который не были вами заданы для получения.
Ещё одним важным фактором является так же то, что из-за использования низкого уровня скорости (чтобы все клиенты могли «слушать»), а так же хитрых режимов энергосбережения – широковещание в беспроводных сетях работает не так, как этого от него ожидаешь. Зачастую широковещание бесполезно для IPTV.
Решение
Благодаря «IGMP snooping», утилита igmpproxy больше не должна создавать проблемы в беспроводных сетях. Теперь вы можете одновременно запускать обе утилиты igmpproxy и udpxy.
Проверьте, что поддержка «IGMP snooping» присутствует в вашей прошивке OpenWrt и включена!
Выполните команду:
# cat /sys/devices/virtual/net/br-lan/bridge/multicast_snooping
Если команда выдаст сообщение содержащие «No such file or directory
», то прошивка скомпилирована без поддержки «IGMP snooping» и просмотр IPTV затормозит вашу беспроводную сеть.
Если файл существует, то вывод команды выдаст либо «1
», либо «0
». Если выдается «1
», то ничего делать не надо, а если «0
», то для включения «IGMP snooping» в файл /etc/config/network
, в конфигурации интерфейса «br-lan», необходимо добавить строку:
option igmp_snooping '1'
Примечание: В версии OpenWrt Attitude Adjustment 12.09, «IGMP snooping» по умолчанию включен, поэтому никакие изменения в /etc/config/network
для OpenWrt AA 12.09 не нужны! Однако начиная с ревизии r36463, «IGMP snooping» по умолчанию отключен и для его включения требуются вышеупомянутые действия.
IGMP proxy
Если ваш клиент находится за NAT, то он не может подписываться на мультикаст напрямую. Для решения этой проблемы понадобится утилита igmpproxy.
Установка igmpproxy
Выполните команды устанавливающие igmpproxy:
# opkg update # opkg install igmpproxy
После установки пакета, необходимо отредактировать файл конфигурации /etc/config/igmpproxy
:
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
Настройки Firewall
Вы так же должны разрешить IGMP для WAN интерфейса и перенаправить широковещательный трафик следующими правилами в файле /etc/config/firewall
:
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'
Запуск igmpproxy
После добавления правил, необходимо перезапустить фаервол, добавить igmpproxy в автостарт и естественно запустить сам igmpproxy. Выполните следующие команды:
# /etc/init.d/firewall restart # /etc/init.d/igmpproxy enable # /etc/init.d/igmpproxy start
В дальнейшем igmpproxy будет сразу стартовать автоматически в процессе загрузки роутера.
Проверка сервиса igmpproxy
# ps | grep igmp 1900 root 952 S /usr/sbin/igmpproxy /var/etc/igmpproxy.conf 1941 root 1336 S grep igmp #
При отсутствии строки “/usr/sbin/igmpproxy /var/etc/igmpproxy.conf”, отладка сервиса из командной строки
# igmpproxy -d -vv /var/etc/igmpproxy.conf
В случае падений сервиса, можно добавить в cron команду
*/30 * * * * /usr/bin/pgrep igmpproxy || /etc/init.d/igmpproxy start
Подсети провайдера из которых идет вещание
Если вы не уверены, что надо написать в строках list altnet
файла конфигурации /etc/config/igmpproxy
, то закомментируйте эти строки и посмотрите на вывод igmpproxy в логе роутера. Пытайтесь после запуска igmpproxy подписываться на какие-либо каналы с помощью 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 слушать все возможные адреса, прописав
config phyint option network wan option direction upstream list altnet 0.0.0.0/0
Однако в этом случае возможна нестабильность.
Также следует учитывать, что значение 0.0.0.0/0
поддерживается начиная с ревизии r40729. На старых ревизиях igmpproxy откажется запускаться с данным значением, выдав ошибку: «The bits part of the address is invalid : 4286488
».
udpxy
Альтернативным путем, который позволяет получить доступ к широковещательным UDP потокам, является утилита udpxy. Работает довольно хорошо, как на проводных, так и на беспроводных соединениях.
Установка udpxy
Выполните команды устанавливающие udpxy:
# opkg update # opkg install udpxy
После установки пакета, возможно вам понадобится отредактировать стартовый скрипт /etc/init.d/udpxy
в соответствии с вашими требованиями. Вас должна интересовать только строка OPTIONS=“-T -S -p 4022”
. Вы можете ее оставить так, как она есть, но если вас что-то будет не устраивать в работе udpxy, то вы можете изменить ключи для запуска udpxy в соответствии с руководством по использованию данной утилиты.
Пример изменения стартового скрипта /etc/init.d/udpxy
#!/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 }
Настройки Firewall
Для того, чтобы udpxy мог работать с IGMP, вы должные добавить соответствующие правила в файл /etc/config/firewall
:
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'
Запуск udpxy
После добавления правил, необходимо перезапустить фаервол, добавить udpxy в автостарт и естественно запустить сам udpxy. Выполните следующие команды:
# /etc/init.d/firewall restart # /etc/init.d/udpxy enable # /etc/init.d/udpxy start
В дальнейшем udpxy будет сразу стартовать автоматически в процессе загрузки роутера.
Теперь когда вы захотите получить доступ, скажем, к udp://@239.64.64.58:1234
, то вы должны указать своему проигрывателю соединиться с адресом http://192.168.1.1:4022/udp/239.64.64.58:1234
. В данном примере, IP-адрес 192.168.1.1 является адресом вашего роутера в локальной сети.
Примечание по совместному использованию igmpproxy и udpxy
Если вы планируете использовать одновременно igmpproxy и udpxy, то в файле конфигурации фаервола – /etc/config/firewall
у вас в итоге должно быть два правила:
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'