Вы когда-нибудь пытались подключиться к своей IP-камере, но чувствовали себя, словно космонавт на земле без скафандра? Или же настраивали SSH на сервере и думали: «А не проще ли сразу вызвать волшебника?» Успокойтесь, все мы через это проходили. Сегодня я расскажу, как без головной боли устроить надёжное подключение к вашим камерам через RTSP, использовать SSH и настроить сервер для стриминга и записи видео. Поехали!


Что вас ждёт

  • Разберём SSH: зачем нужен, как подключаться, почему пароли — это прошлый век, и зачем ключи.
  • Погрузимся в мир IP-камер и RTSP: как камеры общаются с сервером, зачем нужны сессии и команды.
  • Расскажу про проксирование видеопотока — как один сервер с несколькими камерами может «показать шоу» многим зрителям.
  • Покажу на примерах, как не сгореть, пробрасывая порты и делая удалённый доступ.
  • Поделюсь скриптом на Python, который заменит вам целую толпу «прокси»-сервисов.
  • Разберём реальные тесты и что делать, когда UDP вдруг идёт не туда.
  • И немного о безопасности: почему стоит забыть о паролях и перейти на SSH-ключи.

SSH — ваш лучший друг в мире серверов

SSH — это как секретный тоннель, по которому вы шёпотом общаетесь с вашим сервером, чтобы никто лишний не услышал. Протокол уже давно обжит во всех современных Linux-дистрибутивах, от Ubuntu до CentOS. Чтобы не быть голословным, вот как просто его установить (для Ubuntu и производных):

sudo apt -y install openssh-server

После этого ваш сервер готов принимать вас по SSH.

Как подключиться

Самая простая команда:

ssh username@ip_адрес_сервера

По умолчанию — порт 22. Если ваш сервер решил пошалить и сменить порт, скажем, на 2222, используйте:

ssh username@ip_адрес -p 2222

Вот и всё! Вводите пароль — и вы уже в своём замке.

Пароли vs ключи: бой века

Пароль — это вроде ключа от двери. Но если кто-то скопирует его, у вас могут начаться проблемы. Ключи SSH — это как волшебные амулеты: один открытый ключ можно свободно раздавать, а секретный — хранить при себе. Такой способ почти невозможно взломать перебором.

Генерация ключей

Вбейте в терминал:

ssh-keygen

Ничего страшного, программа поможет сохранить ключи в скрытую папку .ssh. Можно поставить пароль на ключ (passphrase), а можно оставить пустым, как хотите.

Добавляем ключ на сервер

ssh-copy-id -i ~/.ssh/id_rsa.pub username@ip_адрес_сервера

После этого вы сможете подключаться без пароля. Суперудобно!

Не забудьте отключить вход по паролю

Чтобы злодеи не попробовали ваши пароли, откройте конфиг /etc/ssh/sshd_config и поменяйте:

PasswordAuthentication no

Перезапустите SSH:

sudo systemctl restart ssh

Вуаля, теперь у вас железная безопасность.


IP-камера, RTSP и сервер — как они общаются

IP-камера — это настоящий медиа-сервер, который транслирует видео через протокол RTSP (Real Time Streaming Protocol). Представьте, что камера — это радио, а RTSP — радиоволна, на которую мы можем настроиться.

Как подключается VLC и другие клиенты

Клиент, например VLC, сначала отправляет камере запрос OPTIONS — словно спрашивает: «Что умеешь?»

Затем DESCRIBE — просит описание потока.

Дальше SETUP — договаривается о портах и способе передачи (UDP или TCP).

PLAY — запускает трансляцию.

И вот камера начинает слать пакеты видео и звука.

Важные детали с авторизацией

  • Некоторые камеры (например, Hikvision) требуют «дайджест» аутентификацию. Камера говорит: «Покажи мне секретный ключ», а клиент отвечает хешем от пароля, чтобы убедиться, что он не халтурит.
  • Другие камеры открыты и пускают всех.

Как сделать удобный сервер проксирования и записи видео

Что, если у вас 5 камер и куча клиентов, которым надо смотреть видеотрансляцию? Не хочется, чтобы камеры глючили от большого количества подключений! Решение — один раз подключиться к каждой камере и раздавать поток всем клиентам.

Основная идея

  • Сервер открывает соединения к камерам.
  • Помнит параметры сессии.
  • При подключении клиентов — отсылает им поток, как бы «клонирует» видео.
  • Записывает видео на диск с удобной разбивкой.
  • Логирует всё — кто, когда, откуда.

Немного кода для настоящих магов

Автор статьи написал скрипт на Python с asyncio. Он умеет:

  • Подключаться по RTSP с поддержкой авторизации.
  • Запускать UDP-серверы для приёма потоков.
  • Отвечать клиентам на запросы OPTIONS, DESCRIBE, SETUP, PLAY, TEARDOWN.
  • Ограничивать количество веб-клиентов, чтобы сервер не рухнул.

Выглядит это примерно так:

async def main():
    for hash in Config.cameras.keys():
        await Camera(hash).connect()
    await Client.listen()

Где Camera и Client — классы, управляющие соединениями и проксированием.


Подробности работы с RTSP

Тут пригодятся немного сухих, но полезных фактов.

Команда RTSP Описание
OPTIONS Запрос возможностей камеры
DESCRIBE Получить описание видео и аудио
SETUP Настроить транспорт (порты, TCP/UDP)
PLAY Запустить трансляцию
TEARDOWN Завершить сессию
GET_PARAMETER Проверить состояние сессии
SET_PARAMETER Отправить параметры (редко используется)

Каждая команда несёт номер CSeq — счётчик для синхронизации.


Настройка проброса портов и удалённый доступ

Порой ваша камера сидит в локалке с «серым» IP, и к ней не добраться извне напрямую. Самое простое решение — пробросить порты или сделать SSH-туннель.

Пример SSH-туннеля

ssh -NT -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -R <remote_port>:<local_ip>:<local_port> <login>@<remote_ip>

Он пробрасывает порт удалённого сервера к вашей камере.

Внимание: в таком режиме логин и пароль камеры передаются в открытом виде, что может быть опасно!


Протокол TCP vs UDP — что выбрать

UDP — король скорости, но нестабилен в интернете. TCP — стабильнее, но медленнее.

При использовании SSH-туннелей UDP чаще всего не работает, поэтому надо переключиться на TCP-RTSP. Для этого в запросе SETUP меняется строка с:

Transport: RTP/AVP;unicast;client_port=...

на

Transport: RTP/AVP/TCP;unicast;interleaved=0-1

Это означает, что видео будет идти поверх TCP, в одном порту с управляющими командами.


Как вести себя с безопасностью и нагрузкой на сервер

  • Не давайте камере слать поток на каждого клиента отдельно — объединяйте подключения.
  • Ограничивайте число веб-клиентов, чтобы сервер не задыхался.
  • Логи помогут понять, кто и когда подключался — полезно для аудита.
  • Не отключайте SSH-пароли, пока не убедитесь, что ключи работают.
  • Обновляйте SSH и RTSP-серверы, чтобы не стать жертвой хакеров.

Тесты и результаты

Автор сравнил свой Python-скрипт и известный rtsp-simple-server на Go с одной камерой и 10 клиентами.

Параметр Python скрипт rtsp-simple-server
Поддержка клиентов Успешно 10+ Успешно десятки
Нагрузка на CPU Средняя Ниже
Качество видео Отличное, без сбоев Отличное, без сбоев
Сложность кода Легко читается Комплексно

Python-скрипт оказался вполне пригодным для домашнего и малого бизнеса.


Заключение

Если вы хотите взять под контроль свой видеопоток, не полагаясь на заводские приложения и облака, настройка собственного RTSP-сервера с поддержкой SSH — прекрасный выбор. Это похоже на то, как если бы вы построили свой личный кинотеатр, а не ходили в общественный.

Пишите скрипты, экспериментируйте, не бойтесь ошибок! И помните: если камера «капризничает» при большом количестве клиентов, возможно, пора ей подарить собственного «прокси»-сервера.


Бонус: небольшой мем для поднятия настроения — если SSH соединение упало, просто скажите ему: «Ты на паузе, а не отключён!»


Ваш путь к свободе видео и серверам теперь открыт!