Оглавление:
Статья последний раз была обновлена 04.03.2023
Введение
Сейчас все чаще у провайдеров можно встретить услугу «IPTV» — это цифровое телевидение. Технология, как правило, характеризуется высоким качеством передаваемого изображения и отличным звуком. В этой статье я расскажу о том, как, имея шлюз на основе «Gentoo GNU/Linux», получить возможность пользоваться услугой «IPTV» на всех компьютерах локальной сети.
Схема сети довольно простая. На входе стоит ADSL-модем, включенный в режиме бриджа, за ним стоит шлюз на «Gentoo GNU/Linux», далее идет локальная сеть с несколькими клиентами, которые имеют доступ в интернет через «NAT».
Определимся с именами сетевых интерфейсов. Интерфейс, к которому подключем ADSL-модем, будет «eth0», а интерфейс, смотрящий в локальную сеть — «eth1». Интерфейсу ADSL-модема назначен «10.2.0.1» сетевой адрес с маской «255.255.255.0», соответственно интерфейсу «eth0» назначен сетевой адрес «10.2.0.2» с такой же маской. Локальная сеть имеет диапазон сетевых адресов «192.168.0.0/24», а сетевому интерфейсу «eth1», смотрящего в локальную сеть, назначен «192.168.0.1» сетевой адрес с маской «255.255.255.0». В вашем случае интерфейсы и их сетевые адреса могут отличаться.
Настройка ADSL-модема
Мой провайдер предоставляет доступ к услуге «IPTV» по отдельному соединению, поэтому ADSL-модем должен поддерживать возможность устанавливать несколько соединений с оборудованием провайдера с различными параметрами «VPI/VCI». В моем случае провайдер предоставляет интернет по соединению со следующими параметрами.
ИнтернетEncapsulation = RFC 1483
Multiplexing = LLC-based
VPI #= 1
VCI #= 32
А услуга «IPTV» предоставляется по соединению с такими параметрами.
IPTVEncapsulation = RFC 1483
Multiplexing = LLC-based
VPI #= 1
VCI #= 33
У вас все эти параметры могут быть совершенно другими.
Обязательно проверьте в настройках ADSL-модема включен ли multicast на его сетевом интерфейсе и его версию. В моем случае настройки сетевого интерфейса ADSL-модема выглядят так, как показано ниже.
IP Address = 10.2.0.1
IP Subnet Mask = 255.255.255.0
Multicast = IGMP-v2
На этом настройку ADSL-модема можно считать законченной.
На самом деле не имеет большого значения, какой тип подключения к провайдеру используется. Самое главное чтобы сетевой интерфейс шлюза, смотрящий в сторону провайдера, имел возможность принимать multicast поток. В выводе команды «ifconfig» должно присутствовать слово «MULTICAST».
# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:11:22:33:44:55
inet addr:10.2.0.2 Bcast:10.2.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Interrupt:17
С параметрами внешнего сетевого интерфейса закончили. Идем далее.
Параметры ядра и настройка системы
На шлюзе в конфигурации ядра должен быть включен параметр «IP_MULTICAST».
# cat /usr/src/linux/.config|grep MULTICAST
CONFIG_IP_MULTICAST=y
Так же необходимо добавить роутинг для multicast пакетов на внешнем сетевом интерфейсе «eth0». Это можно сделать следующей командой.
# route add -net 224.0.0.0/4 dev eth0
Или добавить в файл «/etc/conf.d/net» следующую строку.
/etc/conf.d/netroutes_eth0="224.0.0.0/4"
После этого перезапускаем сетевой интерфейс «eth0» и смотрим таблицу роутинга. Должно получится примерно следующее.
# /etc/init.d/net.eth0 restart
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
195.5.5.201 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0
10.2.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
127.0.0.0 127.0.0.1 255.0.0.0 UG 0 0 0 lo
224.0.0.0 0.0.0.0 240.0.0.0 U 4 0 0 eth0
0.0.0.0 195.5.5.201 0.0.0.0 UG 4009 0 0 ppp0
Использование «udpxy»
Самым простым, а иногда и единственным, способом воспользоваться услугой «IPTV» в локальной сети будет организация на шлюзе специального прокси-сервера, который принимает multicast поток, идущий по UDP-протоколу и поступающий на внешний интерфейс, подключенный к провайдеру, и отдает его по запросу со стороны компьютера локальной сети уже по TCP-протоколу.
Таким прокси-сервером является программа «udpxy», о настройке которой и будет рассказано в этой главе.
Кратко расскажу, почему же способ с использованием «udpxy» может являться единственно возможным. При трансляции multicast трафика в локальную сеть все узлы сети начинают принимать этот поток данных. Беспроводные точки доступа, присутствующие в локальной сети, так же начинают пропускать через себя multicast трафик. Но они могут просто захлебнуться от нахлынувших данных и перестают работать.
Так что рассматриваемый способ является наиболее простым и универсальным для реализации поставленной задачи.
Устанавливаем пакет «udpxy».
# emerge udpxy
Пакет «udpxy» всегда можно найти в моем оверлее.
После установки пакета «udpxy» можно проверить работу услуги «IPTV», записав небольшой медиа-файл. Например, если в списке каналов присутствует строка вида «udp://@232.0.2.47:3000», то работу «IPTV» можно проверить так.
# udpxrec -M 10Mb -T -v -c 232.0.2.47:3000 /tmp/test.mpg
При этом будет создан файл «/tmp/test.mpg» размером 10 мегабайт, содержащий небольшой фрагмент телепередачи, который можно просмотреть любым медиа-проигрывателем.
Настройка «udpxy» предельно проста. В файле «/etc/conf.d/udpxy» просто задаем значения параметра «UDPXYOPTS» примерно следующим образом.
/etc/conf.d/udpxyUDPXYOPTS="-a eth1 -p 4022 -m eth0"
Где параметр «-a» — сетевой интерфейс локальной сети, «-p» — порт для приема HTTP-запросов из локальной сети, «-m» — внешний сетевой интерфейс, на который поступает multicast поток со стороны провайдера. Остальные параметры запуска «udpxy» можно просмотреть в выводе команды «udpxy» без параметров.
Запускаем «udpxy» и добавляем сервис «udpxy» в автозапуск.
# /etc/init.d/udpxy start
# rc-update add udpxy default
Осталось только разрешить в правилах файрвола прием запросов на порту, заданного в параметрах опцией «-p», для локальной сети и прием multicast потока на внешнем интерфейсе.
Для «iptables» все просто.
# iptables -A INPUT -i eth0 -d 224.0.0.0/240.0.0.0 -j ACCEPT
# iptables -A INPUT -i eth1 -p tcp --dport 4022 -j ACCEPT
# /etc/init.d/iptables save
Для тех, кто использует программу «shorewall» для генерации правил «iptables», нужно добавить в файл «/etc/shorewall/rules» следующие строки.
/etc/shorewall/rulesACCEPT modem $FW:224.0.0.0/4
ACCEPT loc $FW tcp 4022
При этом файл «/etc/shorewall/interfaces» должен выглядеть примерно так.
/etc/shorewall/interfacesmodem eth0 detect
ppp ppp+ -
loc eth1 detect
Обновим «shorewall».
# /etc/init.d/shorewall refresh
Останется только немного изменить список каналов, предоставленный вашим провайдером. Например, строку вида «udp://@232.0.2.47:3000» надо заменить на «http://192.168.0.1:4022/udp/232.0.2.47:3000». Это можно сделать одной командой, например так, как показано ниже.
# sed -e 's/^udp://@/http://192.168.0.1:4022/udp//' -i playlist.m3u
Открываем полученный список каналов в любом видео-проигрывателе, например в «VLC» или «Kaffeine», и наблюдаем результат.
Использование «igmpproxy»
Программа «igmpproxy» представляет собой программный роутер multicast трафика.
В конфигурации ядра шлюза должен быть включен параметр «IP_MROUTE».
# cat /usr/src/linux/.config|grep IP_MROUTE
CONFIG_IP_MROUTE=y
Устанавливаем пакет «igmpproxy».
emerge igmpproxy
Проверим, какие сетевые интерфейсы позволяют передавать multicast трафик. Немного позже это потребуется.
# cat /proc/net/dev_mcast
2 eth0 1 0 01005e000001
3 eth1 1 0 01005e000001
4 eth2 1 0 01005e000001
Редактируем файл «/etc/igmpproxy.conf».
/etc/igmpproxy.confphyint eth0 upstream ratelimit 0 threshold 1
altnet 10.0.0.0/8
phyint eth1 downstream ratelimit 0 threshold 1
phyint eth2 disabled
В данном примере multicast трафик поступает на внешний сетевой интерфейс «eth0», к которому подключем ADSL-модем, и передается на сетевой интерфейс локальной сети «eth1». На все остальные сетевые интерфейсы передача multicast трафика запрещена. Это видно на примере сетевого интерфейса «eth2».
В файле конфигурации «igmpproxy» необходимо описать все сетевые интерфейсы, имеющие возможность передавать multicast трафик.
Запускаем «igmpproxy» и добавляем его в автозапуск.
# /etc/init.d/igmpproxy start
# rc-update add igmpproxy default
Осталось только настроить файрвол.
Для «iptables».# iptables -A INPUT -d 224.0.0.0/240.0.0.0 -j ACCEPT
# iptables -A INPUT -s 224.0.0.0/240.0.0.0 -j ACCEPT
# iptables -A FORWARD -d 224.0.0.0/240.0.0.0 -j ACCEPT
# iptables -A FORWARD -s 224.0.0.0/240.0.0.0 -j ACCEPT
# /etc/init.d/iptables save
Для пользователей «shorewall» необходимо разрешить прием multicast трафика на всех направлениях. Изменим файл «/etc/shorewall/rules» следующим образом, если файл «/etc/shorewall/interfaces» выглядит так, как показано в предыдущей главе.
/etc/shorewall/rulesACCEPT all $FW:224.0.0.0/4
ACCEPT all modem:224.0.0.0/4
ACCEPT all loc:224.0.0.0/4
После этого обновим «shorewall».
# /etc/init.d/shorewall refresh
Осталось настроить клиентские компьютеры в локальной сети. На них нужно просто разрешить прием multicast трафика.
Для «iptables» будет так.
# iptables -A INPUT -s 224.0.0.0/240.0.0.0 -j ACCEPT
# /etc/init.d/iptables save
Для «shorewall» в файле «/etc/shorewall/rules» добавим следующую строку.
/etc/shorewall/rulesACCEPT all $FW:224.0.0.0/4
Обновим «shorewall».
# /etc/init.d/shorewall refresh
Теперь осталось открыть список каналов, предоставленный провайдером, в любом медиа-проигрывателе и проверить результат.
Прохождение multicast трафика на шлюзе можно просмотреть следующей командой.
# watch cat /proc/net/ip_mr_vif
Решение возможных проблем
Первая проблема может возникнуть с версией IGMP-протокола. Может потребоваться принудительно выставить вторую версию на шлюзе и клиентском компьютере. Сделать это можно, выполнив следующую команду.
# echo 2 >/proc/sys/net/ipv4/conf/all/force_igmp_version
Или добавить в файл «/etc/sysctl.conf» следующую строку.
/etc/sysctl.confnet.ipv4.conf.all.force_igmp_version=2
И затем применить изменения.
# sysctl -p
Другая проблема — это фильтрация пакетов, которые не могут уйти через тот же интерфейс что и пришли. Проверьте установленные значения параметра «rp_filter» и, если он включен, то отключите его.
# echo 0 >/proc/sys/net/ipv4/conf/default/rp_filter
# echo 0 >/proc/sys/net/ipv4/conf/all/rp_filter
Это же самое можно сделать, отредактировав файл «/etc/sysctl.conf».
/etc/sysctl.confnet.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
И применив его следующей командой.
# sysctl -p
Еще одной проблемой может являться низкий «TTL» multicast пакетов, приходящих от провайдера. Для того, чтобы увеличить «TTL», нужно выполнить следующее.
# modprobe ipt_TTL
# iptables -t mangle -A PREROUTING -d 224.0.0.0/240.0.0.0 -j TTL --ttl-inc 1
# /etc/init.d/iptables save
Заключение
Какой из двух представленных способов выбрать для организации вещания «IPTV» в локальную сеть — каждый решает сам. Мне нравится первый способ с использованием «udpxy», так как он решает проблему с беспроводными сегментами моей сети и проще в настройке. Хотя способ с применением «igmpproxy» — более правильный, так как при просмотре одного и того же канала несколькими клиентами в локальной сети, нагрузка на сеть не увеличится, как в случае с использованием «udpxy».
http://mrcat.ru/iptv-local-network
- Как узнать IP-адрес по MAC-адресу - 07.04.2023
- Пинг проходит, а страницы в браузере не открываются - 07.04.2023
- Что если сайт пингуется «извне», но не открывается из под «локалки»? - 07.04.2023