Posted: Wed Feb 02, 2011 18:16 Post subject: IPTV через UDPXY Общая инструкция
!!!Работает на процах AR23**!!! проверено на dlink dir-300 rev.A и DIR-400
Проверено на моделях TP-LINK TL-WR1043ND, TL-WR741ND. Будет работать на большинстве процов Atheros.
Написаное ниже выполнялось на TL-WR741ND (в нем нет поддержки JFFS2, файл сохранить некуда)
"Безопасноcть-Брандмауэр"
Защита с помощью брандмауэра - оставляем "Включить"
чекбокс "Безопасность-Брандмауэр Фильтр многоадресных потоков" оставляем включеным
"Техобслуживание-Команды"
Code:
wget http://xkr446.hotbox.ru/udpxy -P /tmp
chmod +x /tmp/udpxy
/tmp/udpxy -p 82 -M 30 -B 1Mb -a `nvram get lan_ipaddr`
Сохр. параметры запуска
==============
Для DIR-300
Code:
wget http://xkr446.hotbox.ru/ar23/udpxy -P /tmp
chmod +x /tmp/udpxy
/tmp/udpxy -p 82 -M 30 -B 256kb -a `nvram get lan_ipaddr`
-M 30 - периодически возобновлять подписку на мультикаст-канал [по
умолчанию - 0 (секунд), т.е. не возобновлять]
-p 82 - порт на котором UDPXY принимает подключения (если занят, можно указать любой другой незанятый)
-B 1Mb - буфер UDPXY (мне хватает одного мегабайта)
-i eth0 - интерфейс на который провайдер вещает IPTV (у меня этот, у вас может быть другой)
239.0.0.0/8 --dport 1224 - подсеть и порт с которой вещают IPTV
iptables -D INPUT -p igmp -j DROP - это удаляет в IPTABLES правило режущее igmp трафик.(у меня без него не показывает)
Все. Правим плейлист, или настраиваем IPTVPlayer и наслаждаемся IPTV хоть по кабелю, хоть по вайфаю.
UPD1: У кого в роутере есть место на флешке или в JFFS2 файл можно положить туда, и запускать непосредственно с роутера.
UPD2: Мне кажется что вычисление источников по методу DJArtyUA будет несколько сложно для рядового пользователя, тем более пользователя windows, поэтому правила фаера оставляю как есть.
Брать lan_ipaddr из nvram вполне разумная мысль. Спасибо. Поправил.
UPD3: исправил подсеть с 239.0.0.0/20 на 239.0.0.0/8
По наблюдениям, люди тупо копипастят эту подсеть в фаер, а у них например c 239.1.1.1:1234 вещание прет.
Может неправильно идеологически, но кому надо сообразят и исправят на подсеть поменьше, а у тех кому не надо, будет достигнут желаемый результат.
UPD4: на DIR-300 rev.A все таки сильно проц нагружается. Прям почти под сотку процентов. Но в один поток смотреть можно.
UPD5: на DIR-400 тоже запустили успешно
http://dd-wrt.com/phpBB2/viewtopic.php?p=541188#541188
Однако пишут что смотреть невозможно.
UPD6: Если вы счастливый пользователь Windows операционки, и пользуетесь IPTVPlayer, то плейлист можно не исправлять
Достаточно указать ip адрес и порт который слушает ваш настроеный udpxy в настройках. Скриншот прилагается:
Для linux-систем я пользуюсь простым скриптом:
-a 192.168.50.31 - локальный IP адрес вашего роутера (у вас другой)
что именно понимается? Адрес роутера в моей внутренней сети, который я сам назначил (типа 192.168.1.30) или тот адрес, который провайдер назначает WAN-порту (типа 172.27.25.50)? Дело в том что у меня IPTV поступает на тот же порт что и весь остальной инет, на WAN, а "провайдерский" IP тоже можно локальным назвать, если это не "белый" Real-IP, отсюда и вопрос...
И еще, не подскажете, в команде
Code:
/tmp/udpxy -p 82 -M 30 -B 1Mb -a 192.168.50.31
что обозначает параметр -М? Просто интересно
P.S. Сам пакет UDPXY я смотрю считанные килобайты весит, так если роутер позволяет, немного места в /jffs есть (у меня на TL-1043ND 700Kb есть свободных к примеру), может целесообразнее пакет не качать каждый раз, а 1 раз телнетом положить его в /jffs, там же изменить на него права
Posted: Wed Feb 09, 2011 19:17 Post subject: Re: IPTV через UDPXY Общая инструкция
XsoWie wrote:
Написаное ниже выполнялось на TL-WR741ND (в нем нет поддержки JFFS2, файл сохранить некуда)
"Безопасноcть-Брандмауэр"
Защита с помощью брандмауэра - оставляем "Включить"
чекбокс "Безопасность-Брандмауэр Фильтр многоадресных потоков" оставляем включеным
и.... VLC не пашет. Говорит:
[0x875c688] main stream error: cannot pre fill buffer
[0x845a038] main access error: Read error: Соединение сброшено другой стороной
Запускаю на роутере (192.168.10.100 - IP роутера):
root@wrt:~# /tmp/udpxy -p 82 -M 30 -B 1Mb -a 192.168.10.100 -v -T
2011-02-09 22:00:20.499643 UTC 1452 udpxy 1.0-Chipmunk (build 16) standard: /tmp/udpxy -p 82 -M 30 -B 1Mb -a 192.168.10.100 -v -T
2011-02-09 22:00:20.500041 UTC 1452 Starting server [1452]; capacity=[3] clients
2011-02-09 22:00:20.500344 UTC 1452 Setting up listener for [192.168.10.100:82]
2011-02-09 22:00:20.500661 UTC 1452 Server socket=[6] is set up
2011-02-09 22:00:20.500817 UTC 1452 Entering server loop
2011-02-09 22:00:27.030104 UTC 1452 Accepted socket=[8]
2011-02-09 22:00:27.030359 UTC 1452 Reading command from socket [8]
2011-02-09 22:00:27.032354 UTC 1452 Request=[udp/239.0.1.1:5000], length=[18]
2011-02-09 22:00:27.032988 UTC 1452 Command [udp] with params [239.0.1.1:5000] read from socket=[8]
2011-02-09 22:00:27.033227 UTC 1452 udp_relay : new_socket=[8] param=[239.0.1.1:5000]
2011-02-09 22:00:27.035772 UTC 1452 Client process=[1457] started for socket=[8]
2011-02-09 22:00:27.036482 UTC 1457 min socket buffer = [65536], max space to use = [1500], Rmsgs = [1]
2011-02-09 22:00:27.036867 UTC 1457 Setting up multicast listener
2011-02-09 22:00:27.037154 UTC 1457 current receive buffer size is [112640] bytes for socket [4]
2011-02-09 22:00:27.038181 UTC 1457 multicast-group [ADD]
2011-02-09 22:00:27.038379 UTC 1457 Mcast listener socket=[4] set up
2011-02-09 22:00:27.038534 UTC 1457 min socket buffer = [65536], max space to use = [1500], Rmsgs = [1]
2011-02-09 22:00:27.038784 UTC 1457 Data buffer will hold up to [1] messages
2011-02-09 22:00:27.039260 UTC 1457 UDP stream, RTP check enabled
2011-02-09 22:00:27.039514 UTC 1457 current send buffer size is [16384] bytes for socket [8]
2011-02-09 22:00:27.039716 UTC 1457 current receive buffer size is [112640] bytes for socket [4]
2011-02-09 22:00:27.039899 UTC 1457 send buffer size set to [112640] bytes for socket [8]
2011-02-09 22:00:27.040316 UTC 1457 Sent HTTP response code=[200], reason=[OK] to socket=[8]
2011-02-09 22:00:27.040865 UTC 1457 Relaying traffic from socket[4] to socket[8], buffer size=[1048576], Rmsgs=[1], pauses=[0]
2011-02-09 22:00:27.041278 UTC 1452 Added client: pid=[1457], maddr=[239.0.1.1], mport=[5000], saddr=[192.168.10.1], sport=[34604]
2011-02-09 22:00:27.041564 UTC 1452 Closed accepted socket [8]
2011-02-09 22:00:32.035061 UTC 1457 read_buf: read: Resource temporarily unavailable
2011-02-09 22:00:32.035229 UTC 1457 read_data - EOF
2011-02-09 22:00:32.035358 UTC 1457 Exited relay loop: received=[-1], sent=[0], quit=[0]
2011-02-09 22:00:32.036182 UTC 1457 multicast-group [DROP]
2011-02-09 22:00:32.036525 UTC 1457 Mcast listener socket=[4] closed
2011-02-09 22:00:32.036991 UTC 1457 Child process=[1457] exits with rc=[0]
2011-02-09 22:00:32.037625 UTC 1452 *** Caught SIGCHLD in process=[1452] ***
2011-02-09 22:00:32.037961 UTC 1452 Client [1457] has exited.
2011-02-09 22:00:32.038114 UTC 1452 Deleted client: pid=[1457]
Всё. Хоть убейся. падает процесс и все тут. в статусе (http://192.168.10.100:82/status) пишет:
udpxy status:
Server Process ID Accepting clients on Multicast address Active clients
1452 192.168.10.100:82 0.0.0.0 1
Active clients:
Process ID Source Destination Throughput
1528 192.168.10.1:38774 239.0.1.2:5000 N/A
Что я делаю не так? Ни под линуксом на проводе, ни под виндой на проводе/вафле не кажет.
ЗЫ: На линуксовом сервере, в свое время, тоже не получалось запустить udpxy. И штатный в DD-WRT igmp-прокси не работает в моем случае... Зато без проблем все работает с родной прошивкой от WR741ND. Но там нет VPN-сервера, а мне он нужен. Плюс в DD-WRT WiFi постоянно отваливается - приходится перегружать роутер (применять настройки WiFi).
Фильт многоадресных потоков - галочка видимо убрана. Надо чтоб стояла. Когда галку убираешь включается автоматом igmproxy.
Давайте попробуем так:
При текущей настройке, без udpxy, без правки плейлиста, при подключении по кабелю iptv показывает?
1. Firewall включен, мультикаст не фильтруется.
#EXTINF:0,Первый канал
udp://@239.195.0.1:1234
Пытаюсь смотреть напрямую - на экране квадраты с ошметками изображения, звука преимущественно нет, vlc ругается в духе: libdvbpsi error (PSI decoder): TS duplicate (received 5, expected 6) for PID 105 и через некоторое время падает в корку. И так по всем каналам. Бывают откровения - минут 5 может поработать, потом опять падает.
2. Firewall отключен. см. п. 1.
3. UDPXY. Фильтр мультикаста включен.
ifconfig eth1 1.1.1.1 netmask 255.255.255.0 broadcast 1.1.1.255
wget http://seekwell.ru/files/udpxy -P /tmp
chmod +x /tmp/udpxy
/tmp/udpxy -p 82 -M 30 -B 1Mb -a 192.168.10.100
iptables -I INPUT -i eth0 -p udp -d 239.0.0.0/20 --dport 1234 -j ACCEPT
iptables -D INPUT -p igmp -j DROP
не понял. порт в плейлисте всетаки 1234 или 5000 ??
Везде пишут что при использовании udpxy надо 1234 менять на 5000. И так пробовал, и эдак - безрезультатно.
Quote:
у вас подсеть вещания другая, соответсвенно в правило фаера надо свою подсеть прописывать
например 239.195.0.0/20
точнее можно по плейлисту вычислить.
выложите плейлист сюда.
Похоже, действительно, провайдер глючит... Напрямую под виндой плеер нормально поработал несколько минут и сдох. Теперь сыплет такие же квадраты, что и через роутер.
Буду разбираться с провайдером. Большое спасибо за помощь!
Видимо, в моем случае дело не в кривизне igmproxy, а в кривизне самого потока, который приходит на интерфейс.
Приветствую!
Освоил ещё один вариант с включенным SPI и Multicast filter.
Сложнее для определения но возможно правильнее политически
1. Нужно определить адрес источника мультикаста.
Code:
tcpdump -i $(nvram get wan_ifname) -n -p udp port 1234 and host 238.0.0.1
где 238.0.0.1 и 1234 канал и порт на который подключаемся плеером.
На выходе смотрим на что-то типа такого
00:20:07.717562 IP 10.5.200.1.1234 > 238.0.0.1.1234: UDP, length:...
и з чего делаем вывод о источнике 10.5.200.1. У меня он постоянный, но может быть и из диапазона.
2. И определить адрес следящего IGMP роутера.
Code:
tcpdump -i $(nvram get wan_ifname) -p igmp -n
и включив канал следим за выводом похожим на
22:30:56.616203 IP 10.39.36.10 > 224.0.0.1: igmp query v2
берём то что с igmp query -> 10.39.36.10 это он следит за нашими запросами и живучестью (часто айпишник гейтвея).
Главная проблема это то что tcpdump нет по умолчанию на многих прошивках. Соответственно что бы не заморачиваться, можно поиск делать напрямую соединившись с компа. При этом tcpdump есть на линуксах и уж не знаю что там с виндой.
Так вот, определивши эти два айпишника добавляем правила в фаерволл (в начало правил, инсертом)
типа:
можно конкретизировать протоколы и порты (-p udp --dport 1234) но я пока не заморачивался.
Таким макаром правила SPI фаервола не трогаем но IPTV при этом работает.
Это ж только часть касающаяся правил, а остальное касающееся самого udpxy оставляем так же как и у топикстартера в первом посту (без тех двух правил iptables)...
Правда могу предложить ещё такой вариант для пуска udpxy как раз для тех кто не понимает какие айпишники подставлять.
Code:
/tmp/udpxy -a $(nvram get lan_ipaddr) -m $(nvram get wan_ipaddr) -p 82 -c 3