MAATRIX / Блог / Outline VPN на Debian 12 через Docker: установка

Outline VPN на Debian 12 через Docker: установка

MAATRIX

Outline — это протокол и набор инструментов от Jigsaw (подразделение Google), созданные специально для того, чтобы поднять собственный туннель без разбора консольных ключей и ручной правки конфигов. Сервер разворачивается одним Docker-контейнером, а управление ключами доступа происходит через приложение с графическим интерфейсом. Ниже — как поставить Outline Server на Debian 12: от подготовки системы и установки Docker до запуска контейнера и подключения Outline Manager.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Как устроен Outline изнутри

Outline состоит из трёх частей, и важно понимать, за что отвечает каждая, прежде чем что-то ставить.

Outline Server (Shadowbox) — Docker-контейнер, который крутится на вашем сервере. Внутри него работает outline-ss-server — реализация протокола Shadowsocks с поддержкой множества независимых паролей (ключей доступа) на одном порту. Именно этот контейнер вы будете разворачивать через Docker.

Outline Manager — desktop-приложение (Windows, macOS, Linux) для администратора. Оно подключается к серверу по отдельному API-порту, создаёт и удаляет ключи доступа, показывает расход трафика по каждому ключу, позволяет переименовывать пользователей и ограничивать лимиты.

Outline Client — приложение для конечного пользователя (Windows, macOS, Linux, iOS, Android, ChromeOS), которое устанавливает соединение по ключу, выданному менеджером. Поскольку в основе лежит Shadowsocks, подключиться можно и любым сторонним Shadowsocks-совместимым клиентом по ссылке вида ss://....

Ключевое отличие от «голого» Shadowsocks или WireGuard в том, что весь жизненный цикл ключей — создание, отзыв, лимиты по трафику — делается кликами в Manager, без захода на сервер по SSH. Это удобно, если вы администрируете туннель не только для себя, но и раздаёте доступ ещё нескольким людям.

Требования и подготовка сервера

Для Outline Server достаточно самого скромного VPS: 1 vCPU, 512 МБ–1 ГБ RAM с запасом под ОС и Docker. Нагрузка на CPU от шифрования трафика умеренная и растёт пропорционально числу активных клиентов и их трафику — для 3–10 личных ключей хватает младшего тарифа.

Перед установкой обновите систему и убедитесь, что часовой пояс и время выставлены верно (это влияет на проверку TLS-сертификатов внутри контейнера):

apt update && apt upgrade -y
timedatectl set-timezone UTC

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

Проверьте архитектуру процессора — официальный образ Outline публикуется под amd64 и arm64, так что для типового x86_64 VPS проблем не будет:

uname -m

Арендуйте сервер под свои задачи!

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Устанавливаем Docker

Outline Server запускается как обычный Docker-контейнер, поэтому Docker должен быть установлен и работать до старта установочного скрипта. На Debian 12 ставить лучше из официального репозитория Docker, а не из пакета docker.io в стандартных репозиториях — там версия обычно старше на несколько релизов. Весь процесс — подключение ключа, добавление репозитория bookworm, установка docker-ce и плагина docker-compose-plugin — подробно разобран в отдельной статье: установка Docker на Debian 12 с нуля.

После установки проверьте, что демон Docker поднялся и контейнеры реально запускаются:

systemctl status docker
docker run --rm hello-world

Если команда hello-world отработала без ошибок — можно переходить к самому Outline.

Установка через официальный скрипт

Самый простой и наиболее протестированный способ — воспользоваться установочным скриптом из репозитория Jigsaw-Code/outline-server. Он сам скачает нужный образ, сгенерирует самоподписанный сертификат, случайные порты и выведет данные для подключения Manager:

sudo bash -c "$(wget -qO- https://raw.githubusercontent.com/Jigsaw-Code/outline-server/master/src/server_manager/install_scripts/install_server.sh)"

Скрипт делает следующее: создаёт каталог /opt/outline, генерирует самоподписанный TLS-сертификат для API, поднимает контейнер shadowbox в режиме --net host (то есть контейнер слушает порты напрямую на хосте, без проброса -p), выбирает случайный порт для API-управления и случайный порт для ключей доступа — оба в диапазоне 1024–65535.

По завершении в терминале появится JSON примерно такого вида — сохраните его, он понадобится для настройки Manager:

{"apiUrl":"https://203.0.113.10:41287/AbCdEfGhIjKlMnOp","certSha256":"9F86D081884C7D659A2FEAA0C55AD015A3BF4F1B2B0B822CD15D6C15B0F00A0"}

Если нужен предсказуемый порт (например, чтобы явно открыть его в файрволе или прописать в NAT), передайте флаги при запуске:

sudo bash -c "$(wget -qO- https://raw.githubusercontent.com/Jigsaw-Code/outline-server/master/src/server_manager/install_scripts/install_server.sh)" install_server.sh --api-port=8443 --keys-port=9999

Так вы получите фиксированный порт 8443 для API и 9999 для доступа клиентов, вместо случайных значений при каждой переустановке.

Что скрипт делает под капотом (ручной запуск)

Если GitHub у вас недоступен напрямую или вы хотите контролировать процесс вручную — тот же результат достигается запуском контейнера самостоятельно. Ниже — упрощённый вариант того, что фактически выполняет установочный скрипт:

mkdir -p /opt/outline/persisted-state

docker run -d \
  --name shadowbox \
  --restart always \
  --net host \
  -v /opt/outline/persisted-state:/opt/outline/persisted-state \
  -e "SB_STATE_DIR=/opt/outline/persisted-state" \
  -e "SB_API_PORT=8443" \
  -e "SB_CERTIFICATE_FILE=/opt/outline/persisted-state/shadowbox-selfsigned.crt" \
  -e "SB_PRIVATE_KEY_FILE=/opt/outline/persisted-state/shadowbox-selfsigned.key" \
  -e "SB_DEFAULT_SERVER_NAME=Outline Server" \
  quay.io/outline/shadowbox:stable

Обратите внимание на --net host: Outline сознательно не использует проброс портов -p, потому что клиентские ключи создаются динамически и слушают на портах, которые не известны заранее в момент запуска контейнера. Хостовая сеть — самый простой способ не потерять ни один из них.

Сертификат при таком запуске придётся сгенерировать заранее (openssl req -x509 -nodes ...) и вычислить его SHA-256 отпечаток самостоятельно — это ровно то, что автоматизирует установочный скрипт. Для большинства случаев проще и надёжнее запускать через официальный скрипт, а к ручному варианту прибегать только если вам нужно нестандартное размещение файлов состояния или встраивание в собственный docker-compose.yml.

Файрвол и подключение Outline Manager

В отличие от WireGuard с одним UDP-портом, у Outline два разных порта, которые нужно открыть: порт API-управления (нужен только вам, с компьютера, где стоит Manager) и порт ключей доступа (нужен клиентам, TCP и UDP одновременно — UDP используется для части трафика, например DNS-запросов).

Пример правил для ufw — подставьте свои значения портов из вывода установочного скрипта (в примере ниже API слушает на 8443, а ключи доступа — на 9999):

ufw allow 8443/tcp comment 'outline api'
ufw allow 9999/tcp comment 'outline keys tcp'
ufw allow 9999/udp comment 'outline keys udp'
ufw enable

Если вы задавали порты флагами --api-port и --keys-port — откройте именно их, а не порт по умолчанию.

Дальше — Outline Manager:

  1. Скачайте Manager с официального сайта Outline (доступен для Windows, macOS, Linux).
  2. При первом запуске выберите «Set up Outline anywhere» / «Настроить сервер вручную».
  3. Вставьте JSON, который вывел установочный скрипт (apiUrl + certSha256).
  4. Manager подключится к серверу, покажет панель управления и создаст первый ключ доступа автоматически.

Из панели можно нажать «Add key», задать читаемое имя ключу (например, «Ноутбук», «Телефон жены») и переслать сгенерированную ss://-ссылку человеку — она откроется прямо в Outline Client одним касанием.

Обслуживание и что делать дальше

Контейнер shadowbox перезапускается автоматически при перезагрузке сервера благодаря --restart always, поэтому после ребута ничего вручную поднимать не нужно — проверить это можно командой docker ps.

Обновление до новой версии — это пересоздание контейнера с тем же volume, состояние (ключи, статистика) хранится в /opt/outline/persisted-state и не теряется:

docker stop shadowbox && docker rm shadowbox
docker pull quay.io/outline/shadowbox:stable
# повторить исходную команду docker run с теми же портами и путями

Резервную копию всего сервиса Outline фактически можно свести к копированию каталога /opt/outline/persisted-state — там лежат и ключи, и сертификат, и конфиг сервера. Общие принципы бэкапа контейнерных данных на сервере разобраны в статье про бэкап Docker volume, она применима и здесь.

Если хотите сравнить Outline с более классической связкой WireGuard/OpenVPN по числу шагов настройки и удобству для рядовых пользователей — обзор плюсов и минусов каждого протокола есть в статье WireGuard или OpenVPN: что выбрать для сервера.

Арендуйте сервер под свои задачи!

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Чем Outline отличается от обычного Shadowsocks-сервера?

Технически это тот же протокол Shadowsocks (реализация outline-ss-server), но с готовой панелью управления ключами, статистикой трафика по каждому пользователю и мобильными приложениями с одной кнопкой подключения — то, что в чистом Shadowsocks нужно собирать из отдельных инструментов вручную.

Нужен ли доверенный SSL-сертификат для API?

Нет. Скрипт генерирует самоподписанный сертификат, а Manager проверяет сервер по отпечатку (certSha256) из JSON, а не по цепочке доверия центров сертификации — это нормальная и штатная схема для Outline, а не временная заглушка.

Можно ли поставить несколько ключей доступа на одном сервере?

Да, это основной сценарий использования — один контейнер shadowbox обслуживает произвольное число ключей на одном порту доступа, ограничение только по совокупной нагрузке на CPU и канал сервера.

Что если официальный установочный скрипт с GitHub недоступен?

Используйте ручной запуск через docker run из раздела выше, либо скачайте скрипт на другой машине и перенесите на сервер по SCP перед выполнением.

Нужен ли Fail2ban для защиты Outline?

Сам протокол не публикует форму логина, которую можно перебирать, поэтому смысла в Fail2ban именно для Outline нет. А вот SSH-доступ к серверу стоит защищать отдельно — ключами вместо пароля и базовыми правилами файрвола.

Как полностью удалить Outline с сервера?

Остановите и удалите контейнер (docker stop shadowbox && docker rm shadowbox), затем удалите каталог /opt/outline — это уберёт и сам сервис, и все сохранённые ключи с сертификатами.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →