- Что вас ждёт
- SSH — ваш лучший друг в мире серверов
- IP-камера, RTSP и сервер — как они общаются
- Как сделать удобный сервер проксирования и записи видео
- Подробности работы с RTSP
- Настройка проброса портов и удалённый доступ
- Протокол TCP vs UDP — что выбрать
- Как вести себя с безопасностью и нагрузкой на сервер
- Тесты и результаты
- Заключение
- Ваш путь к свободе видео и серверам теперь открыт!
Вы когда-нибудь пытались подключиться к своей 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 соединение упало, просто скажите ему: «Ты на паузе, а не отключён!»