Страница 1 из 1
iptv через FreeBSD шлюз
Добавлено: 2007-11-25 20:46:30
kind21
Здравствуйте.
У меня в сети провайдер начал вещать iptv через широковещание(multicast).
Дома 3 компа и шлюз.
Шлюз:
FreeBSD 6.2 , NatD, IPFW.
Захотелось очень смотреть tv на компьютерах внутри сети. И тут возникли проблемы.
Поиск информации в инете дал 2 программки: mroute и igmpproxy(адаптированную под FreeBSD).
Также было пересобрано ядро с добавлением опции MROUTED.
Ни одна из программ не помогла решить задачу.
Т.е. программки запускаются и в режиме отладки видно что пакеты multicast проходят во внутреннюю сеть и выходят из неё.
Смотрю траффик на одном из компьютеров внутренней сети, пакеты действительно проходят, но телевизер так и не заработал(vlc)....
Прошу помощи, как решить проблему....
И вообще возможно ли это реализовать на Фре?
Re: iptv через FreeBSD шлюз
Добавлено: 2007-11-26 9:16:03
AzureZ
Делал в свое время такое. Заработал прадва только igmpproxy и то криво както. Если быстро каналы листать то машина вешается намертво без каких либо сообщений. Сам igmpproxy там настроек почти нет. если не кажет то копайте фаервол
Re: iptv через FreeBSD шлюз
Добавлено: 2007-11-26 19:30:11
kind21
На роутере 2 интерфейса
rl0 - внутренний 192.168.0.1/255.255.255.0
vr0 - внешний 84.22.135.154/255.255.255.252
Группа для вещания, например 239.192.1.1
igmpproxy.conf:
Код: Выделить всё
phyint vr0 upstream ratelimit 0 threshold 1
altnet 239.192.1.1
phyint rl0 downstream ratelimit 0 threshold 1
rc.ipfw:
Код: Выделить всё
#!/bin/sh
ipfw="/sbin/ipfw -q"
if_int="rl0"
if_ext="vr0"
ip_int="192.168.0.1"
net_int="192.168.0.0/24"
#На всякий пожарный
${ipfw} add 10 allow ip from any to any ssh via ${if_int}
#Разрешаем пакеты на lo0
${ipfw} add 100 allow all from any to any via lo0
#Блокируем ssh извне
${ipfw} add 1100 deny ip from any to any ssh in via ${if_ext}
#Блокируем Apach из вне
${ipfw} add 1200 deny ip from any to any 80 in via ${if_ext}
#Блокируем Samba из вне
${ipfw} add 1300 deny ip from any to any 901 in via ${if_ext}
#natd
${ipfw} add 39000 tee 10001 ip from any to any out xmit ${if_ext}
${ipfw} add 40000 divert natd all from any to any via ${if_ext}
${ipfw} add 41000 tee 10001 ip from any to any in recv ${if_ext}
${ipfw} add 65000 allow all from any to any
Опции ядра:
Код: Выделить всё
machine i386
#cpu I486_CPU
#cpu I586_CPU
cpu I686_CPU
ident gate
options IPFIREWALL # Включаем FireWall
options IPFIREWALL_VERBOSE # Добавляем возможность логгирования
options IPFIREWALL_VERBOSE_LIMIT=100 # Ограничение на кол-во логов
options IPFIREWALL_DEFAULT_TO_ACCEPT # allow from any to any
options IPDIVERT # Включаем перенаправление пакетов
options DUMMYNET # Включаем возможность ограничивать скорость
options IPFIREWALL_FORWARD # Включаем Форвардинг портов
options MROUTING # Включаем мультикаст
options IPSTEALTH # Чтобы не менялся ttl пакетов, для мультикаста iptv
igmpproxy -d, в момент включения vlc на машине внутри выдаёт следующую картину:
Код: Выделить всё
igmpproxy, Version 0.1 beta3 for FreeBSD, Build 071123
Copyright 2005 by Johnny Egeland <johnny@rlo.org>
Copyright 2007 by Pavel Korshunov, http://www.korshunov.com
Distributed under the GNU GENERAL PUBLIC LICENSE, Version 2 - check GPL.txt
Debu: Searching for config file at '/usr/local/etc/igmpproxy.conf'
Debu: Config: Got a phyint token.
Debu: Config: IF: Config for interface vr0.
Debu: Config: IF: Got upstream token.
Debu: Config: IF: Got ratelimit token '0'.
Debu: Config: IF: Got threshold token '1'.
Debu: Config: IF: Got altnet token 239.192.1.1/24.
Debu: Config: IF: Altnet: Parsed altnet to 239.192.1/24.
Debu: IF name : vr0
Debu: Next ptr : 0
Debu: Ratelimit : 0
Debu: Threshold : 1
Debu: State : 1
Debu: Allowednet ptr : 8053040
Debu: Config: Got a phyint token.
Debu: Config: IF: Config for interface rl0.
Debu: Config: IF: Got downstream token.
Debu: Config: IF: Got ratelimit token '0'.
Debu: Config: IF: Got threshold token '1'.
Debu: IF name : rl0
Debu: Next ptr : 0
Debu: Ratelimit : 0
Debu: Threshold : 1
Debu: State : 2
Debu: Allowednet ptr : 0
Debu: get if vector
Debu: Searching for config file at 'rl0':65554:0:2
Debu: Searching for config file at 'rl0':2:0:2
Debu: Physical Index value of IF 'rl0' is 1
Debu: buildIfVc: Interface rl0 Addr: 192.168.0.1, Flags: 0xffff8843, Network: 192.168.0/24
Debu: Searching for config file at 'vr0':131090:0:2
Debu: Searching for config file at 'vr0':2:0:2
Debu: Physical Index value of IF 'vr0' is 2
Debu: buildIfVc: Interface vr0 Addr: 84.22.135.154, Flags: 0xffff8843, Network: 84.22.135.152/29
Debu: Searching for config file at 'plip0':196626:0:2
Debu: Searching for config file at 'lo0':262162:0:2
Debu: Searching for config file at 'lo0':28:0:2
Debu: Searching for config file at 'lo0':28:0:2
Debu: Searching for config file at 'lo0':2:0:2
Debu: Physical Index value of IF 'lo0' is 4
Debu: buildIfVc: Interface lo0 Addr: 127.0.0.1, Flags: 0xffff8049, Network: 127/8
Debu: Found config for rl0
Debu: Found config for vr0
Note: adding VIF, Ix 0 Fl 0x0 IP 0x0100a8c0 rl0, Threshold: 1, Ratelimit: 0
Debu: Network for [rl0] : 192.168.0/24
Note: adding VIF, Ix 1 Fl 0x0 IP 0x9a871654 vr0, Threshold: 1, Ratelimit: 0
Debu: Network for [vr0] : 84.22.135.152/29
Debu: Network for [vr0] : 239.192.1/24
Debu: Got 232448 byte buffer size in 8 iterations
Debu: Joining all-routers group 224.0.0.2 on vif 192.168.0.1
Note: joinMcGroup: 224.0.0.2 on rl0
Debu: SENT Membership query from 192.168.0.1 to 224.0.0.1
Debu: Sent membership query from 192.168.0.1 to 224.0.0.1. Delay: 10
Debu: All Created timeout 1 (#0) - delay 10 secs 134531520
Debu: (Id:1, Time:10)
Debu: All Created timeout 2 (#1) - delay 21 secs 134528968
Debu: (Id:1, Time:10)
Debu: (Id:2, Time:21)
Note: RECV V2 member report from 192.168.0.1 to 224.0.0.2
Note: The IGMP message was from myself. Ignoring.
Note: RECV Membership query from 192.168.0.1 to 224.0.0.1
Info: ignoring unknown IGMP message type 11 from 192.168.0.1 to 224.0.0.1
Note: RECV V2 member report from 192.168.0.1 to 224.0.0.2
Note: The IGMP message was from myself. Ignoring.
Note: RECV Membership query from 10.0.0.90 to 224.0.0.1
Info: ignoring unknown IGMP message type 11 from 10.0.0.90 to 224.0.0.1
Note: RECV V2 member report from 192.168.0.3 to 239.192.1.1
Debu: Should insert group 239.192.1.1 (from: 192.168.0.3) to route table. Vif Ix : 0
Debu: No existing route for 239.192.1.1. Create new.
Debu: No routes in table. Insert at beginning.
Info: Inserted route table entry for 239.192.1.1 on VIF #0
Debu: Joining group 239.192.1.1 upstream on IF address 84.22.135.154
Note: joinMcGroup: 239.192.1.1 on vr0
Debu:
Current routing table (Insert Route);
-----------------------------------------------------
Debu: #0: Src: 0.0.0.0, Dst: 239.192.1.1, Age:2, St: I, OutVifs: 0x00000001
Debu:
-----------------------------------------------------
Note: RECV V2 member report from 84.22.135.154 to 239.192.1.1
Note: The IGMP message was from myself. Ignoring.
Note: RECV V2 member report from 84.22.135.154 to 239.192.1.1
Note: The IGMP message was from myself. Ignoring.
Note: RECV Leave message from 192.168.0.3 to 224.0.0.2
Debu: Got leave message from 192.168.0.3 to 239.192.1.1. Starting last member detection.
Debu: SENT Membership query from 192.168.0.1 to 239.192.1.1
Debu: Sent membership query from 192.168.0.1 to 239.192.1.1. Delay: 10
Debu: While Created timeout 3 (#1) - delay 3 secs
Debu: (Id:1, Time:7)
Debu: (Id:3, Time:3)
Debu: (Id:2, Time:18)
Note: RECV Membership query from 10.0.0.90 to 224.0.0.1
Info: ignoring unknown IGMP message type 11 from 10.0.0.90 to 224.0.0.1
Note: RECV V2 member report from 84.22.135.154 to 239.192.1.1
Note: The IGMP message was from myself. Ignoring.
Note: RECV V2 member report from 84.22.135.154 to 239.192.1.1
Note: The IGMP message was from myself. Ignoring.
Debu: About to call timeout 1 (#0)
Debu: Aging routes in table.
Debu:
Current routing table (Age active routes);
-----------------------------------------------------
Debu: #0: Src: 0.0.0.0, Dst: 239.192.1.1, Age:2, St: I, OutVifs: 0x00000001
Debu:
-----------------------------------------------------
Note: RECV Membership query from 10.0.0.90 to 224.0.0.1
Info: ignoring unknown IGMP message type 11 from 10.0.0.90 to 224.0.0.1
Debu: About to call timeout 3 (#0)
Debu: SENT Membership query from 192.168.0.1 to 239.192.1.1
Debu: Sent membership query from 192.168.0.1 to 239.192.1.1. Delay: 10
Debu: While Created timeout 4 (#0) - delay 10 secs
Debu: (Id:4, Time:10)
Debu: (Id:2, Time:8)
Note: RECV V2 member report from 84.22.135.154 to 239.192.1.1
Note: The IGMP message was from myself. Ignoring.
Note: RECV V2 member report from 84.22.135.154 to 239.192.1.1
Note: The IGMP message was from myself. Ignoring.
Note: RECV Membership query from 10.0.0.90 to 224.0.0.1
Info: ignoring unknown IGMP message type 11 from 10.0.0.90 to 224.0.0.1
Note: RECV V2 member report from 84.22.135.154 to 239.192.1.1
Note: The IGMP message was from myself. Ignoring.
Note: RECV V2 member report from 84.22.135.154 to 239.192.1.1
Note: The IGMP message was from myself. Ignoring.
Note: RECV Membership query from 10.0.0.90 to 224.0.0.1
Info: ignoring unknown IGMP message type 11 from 10.0.0.90 to 224.0.0.1
Debu: About to call timeout 4 (#0)
Debu: Removing group 239.192.1.1. Died of old age.
Debu: Removed route entry for 239.192.1.1 from table.
Note: Route is not active. No kernel updates done.
Debu: Leaving group 239.192.1.1 upstream on IF address 84.22.135.154
Note: leaveMcGroup: 239.192.1.1 on vr0
Debu:
Current routing table (Remove route);
Не подскажете, всё ли правильно настроено?
Или может где-то ошибся?
Re: iptv через FreeBSD шлюз
Добавлено: 2007-11-26 19:31:40
Alex Keda
и все ринулись разбирать портянку...
====
оформи нормально, и дай
Re: iptv через FreeBSD шлюз
Добавлено: 2007-11-26 19:53:37
kind21
Вот:
ipfw show
Код: Выделить всё
00010 709 54896 allow ip from any to any dst-port 22 via rl0
00100 32 1984 allow ip from any to any via lo0
01100 0 0 deny ip from any to any dst-port 22 in via vr0
01200 0 0 deny ip from any to any dst-port 80 in via vr0
01300 0 0 deny ip from any to any dst-port 901 in via vr0
39000 6382 2884917 tee 10001 ip from any to any out xmit vr0
40000 113526 141789326 divert 8668 ip from any to any via vr0
41000 107082 138821081 tee 10001 ip from any to any in recv vr0
65000 124703 146806076 allow ip from any to any
65535 0 0 deny ip from any to any
Re: iptv через FreeBSD шлюз
Добавлено: 2007-11-27 9:35:40
AzureZ
Не селен в ipfw. Попробуйте добавить еще
. А лучше погуглите на предмет ipfw + igmp
Re: iptv через FreeBSD шлюз
Добавлено: 2007-11-27 18:03:54
kind21
Дак вроде политика разрешать всё стоит....
Должно и так проходить....
Хотя...
Всё равно попробовал твоё предложение и всё равно не работает....
Код: Выделить всё
00010 1975 134396 allow ip from any to any dst-port 22 via rl0
00100 2694 170712 allow ip from any to any via lo0
01100 9 528 deny ip from any to any dst-port 22 in via vr0
01200 0 0 deny ip from any to any dst-port 80 in via vr0
01300 0 0 deny ip from any to any dst-port 901 in via vr0
39000 123871 7194430 tee 10001 ip from any to any out xmit vr0
40000 502511 503659430 divert 8668 ip from any to any via vr0
41000 378639 496463656 tee 10001 ip from any to any in recv vr0
42000 17 496 allow igmp from any to 224.0.0.0/24
65000 815110 761129578 allow ip from any to any
65535 0 0 deny ip from any to any
Думаю в чём то другом причина...
Только куда копать уже не знаю..
Re: iptv через FreeBSD шлюз
Добавлено: 2007-11-27 20:27:22
kind21
Проследил tcpdump'ом ход пакетов,
так вот пакеты наружу посылаются, а внутрь ничего не проходит...
может и в правилах ipfw чего напутал...
т.е. на сколько понимаю надо чтобы igmp пакеты проходили внутрь....
кто силён в ipfw подскажите всё правильно?
Re: iptv через FreeBSD шлюз
Добавлено: 2008-06-09 12:10:16
freeman
Случайно наткнулся в инете и вспомнил этот вопрос.
options MROUTING и options PIM - в ядре включал ? Для 6-ок говорят необходимо.
нашёл тут.
Re: iptv через FreeBSD шлюз
Добавлено: 2008-06-09 19:40:45
zingel
Для начала стоит разрешить UDP в обе стороны:
чтобы мультикаст ходил в обе стороны нужно статически роутить широковещательные сети на in интерфейс, иначе ничего не заработает, это один из самых тупейших багов IGMP:
Код: Выделить всё
static_routes="static1 static2"
route_static1="-net 224.0.0.0/8 -iface vr0"
route_static2="-net 233.163.114.0/24 -iface vr0"
route_static3="-net 84.22.135.154/28" -face vr0"
потом, тупо транслировать поток,через VLC (udp-multicast):
Код: Выделить всё
vlc -vvv input_stream --sout '#duplicate{dst=
standard{access=udp,mux=ts,url=239.192.1.1,sap,name="TestStream"},
dst=standard{access=udp,mux=ts,url=192.168.0.1}}'
RTP-streming:
Код: Выделить всё
vlc -vvv input_stream --sout '#rtp{dst=192.168.0.1,port=1234,sdp=http://server.example.org:8080/test.sdp}'
Re: iptv через FreeBSD шлюз
Добавлено: 2008-06-15 17:00:28
kind21
В общем проблему рашил так:
Есть под линукс программка igmpproxy, она как раз транслирует траффика по протоколу IGMP с внешнего на внутренний интерфейс.
нашлись умельцы переделавшие её под freeBSD.
Вот её то и воспользовался.
1. Собрал ядро:
Код: Выделить всё
#Включаем поддержку multicast
options MROUTING
2. Установил igmpProxy.
/usr/local/etc/igmpproxy.conf
Код: Выделить всё
#Чтобы быстро переключалися каналы
quickleave
#Входящий поток, внешняя сеть
phyint vr0 upstream
#Исходящий, внутрення сеть
phyint rl0 downstream
/etc/rc.conf
3. Перенаправил порт 1234 с внешнего интерфейса на внутренний.
Сделал это при помощи PORTFWD потому как ipfw не победил...
В результате работает.
Единственно что не устраивает так это то, что перенаправление могу делать только на один комп...
соответсвенно все остальные отсекаются....
пока не придумал как победить...
У кого-нибудь есть идеи?
ps: на сколько я понимаю через vlc тоже будет работать только для одного компа...
только ещё и каналы на фрюхе листать придётся...
Re: iptv через FreeBSD шлюз
Добавлено: 2008-06-15 19:22:07
zingel
мультикаст он на то и мультикасть, что от одного ко всем, нужно перенаправить поток на мультикаст домен, и тогда этот поток смогут ловить все те, кто имеет настройки одинаковые с Вашим бродкаст доменом, другими словами смогут получать udp-рассылку все те кто в Вашей подсети, вот для этого нужно накинуть диапазоны мультикаст сетей на те интерфейсы, через которые Выхотите вешать в сеть, делается через статичный роутинг, силами rc.conf, igmpproxy вещает по-схеме (если тупо) UDP-multicast -> udp-socket -> bind -> listen, предоставляя юзерлед основы igmp-snooping, то отдает поток только на определнный порт, который ждеёт подключения, организуя схему клиент-сервер, vlc же транслирует мультикаст на всю сеть, Вам необходимо запускать vlc следующим образом
Код: Выделить всё
vlc xxx.xx.xx.xx:yy --sout udp:233.163.114.152:yyyy --ttl=3
xxx.xx.xx.xx - адрес источника потока (откуда Вы будите брать мультикаст или можно вставить адрес igmp-proxy)
yy - порт вещания (что в первой команде, что во-второй он одинкаков)
233.163.114.152 - адрес мультикаст домена, он должен быть такой или похожий на этот
Re: iptv через FreeBSD шлюз
Добавлено: 2008-12-21 1:06:42
leksey