четверг, 16 февраля 2012 г.

Настраиваем просмотр IP-TV через роутер на FreeBSD 8.2. Способ 2.

Проблемы igmpproxy заставили дальше копаться в интернету в поисках альтернативного решения.
И я его нашел.
Иван Рожук опубликовал скрипт mcastbr2.sh для проброса multicast через шлюз на базе FreeBSD штатными средствами netgraph, без использования неработающих у многих igmpproxy и mrouted.
Включаем PROMISC режим на интерфейсах:

#ifconfig em0 promisc
#ifconfig re0 promisc

Скачиваем скрипт, даем ему права на запуск:

#wget http://www.netlab.linkpc.net/download/software/FreeBSD/mcastbridge/mcastbr2.sh
#chmod +x mcastbr2.sh

И запускаем:

#mcastbr2.sh start em0 re0

Элегантно. Есть свои тонкости, но это, пожалуй, самое легкое и стабильное решение.

Настраиваем просмотр IP-TV через роутер на FreeBSD 8.2. Способ 1.

К написанию этого материала меня подтолкнул мой собственный печальный опыт настройки роутера для просмотра IPTV.
И если речь идет о незашифрованных каналах, то решение простое — udpxy, то в случае зашифрованного ТВ (платные услуги) этот метод уже не работает.
Копать пришлось в сторону настройки роутинга мультикаста. В принципе в 8 версии FreeBSD есть поддержка мультикаста, нужно лишь собрать ядро с опцией MROUTING. После этого нужно решить, какому пакету доверить работу с маршрутами мультикаста.
Кто-то умудряется настроить mrouted. Но это архаизм, поэтому мы будем пользоваться igmpproxy. Благо она сейчас уже достаточно стабильна.
Итак, ставим igmpproxy из портов:

#cd /usr/ports/net/igmpproxy
#make install clean
#rehash

После установки, нужно будет поправить конфигурационный файл. Причем в два этапа.
Для начала нужно указать нашему роутеру, какие интерфейсы будут использоваться при мультикасте, а какие нужно игнорировать. Сначала просмотрим список всех интерфейсов:

#ifconfig -a

В моем случае мне нужны лишь интерфейсы em0 (внешний) и re0 (внутренний) и не нужны plip0, lo0, ipfw0, pflog0.
Так и пропишем в конфиге /usr/local/etc/igmpproxy.conf:

#cat /usr/local/etc/igmpproxy.conf
quickleave

#Это внешний интерфейс
phyint em0 upstream ratelimit 0 threshold 1

## Это внутренний интерфейс
phyint re0 downstream ratelimit 0 threshold 1

## Отключенные интерфейсы
phyint plip0 disabled
phyint lo0 disabled
phyint ipfw0 disabled
phyint pflog0 disabled

 Если файрвол у вас настроен на режим «блокировать все, что не разрешено», то нужно прописать в нем правило, разрешающее входящий и исходящий трафик igmp. На примере pf:

pass in proto igmp all allow-opts
pass out proto igmp all allow-opts

Теперь попробуем запустить вручную igmpproxy c выводом информации для отладки:

#igmpproxy -vd /usr/local/etc/igmpproxy.conf

После этого на компьютере, находящемся во внутренней локальной сети, запустим IPTV и будем смотреть на вывод igmpproxy. Должны появиться строки типа:

the source address X.X.X.X for group Y.Y.Y.Y, is not in any valid net for upstream VIF

адрес X.X.X.X — это адрес компьютера из сети вещания. И эту сеть нужно прописать к альтернативную в настройках igmpproxy:

#cat /usr/local/etc/igmpproxy.conf
quickleave

phyint em0 upstream  ratelimit 0  threshold 1
altnet X.0.0.0/8 ## наша сеть вещания

phyint re0 downstream  ratelimit 0  threshold 1

phyint plip0 disabled
phyint lo0 disabled
phyint ipfw0 disabled
phyint pflog0 disabled

После этого можно перезапустить igmpproxy и ваше ТВ должно нормально функционировать.


И все бы хорошо, да есть одна проблема. /usr/local/etc/rc.d/igmpproxy stop вешает роутер наглухо. Вплоть до саморебута. Пока борюсь с ней. Если кто знает ответ — буду благодарен.