середу, 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 

dd-wrt + linksys wrt160nl и MAC-addres Clone

После установки dd-wrt (rel. 14896) на linksys wrt160nl, обнаружил, что не работает функция MAC-address clone (клонирования MAC-адреса) внешнего сетевого интерфейса, смотрящего к провайдеру. До рестара роутера все работает. После рестарта - снова выставляется аппаратный MAC-адрес.
Поиск в гугле результатов не принес. Кроме того, что проблема есть не только у меня одного.
Решение было найдено. Написал скрипт через веб-морду и сохранил его как стартап скрипт:

ifconfig eth1 down 
killall udhcpc 
ifconfig eth1 hw ether aa:bb:cc:dd:ee:ff 
ifconfig eth1 up 
udhcpc -i eth1 -p /var/run/udhcpc.pid -s /tmp/udhcpc

Где aa:bb:cc:dd:ee:ff - заменить клонированным МАС-адресом. 

После этого - ребут. Все работает. 
Только в веб-морде для WAN интерфейса все равно светится хардварный МАС адрес. ИМХО, это не важно - главное железка работает. 


З.Ы. Это нужно для тех, у кого провайдер жестко привязывается к MAC-адресу устройства.

(c) william