Основным механизмом доставки телевизионных программ до абонентов в локальных сетях является вещание в виде широковещательных IP-пакетов (иногда такой поток называют «мультикаст» от английского «multicast»). Особенностью данной технологии является то, что все мультимедийные потоки всегда направляются в сеть, вне зависимости от количества активных подписчиков в настоящий момент времени. Например, для передачи 20 телевизионных каналов со средним битрейтом 4 Мбит/сек на канал потребует порядка 4*20 = 80 Мбит/сек пропускной способности. Эти 80 Мбит/сек будут направляться в сеть, даже если ни один абонент в данный момент не подключен к сети, а также в случае, если количество активных абонентов гораздо более 1000.
Вещание мультимедийного контента в локальную сеть в виде широковещательных пакетов сопряжено с необходимостью четко контролировать какие пакеты и к какому получателю должны доставляться. Необходимо избегать ситуации, когда все пакеты доставляются всем абонентам. В этом случае абонентские устройства будут тратить ресурсы на обработку «непрошенных» пакетов и в итоге не смогут выполнять свои функции. Абоненту необходимо доставлять пакеты только того потока, который он запросил. Для этого абонентское оборудование сообщает о желании вступить в определенную группу по протоколу IGMP. Далее этот запрос регистрируется на маршрутизаторе, в терминах IGMP это устройство называется «Querier». После успешной регистрации, Ethernet коммутатор приступает к копированию широковещательных пакетов, предназначенных для данной группы, в порт, к которому подключен абонент.
Благодаря протоколу IGMP, Ethernet-коммутаторы могут определить какие широковещательные пакеты копировать в абонентский порт, а какие нет.
В настоящей статье описывается настройка протокола IGMP для просмотра пакета IPTV через шлюз под управлением CentOS.
На шлюзе две сетевые карты.
eth0 - провайдер.
eth1 - локальная сеть.
ppp0 - интернет, привязан на eth0.
Для начала прописываем правила в iptables. В файл /etc/sysconfig/iptables, добавляем:
секция *filter:
-A FORWARD -p igmp -i eth0 -o eth2 -j ACCEPT
-A INPUT -d 224.0.0.0/4 -j ACCEPT
-A FORWARD -d 224.0.0.0/4 -j ACCEPT
секция *mangle:
-A PREROUTING -d 224.0.0.0/240.0.0.0 -p udp -j TTL --ttl-inc 1
Выполняем:
modprobe ipt_TTL
service iptables reload
service iptables restart
route add -net 224.0.0.0/4 dev eth0
route add -net 224.0.0.0/4 dev eth2
Добавляем в файл /etc/rc.d/rc.local:
route add -net 224.0.0.0/4 dev eth0
route add -net 224.0.0.0/4 dev eth2
Теперь необходимо установить утилиту igmpproxy, которая и будет транслировать IPTV в локальную сеть.
Её можно собрать из исходников производителя, либо скачать собранный пакет.
wget http://centos.alt.ru/pub/repository/centos/6/x86_64/igmpproxy-0.1-1.el6.x86_64.rpm
rpm -i igmpproxy-0.1-1.el6.x86_64.rpm
или же подключить репозитарий CentALT
rpm -ivh http://centos.alt.ru/repository/centos/6/x86_64/centalt-release-6-1.noarch.rpm
и установить
yum install igmpproxy
Запускаем в режиме дебага:
/usr/sbin/igmpproxy -vd /etc/igmpproxy.conf
Находим примерную строку:
The source address 172.18.3.1 for group 224.0.42.1, is not in any valid net for upstream VIF
По ней определяем, что поток идет с IP 172.18.3.1
Открываем конфиг /etc/igmpproxy.conf:
в секцию phyint eth0 upstream ratelimit 0 threshold 1 добавляем подсеть транслятор:
altnet 172.18.3.1
в секцию phyint eth2 downstream ratelimit 0 threshold 1 можно ничего не добавлять, это локальная сеть.
Конфиг будет иметь вид:
##------------------------------------------------------
## Enable Quickleave mode (Sends Leave instantly)
##------------------------------------------------------
quickleave
##------------------------------------------------------
## Configuration for eth0 (Upstream Interface)
##------------------------------------------------------
phyint eth0 upstream ratelimit 0 threshold 1
altnet 172.18.3.1
##------------------------------------------------------
## Configuration for eth1 (Downstream Interface)
##------------------------------------------------------
phyint eth1 downstream ratelimit 0 threshold 1
##------------------------------------------------------
## Configuration for eth2 (Disabled Interface)
##------------------------------------------------------
phyint ppp0 disabled
Теперь можно смотреть IPTV, запускаем:
/usr/sbin/igmpproxy /etc/igmpproxy.conf&
Для автозапуска добавляем строку в файл /etc/rc.d/rc.local:
/usr/sbin/igmpproxy /etc/igmpproxy.conf&
Проверено и работает: IpTvPlayer, провайдер ISTV.