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'

Important! Примечание: В версии OpenWrt Attitude Adjustment 12.09, «IGMP snooping» по умолчанию включен, поэтому никакие изменения в /etc/config/network для OpenWrt AA 12.09 не нужны! Однако начиная с ревизии r36463, «IGMP snooping» по умолчанию отключен и для его включения требуются вышеупомянутые действия.

Если ваш клиент находится за 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».

Альтернативным путем, который позволяет получить доступ к широковещательным 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, то в файле конфигурации фаервола – /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'
This website uses cookies. By using the website, you agree with storing cookies on your computer. Also you acknowledge that you have read and understand our Privacy Policy. If you do not agree leave the website.More information about cookies
  • Last modified: 2023/01/06 16:38
  • by damisul