Страница 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
и все ринулись разбирать портянку...
====
оформи нормально, и дай

Код: Выделить всё

 ipfw show

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 add igmp from any to any
. А лучше погуглите на предмет ipfw + igmp

Re: iptv через FreeBSD шлюз

Добавлено: 2007-11-27 18:03:54
kind21
Дак вроде политика разрешать всё стоит....

Код: Выделить всё

allow ip from any to any
Должно и так проходить....

Хотя...
Всё равно попробовал твоё предложение и всё равно не работает....

Код: Выделить всё

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 в обе стороны:

Код: Выделить всё

ipwf add allow udp from any to any
чтобы мультикаст ходил в обе стороны нужно статически роутить широковещательные сети на 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

Код: Выделить всё

igmpproxy_enable="YES"
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