К написанию этого материала меня подтолкнул мой собственный печальный опыт настройки роутера для просмотра 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 вешает роутер наглухо. Вплоть до саморебута. Пока борюсь с ней. Если кто знает ответ — буду благодарен.