середу, 15 грудня 2010 р.

wrt160nl + DD-WRT + Multicast IPTV + udpxy

wrt160nl, как и вся продукция от linksys by cisco, из коробки отказывается работать с multicast IPTV по WiFi на стоковой прошивке. dd-wrt тоже не имеет стандартных средств для этого. Вся проблема заключается в том, что мультикаст igmp-траффик сильно "засоряет" WiFi, путем многоадрессной рассылки пакетов по всем адресам внутри сети, а не только на адрес получателя.  Делает это настолько "хорошо", что WiFi просто отваливается. Даже если смотреть IPTV по шнурку, все равно WiFi отвалится. Так как по дефолту WiFi и LAN в бридже.
На своем старом роутере wrt54gl я ставил udpxy - UDP Proxy, который берет мультикаст пакеты из внешнего интерфейса и пересылает на конкретный IP адрес. Таким образом WiFi остается рабочим. Есдинственное "но" - необходимо изменить адрес канала (указать адрес и порт прокси), но об этом чуть позже.
Решил искать скомпиленный udpxy для wrt160nl. Оказалось проблемой, так как другой производитель чипсета (Atheros, а не Broadcom). Нашел на форуме dd-wrt. Один добрый человек скомпилил под Атеросы. Только надо зарегиться, тогда будет видно ссылку.

Далее описаны шаги, как заставить работать udpxy автоматически и автоматически всегда иметь свежий плейлист со списком каналов, адаптированный под udpxy.
  1. Скачиваем этот файл (udpxy).
  2. Далее необходимо разрешить раздел /jffs (Web Interface -> Administration -> Management ).
  3. Заходим на роутер по SSH (клиент любой, самій простой putty). Для этого он должен быть предварительно разрешен (Web Interface -> Services).
  4. Выполняем с консоли:
         mkdir -p /jffs/etc/config
         mkdir /jffs/bin
         mkdir /jffs/iptv  (позже объясню зачем)
  5.  Копируем на роутер файл udpxy в папку /jffs/bin/ :
    • Из под Линукса это можно сделать командой scp:
                scp udpxy root@192.168.1.1:/jffs/bin
    • Из под Windows, предварительно скачав и установив программу WinSCP.
  6. Далее, опять в консоли, выполняем следующее: 
  7.         chmod +x /jffs/bin/udpxy  (делаем файл исполняемым. Можно тоже самое делать с помощью WinSCP - установить атрибут исполняемого файла)

  8. Теперь, либо прямо из консоли посредством vi, либо на компьютере набрать, а потом скопировать любым описанным выше способом создаем файл запуска прокси в папке /jffs/etc/config. 

       vi /jffs/etc/config/udpxy.wanup  

    Разрешение файла .wanup - обязательно. Оно указывает на то, что файл будет запускаться сразу после поднятия внешнего интерфейса, смотрящего к провайдеру. И набираем текст: 

       iptables -I INPUT -d 224.0.0.0/240.0.0.0 -j ACCEPT
       /jffs/bin/udpxy  -p 81 -M 30 -B 256Kb -m 10.10.1.1 -a 192.168.1.1


    Сохраняем. Выходим.
    где:
    -p 81 - порт на котором будет выстявляться во внутреннюю сеть каналы по http протоколу;
    10.10.1.1 - внешний адрес роутера (заменить на свой);
    192.168.1.1 - внутренний адрес роутера (заменить на свой).


  9. Далаем стартовый скрипт исполняемым: 
  10.       chmod +x /jffs/etc/config/udpxy.wanup 
    В принципе по работе самой прокси все. Если теперь рестартонуть роутер - прокся поднимется и будет слушать по 81 порту запросы на получение IPTV. Но есть 1 нюанс. Мультикаст UDP адрес IPTV канала имеет вид: udp://@239.0.0.59:1234 .
    И наша поднятая прокси никак не сможет догадаться, что он нее хотят, если не изменить адрес канала. Необходимо в адресе указать, что надо пойти за каналом на проксю. И адрес канала изменится на следующий: http://192.168.1.1:81/udp/239.0.0.59:1234 . Это необходимо сделать для всего плейлиста со списком каналов. Хорошо если провайдер не меняет список доступных каналов. А если наоборот? И список меняется чуть-ли не каждый день, что характерно для провайдеров, которые только запускают услугу IPTV. Каждый раз менять руками (с помощью текстового редактора) весь плейлист - тяжко и напряжно. Правда в IPTV Player есть возможность указать сетевой интерфейс откуда брать "телевизор". Тогда плейлист можно не менять, а в интерфейс вписать адрес роутера и порт: 192.168.1.1:81. В VLC Media Player я такого не нашел. Может плохо искал. Но решил, что можно сделать и по другому.
  11. Необходимо плейлист менять на роутере, благо все для этого в нем есть, и грузить уже непосредственно с роутера. Необходимо создать в нем скриптовый файлик и сделать его исполняемым: vi /jffs/iptv/iptv_playlist.sh . И вбиваем туда следующий текст:
  12. echo -----------------------------------------------
    echo updating providers iptv playlist from iptv.inet-provider.com  
    echo -----------------------------------------------
    cd /jffs/iptv/
    rm udp_playlist.m3u  
    rm http_playlist.m3u  
    wget http://iptv.inet-provider.com/udp_playlist.m3u
    sed 's|udp://@|http://192.168.1.1:81/udp/|' udp_playlist.m3u > http_playlist.m3u
    echo ----------------------------------  
    echo iptv playlist successfully updated  
    echo ----------------------------------
    где:
    • iptv.inet-provider.com - адрес в сети провайдера, по которому можно найти плейлист;
    • udp_playlist.m3u - плейлист со списком каналов, который нам отдает провайдер, который надо менять;
    • http_playlist.m3u - плейлист со списком каналов, который мы формируем под наш udpxy;
    • 192.168.1.1 - внутренний адрес роутера.
    • После этого делаем его исполняемым: chmod +x jffs/iptv/iptv_playlist.sh 

  13. Аналогично, описанному в шаге 7 создаем файлик: vi /jffs/etc/config/iptv.wanup и вбиваем туда следующий текст: /jffs/iptv/iptv_playlist.sh . Потом делаем его исполняемым, как описано выше. Все, с редактированием файлов закончено. Переходим к настройкам через Web.
  14. Заходим в админку роутера на страницу: Services -> NASРазрешаем ProFTPD сервер. Устанавливаем File Directory: /jffs. Allow Write: Disable. В поле User Password List вбиваем одном строкой: iptv iptv. Anonymous Login (Read-only) запрещаем. Сохраняем результат.
  15. Переходим на страницу Administration -> Management. Разрешаем планировщик заданий cron и вбиваем в поле Additional Cron Jobs задачу, например, ежедневного обновления в 6-00 плейлиста со списком каналов: 0 6 * * * root /jffs/iptv/iptv_maxnet.sh .
  16. Все сохраняем и перезагружаем роутер.
  17. Измененный список каналов теперь доступен по адресу: ftp://iptv:iptv@192.168.1.1/iptv/http_playlist.m3u
  18. Для VLC создается ярлык и правится строка запуска. После самого плеера вбивается этот адрес. Теперь у Вас всегда будет свежий плейлист с каналами.
  19. Для IPTV Player в настройках вбить адрес и указать обновление при запуске.

Теперь, Вам неважно, поменял провайдер список каналов или нет. Он всегда будет обновленным. И не надо менять руками на каждом девайсе список, достаточно указать адрес списка каналов с роутера.


P.S. Данное решение подходит не только для этого роутера. Для любого, под который есть скомпиленный udpxy, и в прошивке есть ftp-server. Изначально решение было создано на роутере TP-Link TL-WR1043ND, но после того, как я его убил перепрошивкой на OpenWRT - Купил Linksys WRT160NL. Кста на OpenWRT это тоже работает, только там я ставил другой ftp-server (не помню какой). Но это и не важно. Можно вместо ftp, использовать http.

(с) william 

16 коментарів:

  1. Вы не знаете как для этого роутера выглядит соответствие физических портов и номеров при задании vlan (прошивка DD-WRT)?

    ВідповістиВидалити
  2. http://wiki.openwrt.org/toh/linksys/wrt160nl - вроде как здесь есть схема соответствия портов.

    ВідповістиВидалити
  3. Я так понял это только для OpewWrt или она универсальная? Я спрашиваю вот в связи с чем, у других роутеров почти всегда среди внутренних портов явно присутствует WAN (обычно под номером 0), а у WRT160NL в схеме по этой ссылке я его не вижу. Т.е. получается на этом роутере невозможно перебросить тегированный трафик (например IPTV) на опредленный физический порт?

    ВідповістиВидалити
  4. Схема скорее всего универсальная. Так как там нет ни слова о программной привязке. внешний порт - интерфейс eth1. На схеме хорошо видно. Пробросом на определенный порт я не занимался. Но когда-то на dd-wrt.com встречал мануалы по этому поводу.

    ВідповістиВидалити
  5. В этом и проблема, что во всех мануалах (по крайней мере которые я встречал) предполагается, что WAN доступен через внутренний порт, а не через интерфейс eth1 как в WRT160NL. Через внутренний порт там вроде всё просто решается через пару простых vlans, с интерфейсом же непонятно с какой стороны заходить.

    ВідповістиВидалити
  6. Похоже этот роутер вообще не поддерживает vlans: "Only Broadcom based devices support port-based VLAN's, no Atheros or Ralink devices. "

    http://dd-wrt.com/wiki/index.php/VLAN_Support

    ВідповістиВидалити
  7. http://www.hermanvandrie.nl/index.php?option=com_content&view=article&id=12:test&catid=4:kpn-glasvezel&Itemid=15 - Вроде как реализовано в OpenWRT Backfire 10.3

    ВідповістиВидалити
  8. Также здесь The VLAN column states whether the Ethernet device is capable of hardware VLANs, means whether the switch can be reprogrammed to generate tagged frames on certain ports, supports trunking etc. Tagged software VLANs (through vconfig) are possible in any case. http://wiki.openwrt.org/toh/start
    Пишут, что должно работать на системном уровне

    ВідповістиВидалити
  9. А то что провайдер выдаёт IPTV в тегированном vlan это не помеха, вышеописанный метод будет работать?

    ВідповістиВидалити
  10. > Вроде как реализовано в OpenWRT Backfire 10.3

    Я пытался, может руки кривые, но столкнулся с той же проблемой что и в DD-WRT: при задании vlan не понятно откуда брать WAN. Кроме того я пытался для якобы заглушки (5-й порт в схеме) задавать случайные значения и у меня роутер вообще повисал, приходилось делать анбрик.

    ВідповістиВидалити
  11. у меня немного проще IPTV идет.

    ВідповістиВидалити
  12. Спасибо!
    Все работает.
    Осталась одна проблемка: после перезагрузки (выключения-включения) роутер WRT160NL на прошивке DD-WRT автоматом не соединяется с провайдером... приходиться заходить через Веб-морду (в настройках ничего не меняется, клонированный МАК остается) и достаточно на Веб-морде нажать "Применить" и вуаля мы в Инете.
    ...нет ли у автора решения для этого случая?

    ЗЫ: есть предположение что автор живет в Харькове :)
    ЗЫ2: поздравляю с возвращением к жизни TP-Link 1043 ND.

    ВідповістиВидалити
  13. arvaroh, читай в блоге. Там есть про MAC-address clone на dd-wrt (http://wrt160nl.blogspot.com/2010/12/dd-wrt-linksys-wrt160nl-mac-addres.html).
    А вообще надо слазить с этой прошивки. Тем более для нее не было обновлений уже больше года. Драйвера WiFi - просто расстраивают. Глюки постоянные.

    З.Ы. Да, я из Харькова.

    ВідповістиВидалити
  14. подскажите как прошить на родную прошивку через винду, если на веб-морду не заходит и сброс не работает...
    как его шить то?

    ВідповістиВидалити