💡 Полезные Советы

Полное руководство: Установка и настройка AdGuard Home на Raspberry Pi через Docker (с обходом конфликта портов)

20.05.26
105

Чистый интернет во всей домашней сети, блокировка мобильной рекламы, защита от трекеров и полное скрытие DNS-запросов от провайдера - всё это можно реализовать силами одной лишь Raspberry Pi или другим устройством на Linux.

Долгое время королем сетевой блокировки считался Pi-hole, но сегодня индустрия двинулась дальше. AdGuard Home - более современное решение: оно написано на Go, работает "из коробки" с шифрованием (DoH, DoT, DoQ) и поддерживает мощный Adblock-синтаксис фильтров.

В этой статье мы разберем, как правильно развернуть AdGuard Home в Docker на Raspberry Pi, как решить частую проблему занятого 53-го порта (особенно если у вас стоят другие сервисы вроде v2rayA/Xray) и как правильно настроить систему для RU-сегмента.

Подготовка: Решаем проблему 53-го порта

Главная сложность при установке любого DNS-сервера в Docker - борьба за порт 53. Этот порт необходим для работы DNS, но в современных дистрибутивах Linux (включая Raspberry Pi OS и Ubuntu) он часто уже занят системным резолвером (systemd-resolved), встроенным dnsmasq или прокси-глушилками (например, движком Xray).

Перед стартом проверим, свободен ли порт. Выполните команду в терминале малинки:

sudo ss -tulpn | grep :53

Сценарий 1: Порт занят службой systemd-resolved

Если в выводе вы увидели этот процесс, его нужно отключить, чтобы освободить порт для Docker:

sudo systemctl disable systemd-resolved
sudo systemctl stop systemd-resolved
sudo rm /etc/resolv.conf
echo "nameserver 1.1.1.1" | sudo tee /etc/resolv.conf

Сценарий 2: Порт частично занят другими сервисами (Xray, VPN, dnsmasq)

Если вы увидели, что на порту 53 висят другие важные службы (например, на локальных адресах 127.2.0.17 или 10.42.0.1), отключать их нельзя - это сломает ваши туннели или внутреннюю сеть.

Решение: Мы заставим AdGuard Home слушать порт 53 только на основном IP-адресе вашей Raspberry Pi, который смотрит в домашнюю сеть.

Узнайте локальный IP-адрес малинки:

hostname -I

(Допустим, ваш адрес 192.168.1.50. Запомните его, он пригодится при написании Docker Compose).

Шаг 1: Развертывание через Docker Compose (Предполагается, что у Вас уже установлен и настроен Docker)

Создадим отдельную директорию для проекта и конфигурационный файл:

mkdir -p ~/adguard && cd ~/adguard
nano docker-compose.yml

Вставьте в файл следующий конфиг. Внимание: замените 192.168.1.50 на реальный IP-адрес вашей Raspberry Pi!

services:
  adguardhome:
    image: adguard/adguardhome
    container_name: adguardhome
    restart: unless-stopped
    ports:
      # Привязываем DNS к конкретному IP малинки, чтобы избежать конфликтов
      - "192.168.1.50:53:53/tcp"
      - "192.168.1.50:53:53/udp"
      # Веб-панель управления
      - "80:80/tcp"
      # Порт для первичной инициализации      
      - "3000:3000/tcp"  
    volumes:
      - ./work:/opt/adguardhome/work
      - ./conf:/opt/adguardhome/conf

Сохраните файл (Ctrl+O, затем Enter) и закройте редактор (Ctrl+X).

Запускаем контейнер:

docker compose up -d

Шаг 2: Первичная настройка AdGuard Home

Откройте браузер и перейдите по адресу: http://<IP_ВАШЕЙ_МАЛИНКИ>:3000.

Перед вами откроется приветственный мастер установки:

  1. Веб-интерфейс: Оставляйте "Все интерфейсы" и порт 80.
  2. DNS-сервер: Оставляйте "Все интерфейсы" и порт 53.

    Примечание: Внутри контейнера AdGuard должен слушать всё, Docker сам перенаправит трафик с внешнего IP на внутренний.

  3. Нажмите Далее, придумайте логин и надежный пароль для администратора.

После завершения панель управления станет доступна по обычному адресу: http://<IP_ВАШЕЙ_МАЛИНКИ>.

Шаг 3: Настройка шифрования (DNS-over-HTTPS / QUIC)

По умолчанию AdGuard отправляет запросы в сеть в открытом виде. Провайдер может их перехватывать, анализировать и подменять (так работают базовые блокировки сайтов). Защитим наш трафик.

  • В панели управления перейдите в Настройки -> Настройки DNS.
  • В поле Апстрим DNS-серверы удалите всё и вставьте этот список быстрых и зашифрованных серверов:

    https://dns.cloudflare.com/dns-query
    quic://dns.adguard-dns.com
    tls://dns.quad9.net
    https://dns.google/dns-query
  • Ниже в режиме маршрутизации выберите "Параллельные запросы" - AdGuard будет опрашивать все серверы одновременно и выбирать самый быстрый ответ. Это ускорит загрузку сайтов.
  • В поле Серверы начальной загрузки (Bootstrap DNS) вставьте обычные IP-адреса. Они нужны системе только для того, чтобы в первый раз узнать координаты зашифрованных серверов:

    9.9.9.10
    149.112.112.10
    2620:fe::10
    2620:fe::fe:10
    1.1.1.1
    1.0.0.1
    8.8.8.8
    9.9.9.9
  • Нажмите Проверить апстримы и, если всё ок, нажмите Применить.

Шаг 4: Подключаем лучшие фильтры для рунета (и где искать пропавшие списки)

Чтобы не перегружать оперативную память Raspberry Pi и не вызывать "поломку" нормальных сайтов, списки блокировок нужно подбирать аккуратно. В последних версиях AdGuard Home разработчики сильно почистили встроенные каталоги.

Перейдите в Фильтры -> Черные списки DNS -> Добавить черный список

Рекомендуемый сбалансированный набор:

  • Общие: AdGuard DNS filter (включен по умолчанию, отлично режет базовую рекламу и трекеры) и OISD Blocklist Full (идеальный агрегатор без ложных срабатываний)..
  • Региональные: AdGuard Russian filter и RU AdList (без них реклама Яндекса, Mail.ru и локальных сетей будет пролетать).
  • Безопасность: Phishing URL Blocklist (PhishTank and OpenPhish), Malicious URL Blocklist (URLhaus) (Они надежно защитят домашнюю сеть от фишинга и вирусов.), WindowsSpyBlocker (глушит телеметрию Windows, не ломая обновления системы).

Куда пропал список для России и защита от трекеров?

Если вы не нашли в меню "Региональные" привычный российский фильтр - не пугайтесь. Дело в том, что разработчики AdGuard перенесли все актуальные DNS-блокировки для России (и правила против трекеров) прямо в базовый AdGuard DNS filter. Технически, вы уже защищены от отечественной рекламы "из коробки".

Как добавить кастомные списки вручную (Для продвинутых):

Для максимальной, бескомпромиссной фильтрации специфического мусора в рунете и телеметрии, добавьте пару легендарных списков вручную.
Нажмите "Добавить свой список" и введите:

Нажмите "Сохранить", и AdGuard сам скачает актуальные правила.

Заключение: Направляем трафик

Теперь, когда ваш персональный DNS-сервер готов, нужно направить на него трафик.

У вас есть два пути:

  1. Для всего дома: Зайдите в настройки вашего домашнего роутера, найдите параметры DHCP и в поле Primary DNS (Основной DNS) введите IP-адрес вашей Raspberry Pi. Перезагрузите роутер. Теперь все устройства (телефоны, ТВ, ноутбуки) защищены автоматически.
  2. Для одного устройства: Если не хотите трогать роутер, зайдите в сетевые настройки конкретного ПК или смартфона и укажите IP малинки в качестве DNS вручную.

Что в итоге?

Вы получили полный контроль над своим сетевым трафиком. Вкладка "Журнал запросов" в AdGuard Home наглядно покажет, какие устройства и куда пытаются "стучаться" в фоновом режиме. Если какой-то нужный вам сайт или банк случайно заблокируется - вы сможете внести его в белый список прямо из лога в один клик.

Часто задаваемые вопросы (FAQ)

Почему AdGuard Home не блокирует рекламу внутри видео на YouTube, VK или Rutube?

Потому что эти платформы используют технологию серверной вклейки рекламы (SSAI - Server-Side Ad Insertion). Рекламные ролики и основное видео склеиваются на серверах корпораций и отдаются на ваше устройство с одного и того же домена единым зашифрованным потоком. DNS-фильтр работает на уровне доменов: он либо заблокирует весь видеопоток целиком, либо пропустит его вместе с рекламой. Для блокировки in-stream рекламы вам всё еще понадобятся браузерные расширения (например, uBlock Origin) или модифицированные клиенты (ReVanced).

У меня перестал открываться нужный сайт (Сбербанк, Госуслуги, Кинопоиск). Как починить?

Такое иногда случается - это типичное "ложное срабатывание" одного из черных списков. Не паникуйте! Откройте веб-панель AdGuard Home, перейдите в раздел "Журнал запросов". Найдите там свежую красную строчку с заблокированным доменом вашего сервиса и просто нажмите кнопку "Разблокировать". Сайт моментально заработает.

Что произойдет, если Raspberry Pi зависнет или я выдерну ее из розетки?

Это важный нюанс, о котором нужно помнить. Если вы указали малинку в настройках роутера как единственный DNS-сервер для всего дома, то при её отключении у всех устройств в квартире "пропадет" интернет. Сайты просто перестанут открываться (хотя мессенджеры по прямым IP могут работать). Если вы планируете выключить сервер надолго, не забудьте вернуть в настройках роутера автоматическое получение DNS от провайдера.

Что будет, если дома отключится электричество? Придется ли запускать всё заново?

Нет. В конфигурации нашего Docker-файла прописано правило restart: unless-stopped. Это значит, что как только Raspberry Pi получит питание и загрузится, AdGuard Home запустится автоматически, и интернет у всех устройств в доме восстановится.

Можно ли использовать AdGuard Home одновременно с VPN или обходом DPI (например, v2rayA / Xray)?

Да, они прекрасно работают на одном сервере. Более того, это классическая связка для современного домашнего сервера. Главное правило - грамотно настроить порты (как описано в нашей инструкции), чтобы движок VPN и Docker-контейнер с AdGuard не пытались одновременно занять 53-й порт на всех сетевых интерфейсах. Привязка AdGuard к локальному IP-адресу полностью решает эту проблему.

Глоссарий терминов

  • DNS (Domain Name System) - "телефонная книга" интернета. Переводит понятные человеку адреса (например, riopass.ru) в числовые IP-адреса серверов (например, 192.168.1.1), которые понимают компьютеры.
  • Апстрим DNS (Upstream DNS) - вышестоящий сервер в интернете. Когда вы вводите адрес сайта, а ваш домашний AdGuard Home не знает его IP-адреса, он обращается именно к апстрим-серверам (например, к серверам Cloudflare или Google) за ответом.
  • Серверы начальной загрузки (Bootstrap DNS) - обычные, нешифрованные серверы (например, 1.1.1.1). Они нужны вашему AdGuard только в самую первую секунду работы: чтобы перевести буквенный адрес шифрованного апстрим-сервера (типа dns.cloudflare.com) в цифры и установить с ним защищенное соединение.
  • DNS-over-HTTPS (DoH) / DNS-over-QUIC (DoQ) - современные протоколы шифрования. Заворачивают ваши DNS-запросы в непроницаемый криптографический туннель. Благодаря им ваш интернет-провайдер не видит, на какие сайты вы заходите, и не может подменить ответ (например, выдать страницу-заглушку о блокировке).
  • Порт 53 - стандартная "дверь" в сетевом оборудовании, через которую проходит весь нешифрованный DNS-трафик.
  • DHCP (Dynamic Host Configuration Protocol) - служба на вашем домашнем роутере, которая автоматически раздает IP-адреса и настройки сети (включая адрес нашего нового DNS-сервера) всем подключающимся телефонам, телевизорам и компьютерам.
  • Docker / Docker Compose - система контейнеризации. Позволяет запускать программы (например, AdGuard Home) в изолированной среде со всеми необходимыми зависимостями, чтобы они не конфликтовали с основной операционной системой (Raspberry Pi OS).
  • systemd-resolved - встроенная в Linux системная служба для управления сетевыми именами. Часто является главной головной болью при настройке собственных DNS-серверов, так как намертво занимает порт 53.
  • v2rayA / Xray - мощные современные инструменты для маршрутизации трафика и обхода систем глубокого анализа пакетов (DPI). Часто устанавливаются на тот же сервер, что и AdGuard Home, для создания комплексного домашнего шлюза.
  • SSAI (Server-Side Ad Insertion) - серверная вклейка рекламы. Технология, из-за которой AdGuard Home и другие сетевые блокировщики не могут вырезать рекламу внутри видеороликов на YouTube или VK Video. Видео и реклама отдаются с одного домена единым зашифрованным потоком.
  • Ложные срабатывания (False Positives) - ситуация, когда из-за слишком агрессивных списков фильтрации под блокировку попадает полезный домен. Из-за этого может сломаться верстка сайта или перестать работать авторизация в приложении банка.
  • Локальный IP-адрес - внутренний адрес устройства в вашей домашней сети (обычно начинается на 192.168.x.x или 10.x.x.x). Доступ к нему есть только у устройств, подключенных к вашему домашнему Wi-Fi, из интернета напрямую до него не добраться.

Сделай Backup - не получишь факап: История одного падения Raspberry Pi 5 и чудесного воскрешения

19.05.26
71

Приветствую! С вами riopass.ru, и сегодня мы поговорим о боли, слезах и единственной вещи, которая отделяет системного администратора от нервного срыва - о резервном копировании.

Предыстория: ничто не предвещало беды. Изначально я задумал развернуть локальную нейросеть на базе Ollama на своей Raspberry Pi 5 под управлением Raspberry Pi OS. Через скрипты Pi-Apps установка не завелась. Я, как положено, всё вычистил и решил ставить с официального сайта, чтобы скрипт сам подтянул нужную архитектуру и всё настроил.

Туда же "до кучи" была установлена пачка других утилит и запущен процесс обновления компонентов. А потом я просто решил выключить "Малинку" для плановой замены домашнего роутера. И оставил так спустя день.

И она больше не включилась...

При подаче питания вентилятор начинал выть на все 120%, а графическая оболочка и система в целом отказывались стартовать. Умные ИИ-ассистенты, к которым я пошел за советом, дружно начали хоронить железо: "у вас умер адаптер - просадка V5", "сгорела SD-карта", "повредилась файловая система". Максимум, что показала диагностика - это пресловутый dirty bit на загрузочном разделе (признак внезапного отключения питания), который утилита fsck успешно сняла, но систему это не оживило.

Основная проблема крылась в самой Ollama и криво вставших обновлениях - они просто намертво вешали инициализацию ядра.

И тут я вспомнил про raspiBackup. Это гениальный скрипт от немецких разработчиков, который я когда-то давно настроил на еженедельный сброс дампов на свой мини-сервер через SMB-шару. Помню, тогда ещё думал: "Блин, ну это же минус 30-40 ГБ места на диске! Бэкапы, которые никогда не пригодятся мне не пригодяться".

В итоге именно эти "лишние" гигабайты меня и спасли. Потому что реанимировать систему удалось только накатив бэкап. Ниже - подробная инструкция, как восстановить Raspberry Pi из архива raspiBackup, используя сторонний ПК (в моем случае - рабочий ноутбук на Debian 13).

Инструкция: Восстановление raspiBackup на другом Linux-ПК

Если ваша Малинка "мертва", вы не сможете запустить скрипт восстановления на ней самой. Нам понадобится любой компьютер с Linux (например, Ubuntu, Debian или Mint) и кардридер/переходник.

Шаг 1. Готовим накопитель и бэкап

  1. Подключаем флешку или NVMe-накопитель от мертвой Raspberry к нашему Linux-ПК.
  2. Проверяем, под каким именем накопитель определился в системе:

    lsblk

    Внимательно ищем свой диск по размеру (например, /dev/sdb). Это критически важно, чтобы случайно не отформатировать системный диск ноутбука!

  3. Убеждаемся, что папка с вашим бэкапом (вида Имя@debian-tar-backup-Дата) доступна на этом ПК - локально или примонтирована по сети. Я перекинул заранее через команду scp.

Шаг 2. Скачиваем утилиту

Если скрипта raspiBackup нет на вашем ПК, скачиваем его одной командой:

curl -sSLO https://raw.githubusercontent.com/framps/raspiBackup/master/raspiBackup.sh
chmod +x raspiBackup.sh

Шаг 3. Запускаем магию (Осторожно, пофиг!)

Если вы просто запустите скрипт на ПК (архитектура x86_64), он выдаст ошибку RBK0268E: Only Raspberries running Raspberry PI OS are supported. Он "видит", что вы не на ARM, и отказывается работать.

Чтобы заставить скрипт развернуть бэкап на "чужеродной" системе, нужно использовать специальный флаг --unsupportedEnvironment.

Выполняем команду (не забудьте подставить свои данные!):

sudo ./raspiBackup.sh --unsupportedEnvironment -d /dev/sdb /путь/к/папке/с/бэкапом

Где /dev/sdb - это ваш накопитель от Малинки.

На скриншоте выделил красным IPv6 Link-Local, то что подключился по RDP с PC на ноутбук. (на самом роутере у меня IPv6 выключен)

Что произойдет дальше:
Скрипт прочитает структуру старого диска, сам переразметит разделы, зальет boot-сектор и распакует ваш тяжелый tar.zst архив прямо в корень. Прогресс-бара распаковки архива не будет - терминал просто "задумается" на 10–20 минут. Не прерывайте процесс! Дождитесь сообщения об успехе, извлеките диск и вставляйте его в Raspberry. Она загрузится так, будто ничего и не ломалось. (У меня в обще ноутбук заснул, я думал всё сломалось, но нет, успех!)

Бонус: IPv6 Link-Local - как найти сервер, если роутер умер

В моей истории всё началось с замены роутера. Часто при смене сетевого оборудования, изменении подсетей (например, с 192.168.1.x на 192.168.0.x) или выходе из строя DHCP-сервера, ваш headless-сервер (без монитора) становится недоступным по сети. Вы не знаете его новый IP-адрес.

Здесь на сцену выходит IPv6 Link-Local (Локальный адрес канала).

Даже если в вашей сети нет интернета, нет роутера и нет DHCP-сервера, любое современное устройство с поддержкой IPv6 автоматически генерирует себе адрес в диапазоне fe80::/10. Этот адрес создается на основе MAC-адреса сетевой карты и существует только в пределах физического сегмента сети (от кабеля до кабеля).

Как это использовать для спасения?

Если Raspberry Pi потерялась в сети:

  1. Берем обычный патч-корд и соединяем порт Ethernet на вашем ноутбуке напрямую с портом Raspberry Pi.
  2. Включаем устройства. Они автоматически договорятся и создадут себе Link-Local адреса.
  3.  На вашем ноутбуке (Windows/Linux) открываем терминал и сканируем соседей по IPv6 с помощью мультикаст-пинга:
  •        На Linux/macOS: ping6 -I eth0 ff02::1 (где eth0 — ваше сетевое подключение).
  •        На Windows: ping -6 ff02::1

Вам ответят адреса, начинающиеся на fe80::.... Один из них - это ваш ноутбук, второй - ваша потерянная Raspberry Pi!

Берем этот адрес и спокойно подключаемся по SSH:

ssh user@fe80::xxxx:xxxx:xxxx:xxxx%eth0

(Знак процента и имя интерфейса в конце обязательны, чтобы система поняла, через какой именно кабель стучаться).

Подключились напрямую - поправили настройки netplan или dhcpcd.conf под новый роутер, и сервер снова в строю.

Мораль: Изучайте сетевые технологии и делайте бэкапы. Это экономит не только время, но и не будете как Ганвест разговаривать потом.

Глоссарий к статье

Для тех, кто только погружается в мир Linux и домашних серверов, вот расшифровка ключевых терминов из статьи:

  •  Ollama - инструмент (фреймворк), позволяющий разворачивать и запускать большие языковые нейросети (LLM) прямо у себя на домашнем железе, без интернета и цензуры.
  •  Headless-сервер (безголовый сервер) - компьютер или микрокомпьютер (как наша Raspberry Pi), который работает без подключенного монитора, клавиатуры и мыши. Управляется исключительно по сети.
  •  fsck (File System Consistency Check) - стандартная системная утилита в Linux. Врач-травматолог для жестких дисков и флешек: проверяет файловую систему на ошибки и пытается их исправить.
  • Dirty bit (Грязный бит) - специальный флаг (метка) в файловой системе. Ставится автоматически, если выдернуть питание устройства до того, как система успела безопасно завершить работу с диском. Сигнализирует о том, что при следующей загрузке нужно запустить fsck.
  • raspiBackup - мощный opensource-скрипт для Raspberry Pi. Умеет делать резервные копии работающей системы по расписанию и сохранять их на сетевые диски.
  • SMB-шара (SMB Share) - общая сетевая папка, доступная другим устройствам в локальной сети. Названа в честь протокола Server Message Block, который исторически используется в Windows, но отлично понимается и Linux-системами.
  • tar.zst - формат сжатого архива. Утилита tar собирает всю файловую систему в один большой файл-контейнер, а алгоритм zstd (Zstandard) сжимает его. Работает гораздо быстрее и эффективнее старых форматов вроде .gz или .zip.
  • NVMe (Non-Volatile Memory Express) - современный протокол и формат быстрых твердотельных накопителей (SSD). Raspberry Pi 5 поддерживает их подключение через специальный шлейф (PCIe), что дает колоссальный прирост скорости по сравнению с обычными MicroSD-картами.
  • DHCP-сервер (Dynamic Host Configuration Protocol) - служба, которая автоматически выдает IP-адреса всем устройствам в вашей домашней сети. Чаще всего эта функция встроена в ваш домашний Wi-Fi роутер.
  • IPv6 Link-Local (Локальный адрес канала) - автоматический сетевой адрес (всегда начинается с fe80::), который любое современное устройство назначает себе само. Работает только в пределах одного физического провода или Wi-Fi сегмента. Позволяет устройствам общаться напрямую, даже если роутер сгорел, а DHCP-сервер мертв.
  • SSH (Secure Shell) - защищенный сетевой протокол для удаленного управления компьютером через командную строку. Тот самый черный экран с белыми буквами, через который админы творят магию.

 

Как вернуть YouTube на SberBox: рабочий способ обхода блокировок и установка SmartTube (2026)

16.05.26
208

Владельцы ТВ-приставок от Сбера сейчас сталкиваются с двойной проблемой: во-первых, провайдерские ТСПУ (DPI) режут трафик к YouTube, а во-вторых, закрытая экосистема StarOS без сервисов Google (GMS) не дает нормально использовать официальные приложения.

Стандартные VPN-клиенты с пульта управляются ужасно, а ключи Outline отваливаются из-за блокировок по сигнатурам. В этой статье на riopass.ru мы разберем ультимативный способ настройки: поднимем современный протокол VLESS (Xray + Reality) через клиент v2rayNG и поставим независимый клиент YouTube.

1. Установка правильного VPN-клиента (v2rayNG)

Мы будем использовать v2rayNG - мощный инструмент, который идеально работает с пультом и поддерживает современные протоколы вроде VLESS, маскирующиеся под обычный HTTPS-трафик (например, визит на сайт института в Европе).

Как закинуть приложение на SberBox:

У Сбера есть удобное облачное хранилище, но оно принимает строго файлы в формате только в .apk .
 

  1. Идем на GitHub разработчика 2dust/v2rayNG и качаем APK из раздела Releases.
  2. Аппаратный нюанс: Процессор у SberBox 64-битный (arm64-v8a), но ради экономии 2 ГБ оперативной памяти сама ОС Android часто урезана до 32 бит. Если версия arm64-v8a не появляется в системе после загрузки, смело качайте версию armeabi-v7a или universal.
  3. Авторизуйтесь на сайте apps.sber.ru/my apps.sber.ru/my под своим Сбер ID.
  4. Загрузите скачанный .apk файл.
  5. На телевизоре перейдите в Каталог приложений -> Мои приложения -> Загруженные и установите v2rayNG.
    (Если приложение не появилось - перезагрузите приставку по питанию для принудительной синхронизации облака или обычной перезагрузкой удерживая кнопку выключения -> появиться круг "перезагрузить" -> одинарное нажатие на кнопку выкелючения).

2. Настройка VLESS (Reality)

Протокол Reality невероятно чувствителен к опечаткам. Ошибка в одном символе Public Key приведет к тому, что соединение не установится. Вводить 200 символов с пульта - плохая идея. Но разработчики Сбера сделали убогий браузер урезанные элементы управления и многое другое. (Если Вы нашли способ, как сделать без ручного ввода опишите его на нашу почту support@riopass.ru )

Если облако Сбера отказывается принимать картинки с QR-кодами, а скопировать текст через встроенный браузер не получается, придется идти по пути истинного джедая - забивать настройки вручную с D-pad'а пульта. Протокол Reality параноидально чувствителен к опечаткам: ошибка в одном регистре или лишний пробел, и сервер сбросит соединение.

Пример ключа с которого необходимо будет перепечатать данные(ключ не рабочий, предоставлен для примера!):

vless://12345678-abcd-1234-abcd-123456789abc@192.168.1.100:443?encryption=none&security=reality&type=tcp&sni=www.microsoft.com&fp=chrome&pbk=2TRaaychV1yeUxFJgC8sXztZxLCaGRxS8AcqP9gOKjA&sid=15a4e0b35cac5865&flow=xtls-rprx-vision&spx=%2F#AmneziaVPN

Давайте разберем эту "абракадабру" на запчасти, чтобы вы понимали, откуда брать данные для полей в v2rayNG:

  •    vless:// - Указание на протокол.
  •    12345678-abcd-1234-abcd-123456789abc (Всё, что идет до символа @) - Это ваш UUID. Именно его мы вписываем в поле Идентификатор (ID).
  •    192.168.1.100:443 (Между @ и ?) - Это Адрес (IP вашего сервера) и Порт (443).
  •    ? - Знак вопроса означает, что дальше идут дополнительные параметры. Каждый параметр отделяется друг от друга символом амперсанда &.

Ищем нужные параметры в хвосте ссылки:

  •    flow=xtls-rprx-vision - Вписываем в поле Поток.
  •    sni=www.microsoft.com - Домен маскировки. Вписываем в поле SNI.
  •    fp=chrome - Отпечаток браузера. Вписываем в поле Отпечаток (Fingerprint).
  •    pbk=2TRaaychV... - Ваш публичный ключ. Самая длинная строка, вписываем в Открытый ключ (Public Key).
  •    sid=15a4e0b35cac5865 - Ваш короткий идентификатор, вписываем в ShortID.
  •    spx=%2F - Кодированное обозначение символа слэш. В программе просто вписываем / в поле SpiderX.

И в самом конце:

  •    #AmneziaVPN (Всё, что идет после знака решетки) — Это тег или название. Знак # отбрасываем, а само слово AmneziaVPN пишем в самую первую строку настроек — Имя (Remarks).

Открываем v2rayNG, жмем иконку "+" в правом верхнем углу и выбираем "Добавить VLESS". Перед вами появится длинный список параметров. Заполняем строго по инструкции:

Базовые настройки подключения

  • Имя (Remarks): Любое понятное название (например, My_VPN). Внимание: если ваш генератор ключей добавил в конец ссылки тег вроде #AmneziaVPN, само это слово можно вписать сюда, но без знака решетки.
  • Адрес (Address): IP-адрес вашего VPN-сервера (например, 192.168.1.1). Как его сделать читайте здесь.
  • Порт (Port): Порт вашего подключения (обычно 443).
  • Идентификатор (ID): Ваш UUID. Это строка из 36 символов (только строчные буквы и цифры), разделенная четырьмя дефисами (формат xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx). Вводить нужно предельно внимательно, соблюдая все дефисы.

Настройки маршрутизации и шифрования

  • Поток (Flow): Строго xtls-rprx-vision (все буквы маленькие, без пробелов). Не используйте варианты с udp443, чтобы не вызвать конфликт.
  • Шифрование (Encryption): Вписываем none. VLESS лишен собственного механизма шифрования ради снижения нагрузки на процессор (для ТВ-приставок это критично), за криптографию здесь будет отвечать сам Reality.
  • Сеть (Network): Выбираем tcp. - должно быт ьпо умолчанию
  • Тип заголовка (Header type): Выбираем none.

⚠️ Важное правило чистых полей:
Строки Узел HTTP (HTTP Host) и Путь (Path) оставляем абсолютно пустыми. Если вписать туда домен маскировки, Xray сформирует кривой пакет, и туннель не поднимется.

Настройки маскировки (Reality)

Пролистайте вниз до пункта Безопасность (TLS). По умолчанию там стоит none. Нажмите на него и выберите reality. Как только вы это сделаете, ниже "магическим образом" развернутся скрытые поля для настройки маскировки:

  • SNI: Домен, под который маскируется ваш сервер (например, www.google.com - строго то, что указано в настройках вашего VPS).
  • Отпечаток (Fingerprint): Вписываем chrome. Это заставит провайдера думать, что пакеты отправляет обычный браузер.
  • Открытый ключ (Public Key): Самое важное поле. Длинная строка из 43 символов. Вводим крайне осторожно, строго соблюдая заглавные и строчные буквы!
  • ShortID: Короткий идентификатор, обычно состоящий из 16 символов (цифры и строчные буквы).
  • SpiderX: Ставим просто символ косой черты / (слэш).
  • Поле "Необработанный JSON FinalMask" игнорируем и оставляем пустым.

Как только вбит последний символ, поднимаемся в самый верх экрана и жмем иконку Галочки (сохранить). Карточка сервера появится на главном экране. Выделяем ее и жмем круглую кнопку запуска!

Лечим ошибку маршрутизации (Красный экран)

При первой попытке запуска v2rayNG на чистой приставке вы, скорее всего, получите красное окно с ошибкой: geosite.dat: no such file or directory.

Это происходит потому, что программа пытается разделить трафик (пускать заблокированные сайты через VPN, а местные - напрямую), но баз геоданных в системе еще нет.

Как исправить:

  1.    На главном экране v2rayNG (где карточка вашего сервера) нажмите на три вертикальные точки в правом верхнем углу -> Файлы ресурсов.

  2.    Правый верхний угол заначек облачко "Обновить файлы геоданных" (Update GeoSite/GeoIP).
  3.    Дождитесь уведомления об успешной загрузке.
       (Проверить загрузку можно в боковом меню: Настройки -> Файлы ресурсов. Там должны появиться файлы с указанием их веса в мегабайтах).

После этого выделите сервер и нажмите круглую кнопку запуска внизу. Проверьте соединение через меню сервера -> "Тестирование реальной задержки". Если появились миллисекунды (например, 60ms) - туннель пробил блокировки провайдера.

Что делать, если всё заполнено верно, но YouTube всё равно выдает ошибку?

Если вы идеально перенесли все ключи, тест задержки (Real ping) показывает стабильные миллисекунды, но IP-адрес на приставке не меняется и YouTube продолжает ругаться на ошибку сети, дело в кривых правилах маршрутизации по умолчанию.

Так как v2rayNG - проект международный (изначально ориентированный на обход "Великого китайского файрвола"), в нем "из коробки" могут стоять настройки маршрутизации strictly для Китая. В итоге приложение просто пускает весь трафик до серверов Google в обход созданного туннеля.

Лечится это в три клика прямо через интерфейс приставки:

  1.    На главном экране v2rayNG откройте боковое меню и перейдите в раздел "Маршрутизация" (Routing).
  2.    В правом верхнем углу нажмите на меню из трех вертикальных точек.
  3.    Выберите пункт "Импортировать из набора правил" (Import from ruleset).
  4.    В открывшемся списке выберите конфигурацию для России (чтобы автоматически заворачивать заблокированные ресурсы) или переключите режим на Глобальный (Global), чтобы пустить абсолютно весь интернет-трафик через ваш VPS.

После этого обязательно вернитесь на главный экран, выключите туннель большой круглой кнопкой и запустите его заново для применения новых правил.

Выходить лучше не на кнопку назад, а кнопку домой, тогда приложение останется в оперативной памяти и продолжит работать.

3. Замена YouTube на SmartTube

Встроенный клиент YouTube или его официальный APK на SberBox будут выдавать ошибку "Произошла ошибка. Повторите попытку позже" или сбрасывать авторизацию. Причина проста: в StarOS вырезаны сервисы Google Play, без которых официальное приложение жить не может.

Решение - установка SmartTube. Это легендарный open-source клиент для Android TV, который работает полностью автономно от сервисов Google.

  1. Найдите на GitHub репозиторий SmartTube (от yuliskov).
  2. Скачайте стабильную версию (SmartTube_stable.apk), если она не работает то которая заканчивается на armeabi-v7a.apk.
  3. Закиньте её на SberBox через тот же apps.sber.ru/my и установите.

Почему SmartTube лучше оригинала:

  • Не требует Google Services (GMS).
  • Полностью вырезает рекламу.
  • Имеет встроенный SponsorBlock (проматывает рекламные вставки самих блогеров).
  • Легко управляется с пульта.

Как войти в аккаунт:
В самом SmartTube перейдите в раздел аккаунтов и нажмите "Войти". На экране ТВ появится код. Откройте на смартфоне страницу youtube.com/activate, введите код с экрана телевизора, и все ваши подписки и история мгновенно подтянутся.

Теперь ваш SberBox оборудован современным, неблокируемым VPN-туннелем, и лучшим клиентом для YouTube на рынке. Приставка не тормозит от тяжелых сервисов Google, а трафик надежно зашифрован.

Остались вопросы или что-то не работает? Пишите на почту тех поддержки riopass.ru, разберем любые ошибки!

Успешных настроек! Больше технических инструкций и гайдов для IT-специалистов и энтузиастов читайте на riopass.ru.

Глоссарий

  • DPI (ТСПУ): Технические средства противодействия угрозам. Оборудование провайдера, которое осуществляет глубокий анализ пакетов. Именно оно распознает стандартные VPN-протоколы (вроде WireGuard или Outline/Shadowsocks) и блокирует доступ к YouTube.
  • v2rayNG: Мощное приложение-клиент для Android и Android TV. В отличие от простых VPN-приложений, оно умеет работать с продвинутыми протоколами маскировки и гибко настраивать маршрутизацию трафика.
  • Xray-core (Xray): Современное сетевое ядро (движок), которое работает на вашем VPS-сервере и внутри приложения v2rayNG. Отвечает за прием, обработку и маскировку трафика.
  • VLESS: Облегченный протокол передачи данных. В отличие от старых протоколов, он не имеет собственного шифрования (что экономит ресурсы процессора, например ТВ-приставки), передавая эту задачу более мощным алгоритмам.
  • Reality: Передовая технология маскировки трафика. Не просто шифрует данные, а создает полноценную иллюзию того, что вы посещаете обычный разрешенный сайт (например, сайт Microsoft или Apple). ТСПУ провайдера видит этот "белый" трафик и пропускает его без блокировок.
  • XTLS-Vision (xtls-rprx-vision): Специальный алгоритм потоковой передачи внутри Xray. Он скрывает характерные следы (паттерны) того, что внутри вашего соединения спрятан еще один зашифрованный туннель (защита от обнаружения "TLS in TLS").
  • UUID (ID / Идентификатор): Ваш уникальный "пароль" пользователя. Строка из 36 символов (букв и цифр, разделенных дефисами), по которой сервер узнает, что подключаетесь именно вы.
  • SNI (Server Name Indication): Домен-прикрытие. Тот самый разрешенный адрес (например, www.sap.com), под который протокол Reality маскирует ваше соединение от глаз провайдера.
  • Открытый ключ (Public Key / pbk): Длинная криптографическая строка, которая используется протоколом Reality для установления защищенного сеанса связи с сервером. Самый чувствительный к опечаткам параметр.
  • SmartTube: Независимый open-source клиент YouTube для умных телевизоров. Работает без сервисов Google (GMS), вырезает всю рекламу (включая встроенную блогерами) и не конфликтует с закрытыми системами вроде StarOS.
  • GeoSite / GeoIP: Встроенные базы данных маршрутизации. Они содержат списки IP-адресов и доменов, позволяя v2rayNG понимать, какой трафик нужно отправлять в зашифрованный туннель (например, заблокированные соцсети), а какой - напрямую (например, локальные сервисы Сбера).

 

Как навсегда исправить "Troubleshooting keychain issues" в VS Code на Raspberry Pi и Linux

21.04.26
193

Если вы работаете с Visual Studio Code на Raspberry Pi (или любом другом Linux-дистрибутиве с нестандартной графической оболочкой, например на Wayland), то рано или поздно при попытке авторизоваться в GitHub или синхронизировать настройки вы увидите назойливое окно:

"An OS keyring couldn't be identified for storing the encryption related data in your current desktop environment."

Редактор предложит перейти по ссылке или выбрать Use weaker encryption. В этой статье мы разберем, почему нельзя нажимать кнопку слабого шифрования, и как настроить всё правильно с точки зрения безопасности.

Почему это происходит?

VS Code (построенный на базе Chromium) пытается найти системное защищенное хранилище (keyring), чтобы безопасно спрятать туда ваш токен авторизации (OAuth). Однако в легковесных средах на Raspberry Pi демон ключей часто либо не установлен, либо запускается не так, как ожидает редактор. В итоге VS Code "слепнет" и выдает ошибку.

Быстрое, но опасное решение (Не рекомендую)

Самый частый совет в интернете - прописать в настройках запуска VS Code параметр "password-store": "basic". Да, окно ошибки пропадет. Но ваш секретный токен от GitHub будет сохранен в обычном текстовом файле. Если кто-то получит доступ к файловой системе вашей "малинки" - он получит и полный доступ к вашим репозиториям.

Правильное решение: Настраиваем gnome-keyring

Мы пойдем по пути системного администратора и заставим VS Code работать с системным шифрованием через libsecret.

1. Установка необходимых библиотек

Открываем терминал и ставим сам менеджер ключей и графическую утилиту для управления им:

sudo apt update
sudo apt install gnome-keyring libpam-gnome-keyring seahorse libsecret-1-0 libsecret-tools

2. Создание системной связки ключей

Чтобы система могла хранить пароли, нам нужно физически создать "сейф".

  1. Запускаем установленную утилиту (в терминале вводим seahorse & или ищем "Пароли и ключи" в меню приложений).
  2. Жмем правой кнопкой мыши в левой колонке -> Создать новую связку ключей (New Keyring).
  3. Важно! Называем её строго Login (с большой буквы).
  4. Программа попросит задать пароль. Укажите точно такой же пароль, с которым вы входите в систему. Это позволит Linux автоматически открывать сейф при загрузке.
  5. Нажмите на новую связку правой кнопкой и выберите "Сделать по умолчанию".

3. Принудительное указание хранилища для VS Code

Осталось сказать редактору, чтобы он перестал гадать и использовал именно нашу новую связку.

  1. Закройте VS Code, если он открыт, и "убейте" фоновые процессы командой: killall code
  2. Откройте файл аргументов запуска:

    nano ~/.vscode/argv.json
  3. Добавьте строку "password-store": "gnome-libsecret" перед закрывающей скобкой. Должно получиться так(если в файле ещё что то было не забудьте поставить запятую, подробнее читайте в FAQ ниже):

    {
        "disable-hardware-acceleration": true,
        "password-store": "gnome-libsecret"
    }
  4. Сохраните изменения (Ctrl+O, Enter, Ctrl+X).

Ура!

Запускаем Visual Studio Code и спокойно авторизуемся в GitHub. Больше никаких ошибок! Токен надежно зашифрован алгоритмами операционной системы, а любые другие расширения (Copilot, базы данных) будут автоматически использовать это безопасное хранилище.

FAQ: Часто задаваемые вопросы и возможные ошибки

1. Почему в инструкции сказано "не забудьте поставить запятую" в файле argv.json?
Файл argv.json написан в формате JSON. Одно из главных правил этого формата - все параметры внутри фигурных скобок { } должны разделяться запятыми. Запятая ставится после каждого параметра, кроме самого последнего.

Если в вашем файле уже были какие-то настройки, и вы добавляете "password-store" в конец, обязательно поставьте запятую после предыдущей строки.
❌ Неправильно (вызовет ошибку при запуске VS Code):

{
    "disable-crash-reporter": true
    "password-store": "gnome-libsecret"
}

✅ Правильно:

{
    "disable-crash-reporter": true,
    "password-store": "gnome-libsecret"
}

2. Что делать, если файла ~/.vscode/argv.json вообще нет?

Такое бывает, если вы только что установили редактор и ни разу не меняли параметры его запуска. Просто создайте этот файл вручную и впишите туда структуру с нуля:

{
    "password-store": "gnome-libsecret"
}

(Заметьте: так как параметр здесь всего один, запятая после него не ставится).

3. Я поменял пароль от своего пользователя на Raspberry Pi, и теперь при запуске VS Code снова выскакивают окна.

Когда мы создавали связку ключей Login, мы задали ей пароль, совпадающий с паролем вашего пользователя. Это позволяет системе разблокировать сейф автоматически при входе. Если вы изменили пароль пользователя в Linux (через команду passwd), пароль от сейфа Login остался старым, и автоматическая разблокировка сломалась.
Как исправить: Откройте утилиту Seahorse ("Пароли и ключи"), нажмите правой кнопкой мыши на связку Login, выберите "Изменить пароль" и укажите ваш новый пароль от системы.

4. Подойдет ли эта инструкция для других дистрибутивов Linux (Ubuntu, Debian, Fedora)?

Да, абсолютно. Проблема с "keychain issues" в Visual Studio Code не является эксклюзивом для Raspberry Pi. Она возникает на любом Linux-дистрибутиве, где графическая оболочка (особенно на базе Wayland) или оконный менеджер (i3, sway) не инициализирует gnome-keyring должным образом по умолчанию. Описанный метод с libsecret - это универсальное и правильное решение для всего семейства Linux.

Глоссарий

  • Keyring / Keychain (Связка ключей) - системное зашифрованное хранилище в операционной системе, предназначенное для безопасного хранения паролей, ключей шифрования и сертификатов.
  • OAuth-токен - специальный цифровой ключ (строка символов), который GitHub выдает приложению (например, Visual Studio Code), чтобы оно могло выполнять действия от вашего имени без необходимости каждый раз вводить логин и пароль.
  • gnome-keyring - фоновая служба (демон) в Linux, которая отвечает за управление системной связкой ключей и обеспечивает безопасное хранение секретов.
  • libsecret - системная библиотека, которая служит стандартизированным "мостом". Через нее различные программы (включая VS Code) общаются с gnome-keyring, чтобы положить или достать пароль, не вникая в тонкости работы самого хранилища.
  • Seahorse (Пароли и ключи) - графическая программа для среды Linux, которая позволяет пользователю визуально просматривать, создавать и управлять своими связками ключей и паролями.
  • Wayland - современный протокол графического сервера в Linux (активно используется в последних версиях Raspberry Pi OS). Из-за его архитектурных отличий от старого X11 некоторые классические механизмы (например, автозапуск менеджеров паролей) могут работать нестандартно, что и вызывает подобные ошибки.
  • argv.json - скрытый конфигурационный файл Visual Studio Code, в котором задаются низкоуровневые параметры запуска редактора, применяемые еще до загрузки основного графического интерфейса.
  • Weaker encryption (Слабое шифрование) - механизм обходного хранения секретов в VS Code, при котором токены сохраняются в локальном файле настроек редактора без использования криптографической защиты операционной системы.

 

Как установить Docker на Raspberry Pi 5: Полное пошаговое руководство

19.04.26
149

Raspberry Pi 5 - это невероятно мощный мини-компьютер, который идеально подходит для создания домашнего сервера, медиацентра или системы умного дома. Но чтобы выжать из него максимум и не захламлять систему десятками зависимостей, лучше всего использовать контейнеризацию.

Специально для читателей riopass.ru мы подготовили простую и быструю инструкцию по установке Docker на Raspberry Pi 5.

Подготовка системы

Перед установкой любого серьезного программного обеспечения правило номер один - обновить систему. Это поможет избежать конфликтов версий и гарантирует, что вы используете самые свежие пакеты безопасности.

Откройте терминал на вашей Raspberry Pi (или подключитесь к ней по SSH) и введите следующую команду:

sudo apt update && sudo apt upgrade -y

Дождитесь завершения процесса. Если обновлений было много, не лишним будет перезагрузить устройство командой sudo reboot

Установка Docker

Самый простой и официально рекомендуемый способ установки Docker на Raspberry Pi OS (которая базируется на Debian) - использование автоматического скрипта установки.

1. Загрузка установочного скрипта

Скачайте официальный скрипт с сайта Docker с помощью утилиты curl:

curl -fsSL https://get.docker.com -o get-docker.sh

2. Запуск скрипта

Теперь запустите скачанный скрипт с правами суперпользователя:

sudo sh get-docker.sh

Процесс установки займет пару минут. Скрипт самостоятельно определит архитектуру вашего процессора (ARM64 для Raspberry Pi 5) и скачает нужные версии пакетов.

Настройка прав доступа (чтобы работать без sudo)

По умолчанию для выполнения команд Docker требуются права root. Постоянно писать sudo docker - это неудобно и не совсем безопасно. Чтобы этого избежать, нужно добавить вашего текущего пользователя (обычно это пользователь pi или тот, которого вы создали при установке системы) в группу docker

Выполните команду:

sudo usermod -aG docker $USER

Чтобы изменения вступили в силу без перезагрузки всей системы, примените новую группу:

newgrp docker

(Примечание: если после этого команды Docker все равно требуют sudo, просто перезагрузите Raspberry Pi командой sudo reboot).

Проверка установки

Давайте убедимся, что всё прошло успешно. Введите в терминал команду для проверки версии:

docker --version

Вы должны увидеть актуальную версию Docker, например: Docker version 29.4.0, build 9d7ad9f.

А теперь - традиционный тест! Запустим тестовый контейнер hello-world:

docker run hello-world

Если установка прошла успешно, Docker скачает минималистичный образ и выведет на экран приветственное сообщение: "Hello from Docker!".

Настройка автозапуска

Чтобы контейнеры автоматически поднимались после сбоя питания или перезагрузки Raspberry Pi, нужно добавить службу Docker в автозагрузку:

sudo systemctl enable docker.service
sudo systemctl enable containerd.service

Оставайтесь с riopass.ru, впереди еще много полезных шпаргалок по настройке вашего домашнего сервера!

FAQ: Часто задаваемые вопросы

В: Почему Docker лучше обычной установки программ через apt install?
О: Docker изолирует приложения. Вы можете запустить пять разных версий Python на одной Raspberry Pi 5, и они не будут конфликтовать. Кроме того, удаление программы в Docker - это просто удаление контейнера, после которого в основной системе не остается никакого "мусора".

В: Сильно ли Docker нагружает Raspberry Pi 5?

О: Raspberry Pi 5 обладает мощным процессором и быстрой оперативной памятью, поэтому накладные расходы на работу Docker практически незаметны (обычно это 1-2% ресурсов). Это гораздо эффективнее, чем использование виртуальных машин.

В: Что делать, если Docker не скачивает образы (ошибки "Timeout" или "Connection refused")?

О: В некоторых регионах доступ к официальному Docker Hub может быть ограничен или работать нестабильно. В таких случаях можно использовать зеркала (прокси-репозитории).
Одним из надежных вариантов является прокси от Timeweb. Чтобы им воспользоваться, нужно отредактировать (или создать) файл конфигурации:

sudo nano /etc/docker/daemon.json

Добавьте туда следующий адрес:

{
  "registry-mirrors": ["https://dockerhub.timeweb.cloud/"]
}

После этого перезапустите службу: sudo systemctl restart docker. Теперь образы будут скачиваться через это зеркало.

В: Нужно ли использовать 64-битную ОС для Docker на Raspberry Pi 5?

О: Да, крайне желательно. Raspberry Pi 5 - это 64-битное устройство, и Docker работает эффективнее именно на 64-битных версиях Raspberry Pi OS или Ubuntu. Это также дает доступ к большему количеству современных образов.

В: Как обновить Docker до последней версии?

О: Поскольку мы устанавливали его через официальный репозиторий, Docker будет обновляться автоматически при выполнении стандартной команды обновления системы: sudo apt update && sudo apt upgrade.

Глоссарий

  • Docker (Докер) - специальная платформа, которая позволяет упаковать любую программу со всеми ее настройками и файлами в единый стандартизированный блок. Благодаря этому программа будет одинаково хорошо работать на любом устройстве, будь то ваш ноутбук или Raspberry Pi.
  • Docker Hub - крупнейшее в мире публичное хранилище (реестр) образов Docker. Это своего рода "магазин приложений", откуда скачиваются официальные образы Python, Nginx, PostgreSQL и тысяч других программ.
  • Контейнеризация - сама технология изоляции приложений друг от друга и от основной операционной системы. Контейнеры потребляют гораздо меньше ресурсов, чем традиционные виртуальные машины.
  • Образ (Image) - это готовый неизменяемый шаблон или "чертеж" программы. Скачивая образ (например, hello-world), вы получаете инструкцию для системы, как именно запускать приложение.
  • Контейнер (Container) - это "оживший" образ. Запущенная и работающая в изолированной среде программа. Из одного образа можно запустить несколько одинаковых контейнеров.
  • Репозиторий (Repository) - коллекция образов Docker с одинаковым именем, но разными тегами (версиями). Например, в репозитории python могут быть теги 3.10, 3.12-slim и так далее.
  • Терминал (Командная строка) - текстовый интерфейс для общения с операционной системой. Вместо того чтобы кликать мышкой по иконкам, вы вводите текстовые команды.
  • SSH (Secure Shell) - защищенный протокол, который позволяет вам подключиться к терминалу вашей Raspberry Pi удаленно, например, с основного компьютера или ноутбука.
  • Root / Sudo - Root это главный администратор (суперпользователь) в системах Linux, которому разрешено делать с системой абсолютно всё. Команда sudo (Superuser DO) позволяет обычному пользователю временно выполнить конкретную команду с правами этого самого главного администратора.
  • Скрипт - текстовый файл, содержащий последовательность команд, которые компьютер должен выполнить автоматически (например, скрипт установки Docker скачивает, распаковывает и настраивает все нужные файлы за вас).

Сокеты и Веб-сокеты: От системных вызовов 80-х до Real-time веба

18.03.26
199

Сетевые сокеты (Berkeley Sockets).
С точки зрения операционной системы, сокет - это дескриптор файла. В Unix-подобных системах "всё есть файл", и сокет не исключение. Это абстракция, которая позволяет программе читать и записывать данные в сеть так же просто, как в текстовый документ на диске.

Техническая формула: Socket = IP Address + Port + Protocol (TCP/UDP)
Дескриптор файла - это маленькое целое число, которое операционная система выдаёт процессу, когда тот открывает файл, сокет, канал, pipe, устройство или любой другой ресурс ввода‑вывода. Это идентификатор, через который программа взаимодействует с ресурсом.

История: Эпоха BSD

История Berkeley Sockets API - это фактически история того, как интернет стал интернетом. До 1983 года мир сетевых технологий напоминал Вавилонскую башню: каждый производитель железа (IBM, DEC, Xerox) имел свои протоколы, которые не умели "разговаривать" друг с другом.

В начале 80-х программирование под сеть было кошмаром. Если вы писали софт для мейнфрейма IBM, вы использовали одни системные вызовы; для машин DEC - другие. Не существовало единой абстракции "соединения".

Разработчики из Computer Systems Research Group (CSRG) в Университете Беркли, работая над релизом 4.2BSD, поставили цель: сделать работу с сетью такой же простой, как работу с файлами в Unix.

"Всё есть файл"

Гениальность Berkeley Sockets заключалась в адаптации концепции Unix "Everything is a file".

  • Чтобы прочитать данные из файла, вы его открываете, читаете и закрываете.
  • Билл Джой и его команда предложили делать то же самое с сетью.

Они ввели понятие дескриптора сокета. Сокет - это "конечная точка" (IP-адрес + Порт). Программисту стало неважно, как именно пакеты летят по проводам; ему достаточно было создать сокет и писать в него данные.

Популярность Berkeley Sockets была обусловлена двумя факторами:

  • Открытость: Код BSD был доступен для изучения и копирования.
  • Финансирование DARPA: Агентство продвигало TCP/IP как основной протокол для своей сети (предшественника интернета), и реализация Беркли была лучшей на рынке.

Как это работает  жизненный цикл сокета(Lifecycle)?

Жизненный цикл сокета - это последовательность системных вызовов, через которые проходит любое сетевое соединение. Каждый шаг меняет состояние сокета в ядре и определяет, что с ним можно делать дальше. Ниже - подробное, но компактное объяснение, ориентированное на разработчика, который хочет понимать, что реально происходит под капотом.

Чтобы понять, как работает жизненный цикл сокета, проще всего представить его как процесс установки телефонной связи в офисе. Есть "телефонный аппарат" (сам сокет), "номер" (IP и порт) и "оператор" (ядро ОС).

1. socket() - Покупка телефона
Процесс начинается с системного вызова socket(). На этом этапе вы просто сообщаете операционной системе: "Мне нужно устройство для связи".

  • Что происходит: ОС выделяет ресурс и возвращает дескриптор (целое число).
  • Параметры: Вы выбираете "тип" связи. Обычно это AF_INET (IPv4) и SOCK_STREAM (TCP, для надежности) или SOCK_DGRAM (UDP, для скорости).

2. bind() - Присвоение номера
У вас есть телефон, но у него нет номера. Вызов bind() привязывает сокет к конкретному адресу сетевой карты и порту.

  • Для сервера: Это обязательно. Сервер должен "сидеть" на известном порту (например, 80 для HTTP), чтобы клиенты знали, куда стучаться.
  • Для клиента: Обычно не вызывается вручную; ОС сама выделяет свободный случайный порт при подключении.

3. listen() - Перевод в режим ожидания (Только сервер)
Этот вызов превращает обычный сокет в пассивный. Сервер говорит системе: "Я готов принимать звонки".

  • Очередь (backlog): В параметрах указывается размер очереди. Если 10 клиентов постучатся одновременно, а сервер занят, listen определит, сколько из них подождут, а кому сразу придет отказ.
  • Что происходит, если очередь заполнена? Пришли 10 клиентов, они сидят в очереди в ядре ОС. Пришёл 11, ОС смотрит "мест нет". ОС либо просто игнорирует пакет (клиент отвалится по таймауту), либо отправляет ему ECONNREFUSED (отказ в соединении).

4. connect() vs accept() - Установка связи
Здесь пути клиента и сервера расходятся:

  • connect() (Клиент): Клиент инициирует "трехэтапное рукопожатие" (TCP Three-way Handshake). Он отправляет запрос серверу.
  • accept() (Сервер): Это блокирующий вызов. Сервер "засыпает" на этой строчке кода, пока не придет клиент. Как только соединение установлено, accept "просыпается" и создает новый отдельный сокет специально для этого клиента.
  • Важно: Основной сокет продолжает слушать других, а новый - используется для общения с конкретным подключившимся пользователем.

5. send() / recv() - Разговор
Когда соединение установлено, начинается обмен данными.

  • Байты, а не объекты: Сокеты ничего не знают о JSON, картинках или тексте. Они передают только сырые байты.
  • Потоковый режим: В TCP данные могут прийти не целиком, а кусками. Разработчику нужно проверять, сколько байт реально получено, и "склеивать" их.

6, close() - Повесить трубку
Когда данные переданы, одна из сторон (или обе) вызывает close(). Это высвобождает дескриптор в ОС и закрывает порт.

WebSockets: Живое общение в браузере

Протокол HTTP (до версии 1.1 включительно) был "молчаливым". Клиент спросил - сервер ответил - соединение закрылось. Чтобы сделать чат, браузеру приходилось каждые 2 секунды отправлять пустые запросы (Polling). Это создавало огромную нагрузку на сервер и дикие задержки.
Протокол WebSocket (RFC 6455)
В 2011 году появился WebSocket. Его главная фишка - Full-Duplex (полный дуплекс). Это значит, что и клиент, и сервер могут одновременно слать данные друг другу по одному открытому каналу.
Почему HTTP не справлялся?

Чтобы понять ценность WebSocket, нужно осознать масштаб проблемы Polling (опроса).

Представьте чат на 1000 человек. При обычном опросе (Short Polling) сервер получает 500 запросов в секунду, даже если никто ничего не пишет. Каждый такой запрос - это:

  • Установление TCP-соединения (3-way handshake).
  • Огромные HTTP-заголовки (Cookies, User-Agent), которые весят больше, чем само сообщение "Привет".
  • Закрытие соединения.

Long Polling (длинные опросы) немного спасали ситуацию: сервер держал запрос открытым, пока не появятся данные. Но это все равно был "костыль", съедающий ресурсы сервера.

Внутри канала: Что такое Фреймы (Frames)?

Когда соединение установлено, данные больше не передаются в виде текста с заголовками. Они упаковываются в бинарные фреймы.

Фрейм - это очень компактный конверт. В нем есть:

  • FIN бит: Указывает, является ли этот кусок данных финальным или за ним последуют еще.
  • Opcode: Тип данных (0x1 - текст, 0x2 - бинарные данные, 0x8 - закрытие соединения, 0x9 - пинг).
  • Payload length: Размер данных. Для маленьких сообщений заголовок фрейма весит всего 2-10 байт. Сравни это с 500+ байтами заголовков HTTP.

Ключевые отличия для IT-специалиста

Сетевой сокет (L4): Это программный интерфейс (API) операционной системы. Когда ты открываешь сокет, ты говоришь ОС: "Выдели мне порт и отправляй все байты с этого IP-адреса моему приложению".

WebSocket (L7): Это протокол прикладного уровня. Он добавляет к "сырому" сокету правила: как поздороваться (Handshake), как зашифровать данные (Masking) и как делить поток байтов на понятные сообщения (Frames).

ХарактеристикаСетевые сокеты (TCP/UDP)WebSockets
Уровень OSIТранспортный (L4)Прикладной (L7), работает поверх TCP
Среда выполненияОС, системные вызовы, backendБраузеры, веб‑серверы
Формат данныхСырые байты. Нет понятия "сообщение", только поток.Фреймы. Есть четкие границы сообщений (текст/бинарные).
API‑сложностьНизкоуровневая (нужно самому склеивать пакеты).Высокоуровневая (события: onmessage, onerror).
ТранспортTCP или UDPТолько TCP (как база для надежности)
БезопасностьПрямой доступ к портам (опасно для браузера).Работает через HTTP Handshake, поддерживает шифрование (WSS).
АдресацияIP-адрес и порт (напр. 192.168.1.1:8080)URL-схема (напр. wss://example.com/chat)
Проход через ProxyЧасто блокируются корпоративными фаерволами.Маскируются под HTTP, легко проходят через прокси.

Когда и что выбирать?

СитуацияЧто использовать?Почему?
Браузерный чат / УведомленияWebSocketsЕдинственный стандартный способ держать живое соединение в JS.
Мобильная игра (Unity/C++)TCP/UDP сокетыМинимальные задержки, нет лишнего оверхеда протокола WebSocket.
Система мониторинга (Веб-панель)WebSocketsУдобство интеграции с React/Vue и простота API.
Передача потокового видео (Real-time)WebRTC (UDP-based)WebSockets могут быть медленными из-за TCP-контроля доставки.