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, в конфигурации интерфейса «lan», необходимо добавить строку:

option igmp_snooping 1

Important! Примечание: В версии 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
	list altnet 224.0.0.0/4

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 будет сразу стартовать автоматически в процессе загрузки роутера.

Подсети провайдера из которых идет вещание

Если вы не уверены, что надо написать в строках 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». Таким образом вы узнаете широковещательный адрес вашего провайдера и сможете добавить необходимую подсеть в файл конфигурации /etc/config/igmpproxy.

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-IGMPPROXY'
	option src 'wan'
	option proto 'udp'
	option dest 'lan'
	option dest_ip '224.0.0.0/4'
	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'

Back to top

ru/doc/howto/udp_multicast.txt · Last modified: 2014/03/26 13:35 (external edit)