Перейти к содержимому


- - - - -

Qwerty.TV под линуксом через роутер при помощи igmpproxy


  • Авторизуйтесь для ответа в теме
В этой теме нет ответов

#1 zulf

zulf
  • Новичок

  • Новичок
  • 1 сообщений

Отправлено 03.05.2010 - 15:48

Постановка задачи.

Цель, просматривать на линуксовом компьютере бесплатные каналы.
Домашний компьютер, работающий под Linux FC12, подключенный к инету через роутер DLink Dir-825, на котором установлена свободная прошивка Open-WRT (10.03), т.е. в принципе должен подойти любой роутер на который ставится эта прошивка. На форуме готовых решений не нашел, в техподдержке от такого вопроса впали в полный ступор - упорно предлагали скачать с сайта exe-шник с плейлистом... Вобщем пришлость разбираться самостоятельно, теперь решил написать инструкцию.

Немного теории

Собственно видеопоток передается в виде обычных udp пакетов с вещательного сервера, в моем случае адрес сервера 213.85.187.36, но адрес источника не так важен, важно что адрес назначения у этих пакетов будет из диапазона 224.*.*.*-239.*.*.*, а порт назначения 1234.
Сервер передает udp пакеты сразу всех каналов, его не интересует, сколько клиентов смотрят каждый из них и в каком месте сети они находятся. Например udp пакеты первого канала имеют адрес и порт назначения 239.255.2.1:1234, второго канала 239.255.2.2:1234 и.т.д.
Для того, чтобы промежуточные узлы знали, куда передавать поток конкретного телеканала используются специальные igmp пакеты, при помощи этих пакетов компьютер, который хочет получить видеопоток должен сказать промежуточным узлам, чтобы те его включили в соответствующую группу (фактически это подписка на конкретный телеканал). Периодически эти узлы при помощи igmp пакетов опрашивают компьютеры клиентов, чтобы те подтвердили подписку, и если не получают ответ, то прекращают ретранслировать поток каналов, у которых не осталось зрителей. Адрес назначения igmp пакетов также находится в диапазоне 224.*.*.*-239.*.*.*. Все это нам пригодится для настройки и проверки работы фаервола.

настройка

1.

Для начала не лишне будет убедиться, что в личном кабинете у вас включена опция Qwerty.TV пакет "Эфирный".

2.

Во вторых, лучше всего начать настройку воткнув кабель от провайдера напрямую в компьютер,  и только убедившись в нормальной работе программы плеера в такой конфигурации начать настройку роутера.

- устанавливаем программу плеера. Для линукса подходит тот-же vlc или mplayer, они должны быть в составе дистрибутива

- временно отключаем фаервол на компьютере. Для моего дистрибутива это делается командой service iptables stop

- запускаем плеер командой vlc udp://@239.255.2.2:1234. Если плеер работает, то значит трансляция от провайдера доходит нормально.

- включаем фаервол на компьютере. перезапускаем vlc плеер той-же командой. Если не работает, или начинает работать, но потом остонавливается - значит нужно разрешить мультикаст пакеты.

iptables -A INPUT -d 224.0.0.0/240.0.0.0 -m udp -p udp --dport 1234 -j ACCEPT
iptables -A INPUT -d 224.0.0.0/240.0.0.0 -p igmp -j ACCEPT

В моем дистрибутиве их нужно вписать в соответствующее место файла /etc/sysconfig/iptables (естественно без слова iptables).
Возможно в некоторых дистрибутивах придется добавить две аналогичные строки для -A OUTPUT если есть ограничения на исходящий трафик.

3.

- включаем интернет через роутер и настраиваем igmpproxy. Сначала надо убедиться что на вашем роутере установлен этот пакет, если нет то его надо доустановить. Настройка igmmroxy крайне проста,  у него всего один файл конфигурации /etc/igmpproxy.conf. Пример моего файла конфигурации:

quickleave

##  eth1 (Upstream Interface) ЭТОТ ИНТЕРФЕЙС СМОТРИТ В СТОРОНУ QWERTY
phyint eth1 upstream  ratelimit 0  threshold 1
#		altnet 224.0.0.0/4
		altnet 213.85.187.36
		altnet 213.85.187.0/24

## br-lan (Downstream Interface) ИНТЕРФЕЙС СМОТРИТ В СТОРОНУ ВАШЕЙ ЛОКАЛКИ
phyint br-lan downstream  ratelimit 0  threshold 1

## Configuration for eth2 (Disabled Interface)
phyint eth2 disabled
Тут все понятно, главное не пререпутать какой интерфейс куда смотрит (вместо eth1 и br-lan нужно подставить то, что у вас). Единственная тонкость с директивой altnet, как я понял она должна указывать на источник с которого ведется вещание, если оно ведется с "нестандартных" адресов, но в нашем случае вроде должно работать и без нее, проверять я не стал.
Небольшой комментарий насчет br-lan, у меня это бридж, в который объединены как локальный  ethernet порт, так и оба wi-fi интерфейса, так что весь приходящий через eth1 мультикастовый трафик роутер будет ретранслировать и через проводную сеть и через wi-fi. Если трансляция через wi-fi вам не нужна, то переконфигурируйте бридж.

- останавливаем фаервол на роутере командой /etc/init.d/firewall stop

- пробуем запустить igmpproxy (пока в отладочном режиме) командой igmpproxy -d -v -v /etc/igmpproxy.conf если все сделано правильно, то прокси запустится и будет ждать запросов на включение вещания

- снова запускаем vlc udp://@239.255.2.2:1234 на компьютере. Плеер должен заработать, лампочки на роуте должны замигать с сумасшедшей частотой. igmpproxy должен выдать на экран что-нибудь вроде этого:

Current routing table (Insert Route):
-----------------------------------------------------
#0: Src: 0.0.0.0, Dst: 239.255.2.2, Age:2, St: I, OutVifs: 0x00000002
-----------------------------------------------------
RECV V2 member report   from AAA.AAA.AAA.AAA  to 239.255.2.2
The IGMP message was from myself. Ignoring.
Route activation request from AAA.AAA.AAA.AAA for 239.255.2.2 is from myself. Ignoring.
Route activate request from 213.85.187.36 to 239.255.2.2
Vif bits : 0x00000002
Setting TTL for Vif 1 to 1
Adding MFC: 213.85.187.36 -> 239.255.2.2, InpVIf: 0

Current routing table (Activate Route):
-----------------------------------------------------
#0: Src: 213.85.187.36, Dst: 239.255.2.2, Age:2, St: A, OutVifs: 0x00000002
-----------------------------------------------------
RECV V2 member report   from BBB.BBB.BBB.BBB   to 239.255.2.2

вместо ААА.ААА.ААА.ААА должен быть внешний адрес роутера, а вместо BBB.BBB.BBB.BBB адрес вашего компьютера, на котором вы запустили vlc. Самая главная строка здесь это сама таблица роутинга
#0: Src: 213.85.187.36, Dst: 239.255.2.2, Age:2, St: A, OutVifs: 0x00000002
Здесь 213.85.187.36 это адрес передающего сервера а 239.255.2.2 это канал, который мы указали при запуске vlc.

Если на этом этапе vlc ничего не показывает а таблица роутинга остается либо пустой, либо в в строке вместо адреса источника стоит Src: 0.0.0.0, то значит igmp пакеты где-то теряются, проверяйте все-ли вы сделали правильно.

4.

- если в предыдущем пункте проблем не возникло запускаем фаервол на роутере командой /etc/init.d/firewall start

- снова перезапускаем vlc udp://@239.255.2.2:1234 на компьютере. Плеер скорее всего работать перестанет. Теперь нам нужно разрешить прохождение мультикастовых пакетов через роутер аналогично тому как мы это сделали в п.2 для компьютера, на котором запущен vlc. В роутерах, работающих под Open-WRT это проще всего сделать через web интерфейс или прописав в файле /etc/config/firewall следующие строки
config 'rule'
		option 'target' 'ACCEPT'
		option '_name' 'IP-TV-igmp'
		option 'src' 'wan'
		option 'proto' 'igmp'
		option 'dest_ip' '224.0.0.0/240.0.0.0'

config 'rule'
		option 'target' 'ACCEPT'
		option '_name' 'IP-TV-udp-stream'
		option 'src' 'wan'
		option 'proto' 'udp'
		option 'dest_ip' '224.0.0.0/240.0.0.0'
		option 'dest' 'lan'
		option 'dest_port' '1234'

- перезапускаем фаервол на роутере через команды /etc/init.d/firewall stop /etc/init.d/firewall start

- снова запускаем vlc, таперь все должно заработать окончательно. Осталось только отконфигурить igmpproxy на автоматический запуск при старте роутера и можно наслаждаться

Если все так и не заработало

Придется использовать анализаторы трафика, такие как tcpdump, причем желательно их запускать как на компьютере, так и на самом роутере (в составе Open-WRT tcpdump присутствует).

Например вот так выглядит дамп трафика полученный на внешнем интерфейсе роутера при запуске vlc

root@OpenWrt:~# tcpdump -i eth1 -v -v -f -n igmp
tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes
15:40:21.823927 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [DF], proto IGMP (2), length 32, options (RA))
	ААА.ААА.ААА.ААА > 239.255.2.2: igmp v2 report 239.255.2.2
15:40:27.113843 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [DF], proto IGMP (2), length 32, options (RA))
	ААА.ААА.ААА.ААА > 239.255.2.2: igmp v2 report 239.255.2.2
15:40:37.253839 IP (tos 0xc0, ttl 1, id 0, offset 0, flags [DF], proto IGMP (2), length 32, options (RA))
	ААА.ААА.ААА.ААА > 239.255.2.2: igmp v2 report 239.255.2.2

Вместо ААА.ААА.ААА.ААА будет внешний адрес вашего роутера. А вот так должен выглядить поток udp пакетов на входе компьютера, на котором запущен vlc.
tcpdump -i eth0 -f -n -v -v udp
15:50:22.471538 IP (tos 0x80, ttl 57, id 62123, offset 0, flags [DF], proto UDP (17), length 1344) 213.85.187.36.50000 > 239.255.2.2.search-agent: UDP, length 1316
15:50:22.472714 IP (tos 0x80, ttl 57, id 62129, offset 0, flags [DF], proto UDP (17), length 1344) 213.85.187.36.50000 > 239.255.2.2.search-agent: UDP, length 1316
15:50:22.473863 IP (tos 0x80, ttl 57, id 62135, offset 0, flags [DF], proto UDP (17), length 1344) 213.85.187.36.50000 > 239.255.2.2.search-agent: UDP, length 1316
15:50:22.475145 IP (tos 0x80, ttl 57, id 62141, offset 0, flags [DF], proto UDP (17), length 1344) 213.85.187.36.50000 > 239.255.2.2.search-agent: UDP, length 1316
15:50:22.476375 IP (tos 0x80, ttl 57, id 62147, offset 0, flags [DF], proto UDP (17), length 1344) 213.85.187.36.50000 > 239.255.2.2.search-agent: UDP, length 1316
15:50:22.477487 IP (tos 0x80, ttl 57, id 62153, offset 0, flags [DF], proto UDP (17), length 1344) 213.85.187.36.50000 > 239.255.2.2.search-agent: UDP, length 1316

К вопросу увеличения TTL

Неоднократно встречал в сети упоминания, что для работы IP-TV может потребоваться увеличение TTL в проходящих через роутер пакетах (при помощи команд вида iptables -t mangle бла-бла-бла -j TTL --ttl-inc 1). В моем случае этого не понадобилось, но видимо для некоторых провайдеров это актуально. Имейте ввиду, в текущей версии Open-WRT (10.03) --ttl-inc не работает, ищите патченый пакет iptables-mod-ipopt, с ним типа должно работать, по крайней мере у меня правило с --ttl-inc добавилось успешно.




Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 скрытых пользователей