Современные технологии открывают нам достаточно широкие перспективы, особенно это касается мультимедийной составляющей. Сегодня собственным онлайн-вещанием никого не удивишь, более того оно становится просто обыденностью. Хотите удаленно слушать собственную музыкальную коллекцию? Или вам нужно организовать централизованную трансляцию в сети магазинов? Во всех этих случаях вас выручит создание собственного сервера онлайн-вещания. В данной статье мы рассмотрим, как сделать это при помощи бесплатного пакета Icecast 2 и организуем SSL-защиту при помощи сертификатов Let's Encrypt.
Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Установка и настройка Icecast 2
Icecast 2 - свободная реализация сервера потокового вещания использующий для этого протокол HTTP, что делает его универсальным и совместимым со множеством проигрывателей и клиентов. Пакет присутствует в стандартных репозиториях и для его установки следует воспользоваться командой:
apt install icecast2
В конце установки появится предложение выполнить начальную конфигурацию пакета, вы можете как согласиться, так и отказаться, выполнив все настройки в конфигурационном файле позже.
Если вы ответили согласием, то вам потребуется ввести полное доменное имя (FQDN) вашего сервера. Вы, конечно, можете использовать короткое имя, несуществующий домен или IP-адрес, но в этом случае вы не сможете получить сертификат Let's Encrypt. В нашем случае будет использоваться доменное имя stream.it-31.ru
Затем вас попросят указать три пароля, два из них будут использоваться для подключения источников вещания, третий для входа в веб-панель администратора.
При установке автоматически создается юнит сервиса Systemd и автоматически добавляется в автозагрузку. Мы же пока откроем конфигурационный файл /etc/icecast2/icecast.xml и разберем его основные настройки.
Сразу отметим, что здесь нам придется работать с конфигурационными файлами в формате XML, который имеет свои особенности синтаксиса. В частности комментарии помещаются между набором символов <!-- и -->, поэтому, если вы хотите раскомментировать строку, то нужно убрать символы комментирования как в начале, так и в конце, иначе вы получите синтаксическую ошибку.
Для примера (символы комментирования выделены полужирным):
<!--
<alias source="/foo" destination="/bar"/>
-->
Начнем с начала, первые параметры являются чисто описательными: размещение вашего сервера и электронный адрес его администратора.
<location>Earth</location>
<admin>icemaster@localhost</admin>
Данная информация является публичной и будет отображаться на странице информации о сервере.
Ниже располагается секция <limits>, в которой нас будет интересовать две опции:
<clients>100</clients>
<sources>2</sources>
Первая понятна, количество обслуживаемых клиентов, а вторая задает возможное количество источников трансляции, каждая из которых вещается сервером в отдельном потоке. Например. вы можете создать несколько плейлистов и подключить каждый как отдельный источник. Указанное в опции количество должны быть больше или равно количеству источников.
Затем идут настройки аутентификации, здесь задаются те самые пароли, которые вы вводили при настройке пакета (если делали эту настройку), обязательно задайте все три пароля: для источников, релеев и админ-панели, также, опционально, можете изменить имя учетной записи администратора:
<authentication>
<source-password>My_Pa$$w0rd_1</source-password>
<relay-password>My_Pa$$w0rd_2</relay-password>
<admin-user>admin</admin-user>
<admin-password>My_Pa$$w0rd_3</admin-password>
</authentication>
Ниже следует указать полное доменное имя в следующей опции:
<hostname>stream.it-31.ru</hostname>
Еще одна опция позволяет включить обработку статических файлов в директории веб-сервера, т.е. вы можете поместить в /usr/share/icecast2/web собственные файлы и получать к ним доступ по прямой сслылке, таким образом можно, например, разместить дистрибутивы проигрывателей. По умолчанию данная возможность включена, для отключения установите ее значение в ноль.
<fileserve>1</fileserve>
Остальные опции оставляем без изменений, перезапускаем службу.
systemctl restart icecast2
Теперь пробуем открыть в браузере адрес stream.it-31.ru:8000 и, если все сделано правильно, вы увидите веб-интерфейс сервера онлайн-вещания.
Но где же музыка? А ее пока нет, потому что Icecast 2 - это сервер вещания и ему нужно передать поток, который он будет транслировать в сеть. Этим мы и займемся ниже.
Установка и настройка Ices
Если Icecast 2 - сервер потокового вещания, то Ices - это специализированный плейер, который будет проигрывать вашу коллекцию файлов и передавать поток серверу вещания.
Наиболее распространенным форматом для хранения музыки у нас является MP3, но в данном случае с ним не все так гладко, текущая версия Ices не поддерживает этот формат, работая исключительно с Ogg Vorbis.
Справедливости ради, следует сказать, что существует альтернативный проигрыватель Ezstream, который поддерживает MP3, но его текущая версия содержит критическую ошибку, не позволяющую работать с данным форматом.
Такая нелюбовь к MP3 имеет под собой веские основания, так как на данный формат распространялось действие патентов, которые истекли только в 2017 году и его использование могло повлечь за собой юридические сложности. Поэтому не будем пугаться и начнем работать с Ogg Vorbis, тем более что MP3 достаточно легко преобразовать в данный формат.
Для его установки используйте:
apt install ices2
После чего скопируйте пример конфигурационного файла в /etc/icecast2:
cp /usr/share/doc/ices2/examples/ices-playlist.xml /etc/icecast2/ices.xml
После чего приступим к его редактированию, сразу разрешим процессу работать в фоне:
<background>1</background>
За передаваемый поток отвечает секция <stream>, если потоков будет несколько, то данную секцию будет нужно продублировать.
Секция начинается с описательной части, которая также будет видна публично, заполняем по желанию:
<metadata>
<name>Example stream name</name>
<genre>Example genre</genre>
<description>A short description of your stream</description>
</metadata>
Далее следует настройка источника, в нашем случае это будет плейлист:
<input>
<module>playlist</module>
<param name="type">basic</param>
<param name="file">/etc/icecast2/playlist.txt</param>
<param name="random">1</param>
<param name="restart-after-reread">0</param>
<param name="restart-after-reread">0</param>
</input>
Разберем некоторые параметры:
- param name="file" - путь к файлу плейлиста, мы будем хранить его рядом с конфигурационными файлами
- param name="random" - случайный порядок воспроизведения, 1 - включено
- param name="restart-after-reread" - начинать проигрывание заново при обновлении плейлиста, 0 - выключено
- param name="restart-after-reread" - проиграть плейлист только один раз, 0 - выключено
Секция <instance> отвечает за соединение с сервером вещания, зададим параметры подключения:
<hostname>127.0.0.1</hostname>
<port>8000</port>
<password>My_Pa$$w0rd_1</password>
<mount>/radio.ogg</mount>
<yp>0</yp>
Первые три опции не вызывают вопросов, в качестве пароля указываем source-password из конфигурации Icecast2. Опция mount - произвольно выбираемая точка монтирования, которая потом станет частью URL нашей радиостанции, обязательно должна заканчиваться на ogg для лучшей совместимости с проигрывателями, а опция yp отвечает за публикацию вашего потока в публичном каталоге, отключаем.
Секция <encode> отвечает за битрейт потока, частоту дискретизации и число каналов, при необходимости можете изменить эти значения. По умолчанию установлен битрейт 64 кБит/с, при частоте дискретизации 44,1 КГц при 2 каналах (стерео).
<encode>
<nominal-bitrate>64000</nominal-bitrate>
<samplerate>44100</samplerate>
<channels>2</channels>
</encode>
Остальные настройки оставляем по умолчанию, сохраняем файл.
Для запуска в качестве службы создадим юнит Systemd:
nano /etc/systemd/system/ices.service
Данная команда создаст файл и откроет его на редактирование в Nano, если вы предпочитаете редактор Midnight Commander, то замените nano на mcedit.
Внесем в файл следующие строки:
[Unit]
Description=Ices Service
After=icecast2.service[Service]
Type=forking
PIDFile=/var/log/ices/ices.pid
ExecStart=/usr/bin/ices2 /etc/icecast2/ices.xml
ExecReload=/bin/kill -HUP $MAINPID
Restart=Always
[Install]
WantedBy=multi-user.target
Файл юнита можно сказать стандартный, путь к PID файлу можете уточнить в конфигурационном файле ices.xml, в качестве зависимости указана служба Icecast2, что позволит запускать Ices после этой службы. Сохраняем файл и заставим Systemd перечитать данные об юнитах:
systemctl daemon-reload
Но не будем спешить запускать службу, у нас еще нет ни музыки, ни плейлиста, что ожидаемо приведет к ошибке.
Создание и конвертация музыкальной коллекции
Будем считать, что мы каким угодно образом разместили нашу музыку в формате MP3 в некоторое расположение, скажем /mnt/music. Теперь нам нужно конвертировать ее в Vorbis и создать плейлист, для первой задачи установим пакет dir2ogg:
apt install dir2ogg
Он позволяет пакетно преобразовывать форматы MP3, M4A, WMA, FLAC, и WAV в открытый формат OGG. Использовать его очень просто:
dir2ogg -r --delete-input /mnt/music
Данная команда рекурсивно конвертирует все MP3 файлы в директории в OGG и удалит источники. Обратите внимание, что по умолчанию обрабатываются только MP3 файлы, для конвертации других форматов обратитесь к справке по утилите:
dir2ogg --help
Также вам может потребоваться установить дополнительные кодеки.
Теперь можем создать или обновить плейлист командой:
find /mnt/music/ -iname "*.ogg" -print > /etc/icecast2/playlist.txt
Теперь можем попробовать запустить службу проигрывателя:
systemctl start ices
И проверим ее состояние:
systemctl status ices
Если все нормально, то добавим ее в автозагрузку:
systemctl enable ices
Если мы теперь перейдем в веб-интерфейс Icecast 2, то увидим там нашу трансляцию и даже можем ее прямо тут прослушать. Для плееров можете использовать ссылку http://stream.it-31.ru:8000/radio.ogg, либо сохраните данный адрес в текстовом файле с расширением M3U.
На этом настройку связки Icecast 2 и Ices можно считать законченной, мы получили работающий сервис онлайн-радио и научились управлять им.
Включаем SSL защиту с сертификатами Let's Encrypt
Если ваше радио работает сугубо в локальной сети, то дальнейших действий можно не предпринимать, иначе крайне желательно настроить для нашего сервера защищенное соединение, это позволит не только защитить передаваемые учетные данные, но и избежать возможного перехвата и подмены потока. Тем более это несложно и не требует дополнительных затрат.
Установим certbot:
apt install certbot
И получим сертификат в режиме standalone, который не требует установленного веб-сервера:
certbot certonly --standalone -d stream.it-31.ru
Теперь создадим из полученных сертификатов новый, в формате поддерживаемом Icecast 2 и разместим его рядом с конфигурационными файлами:
cat /etc/letsencrypt/live/stream.it-31.ru/fullchain.pem /etc/letsencrypt/live/stream.it-31.ru/privkey.pem > /etc/icecast2/icecast.pem
Теперь откроем /etc/icecast2/icecast.xml и раскомментируем следующие секции:
<listen-socket>
<port>8443</port>
<ssl>1</ssl>
</listen-socket>
В данном случае мы включили работу по защищенному протоколу на порту 8443.
А ниже укажем путь к файлу сертификата:
<ssl-certificate>/etc/icecast2/icecast.pem</ssl-certificate>
Сохраняем конфигурацию и перезапускаем службы:
systemctl restart icecast2
systemctl restart ices
Теперь открываем https://stream.it-31.ru:8443 и убеждаемся, что сервер работает по защищенному протоколу:
Теперь ограничим работу незащищенной версии только локальным узлом, для этого снова откройте /etc/icecast2/icecast.xml и раскомментируйте строку bind-address в секции:
<listen-socket>
<port>8000</port>
<bind-address>127.0.0.1</bind-address>
</listen-socket>
Еще раз перезапустите обе службы, теперь доступ извне у нас будет только к защищенной версии сервера.
Теперь добавим некоторые параметры в опции продления сертификата, для этого в файл /etc/letsencrypt/renewal/stream.it-31.ru.conf в секции [renewalparams] добавьте опцию:
post_hook = cat /etc/letsencrypt/live/stream.it-31.ru/fullchain.pem /etc/letsencrypt/live/stream.it-31.ru/privkey.pem > /etc/icecast2/icecast.pem && systemctl restart icecast2 && systemctl restart ices
Теперь после продления сертификата certbot будет автоматически обновлять сертификат для Icecast2 и перезапускать службы.
Настраиваем аутентификацию доступа к трансляции
В заключение рассмотрим еще один сценарий - закрытые трансляции, когда доступ к ним нужно ограничить для отдельных пользователей. С Icecast 2 и это сделать несложно, откроем /etc/icecast2/icecast.xml и внесем туда еще одну секцию:
<mount>
<mount-name>/radio.ogg</mount-name>
<authentication type="htpasswd">
<option name="filename" value="/etc/icecast2/icepaswd"/>
<option name="allow_duplicate_users" value="0"/>
</authentication>
</mount>
В опции mount-name указываем точку монтирования нашего потока, а в option name="filename" задаем файл для хранения паролей. Опция option name="allow_duplicate_users" позволяет включить многократные подключение одного и того же пользователя, по умолчанию выключено.
Сохраняем конфигурацию и создаем пустой файл паролей:
touch /etc/icecast2/icepaswd
После чего делаем его владельцем Icecast:
chown icecast2:icecast /etc/icecast2/icepaswd
Перезапускаем службы и переходим в админ-панель сервера, здесь вы можете управлять пользователями в разделе Manage Authentication.
Теперь доступ к трансляции будет доступен только после аутентификации. Упростить процесс подключения вы можете, передав учетные данные прямо в строке подключения или плейлисте M3U: https://login:passworf@stream.it-31.ru:8433/radio.ogg
Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Последние комментарии