суббота, 26 марта 2016 г.

Просто о сложном, или IPTV через DD-WRT

Дано:
  • Asus RT-N16 c прошивкой DD-WRT v24-sp2 (08/19/13) kingkong (SVN revision 22200M)
  • Интернет от ПТК (Пензенская телефонная компания) через PPPoE
  • IPTV приставка TVIP S410

Задача: 
  1. Пробросить IPTV-трафик с WAN на приставку.


Подготовка:

Неплохое описание работы мультикаста (IGMP)  тут.


Решение:

Вариант первый
Объединяем LAN-порт подключения приставки с WAN портом. 
IPTV заработает, но приставке не будет поступать интернет для загрузки списка каналов, телепрограммы, сервисов Youtube, IVI и прочее.

P.S. почему-то после перезагрузки переставал подниматься PPPoE


Вариант второй (изощренный)
Для этого воспользуемся утилитой трансляции мультикастных подписок igmpproxy. В dd-wrt она называется igmprt. Синтаксис конфигурации хорошо описан тут.

Если отключить Firewall->Filter Multicast, то igmprt будет запускаться автоматически, правда не между WAN и LAN как нам надо, а между LAN и PPPoE-туннелем. Также будут прописаны правила iptables для приема IGMP-трафика и перенаправления UDP-потока.
Поэтому оставляем включенным чекбокс фильтрации мультикаста и все напишем сами:

#Force IGMPv2 instead of IGMPv3
echo 2 > /proc/sys/net/ipv4/conf/vlan2/force_igmp_version

# Set random IP to WAN, else igmprt not start
ifconfig vlan2 192.168.50.137

# rules for traffic
iptables -I FORWARD -d 224.0.0.0/4 -p UDP -j ACCEPT
iptables -I INPUT -p igmp -j ACCEPT

# Create config
echo -e "
quickleave

# Multicast source interface
phyint vlan2 upstream ratelimit 0 threshold 1
# Destination multicast interface. Request must receive from here
phyint br0 downstream ratelimit 0 threshold 1
phyint lo disabled
" > /tmp/igmpproxy.conf



igmprt /tmp/igmpproxy.conf &

,где br0 - сетевой мост, состоящий из LAN-портов и Wi-Fi,
vlan2 - виртуальный интерфейс WAN-порта.

Описанные выше команды можно добавить в поле Commands->Save Startup. Но если произойдет заполнение nvram, куда все это сохраняется, то роутер может сброситься. Поэтому лучше закинуть скрипт на jffs или usb и поставить команду на автозапуск в Commands->Run startup в стиле sh /mnt/scripts/igmprt.sh

Из-за объединения LAN и Wi-Fi мостом, мультикаст насмерть забивает канал Wi-Fi. Поэтому такой способ мало кому подойдет. Возможно поможет вынесение Wi-Fi из моста с помощью Wireless->Advances Settings->AP Isolation Enable.


Вариант третий
Также можно транслировать мультикастный трафик в UDP, и отсылать его только конкретным абонентам, а не всем без разбора. Для этого используется утилита udpxy.
И скрипт запуска должен выглядеть подобным образом:

#Force IGMPv2 instead of IGMPv3
echo 2 > /proc/sys/net/ipv4/conf/vlan2/force_igmp_version


# Set random IP to WAN, else igmprt not start
ifconfig vlan2 192.168.50.137

# rules for traffic
iptables -I INPUT -p igmp -j ACCEPT
iptables -I INPUT -p udp -d 224.0.0.0/4 -j ACCEPT

/mnt/udpxy -a `nvram get lan_ipaddr` -p 4444 -m 192.168.50.137 -S

После чего необходимо изменить все адреса в плейлисте. Например, 
udp://@239.195.32.1:1234 
заменить на
http://192.168.1.1:4444/udp/239.195.32.1:1234

После запуска трансляции можно посмотреть статистику трансляции в браузере по адресу http://192.168.1.1:4444/status

Комментариев нет:

Отправить комментарий