Быстрый старт
Разворачиваем минимальный рабочий кластер из двух серверных узлов и настраиваем три маршрута: блокировку нежелательного домена, локальный обход и выход через удалённый узел.
Замените master-1.example.com и exit-1.example.com на фактические
имена ваших серверов. DNS-запись каждого хоста должна указывать на IP
соответствующего сервера.
Топология примера
[edge-клиент] ──────► master-1.example.com:443 (master + edge + exit)
│
┌───────────────┼───────────────┐
▼ ▼ ▼
drop (сброс) localhost (прямо) exit-1.example.com:443
│
▼
[интернет]
| Узел | Роли | Адрес |
|---|---|---|
master-1 | master, edge, exit | master-1.example.com:443 |
exit-1 | exit | exit-1.example.com:443 |
localhost | псевдо-узел (встроен) | — |
drop | псевдо-узел (встроен) | — |
master-1 совмещает роли master, edge и exit на одном порту 443 —
так control plane и data plane делят один TLS-слушатель, не требуя
открытия дополнительного порта.
Установка пакетов
Ставим серверный пакет на оба сервера и десктоп-клиент на машину администратора. Подробнее — в гайде по установке.
# На master-1 и exit-1
curl -fsSL https://repo.ololo.tech/setup.sh | sudo sh
sudo apt install ololo-relay # Debian / Ubuntu
sudo dnf install ololo-relay # Fedora / RedOS
# На машине администратора
sudo apt install ololo-relay-admin
sudo dnf install ololo-relay-admin
TLS-сертификаты
Оба сервера слушают на порту 443 и требуют валидный TLS-сертификат.
Если у вас уже есть сертификаты (корпоративный CA, Wildcard и т.п.) —
пропустите этот раздел и укажите пути к fullchain.pem и privkey.pem
в конфиге.
Для Let’s Encrypt используем certbot в режиме standalone. В этом режиме certbot сам открывает порт 80 для подтверждения — ololo-relay в этот момент должен быть остановлен (при первичной настройке он ещё не запущен).
# На каждом сервере
sudo apt install certbot # Debian / Ubuntu
sudo dnf install certbot # Fedora / RedOS
# На master-1
sudo certbot certonly --standalone -d master-1.example.com
# На exit-1
sudo certbot certonly --standalone -d exit-1.example.com
Автопродление (systemd-таймер проверяет истечение раз в 12 ч):
sudo systemctl enable --now certbot.timer
Права доступа к сертификатам
Let’s Encrypt хранит закрытые ключи в /etc/letsencrypt/archive/ с правами
600 (только root). Служба ololo-relay работает от имени пользователя
ololo-relay и не может прочитать ключи без дополнительной настройки.
Выдайте права через файловые ACL (требуется acl — на большинстве дистрибутивов
уже установлен):
# На каждом сервере, где используется Let's Encrypt
sudo apt install acl # Debian / Ubuntu, если ещё не установлен
sudo dnf install acl # Fedora / RedOS
sudo setfacl -R -m u:ololo-relay:rX /etc/letsencrypt/live/
sudo setfacl -R -m u:ololo-relay:rX /etc/letsencrypt/archive/
Проверьте, что права применены:
sudo getfacl /etc/letsencrypt/archive/
В выводе должна быть строка user:ololo-relay:r-x.
Хук автопродления
После продления сертификата достаточно сигнала SIGHUP — служба перечитает
сертификаты с диска без разрыва активных соединений. Создайте deploy-хук:
cat | sudo tee /etc/letsencrypt/renewal-hooks/deploy/reload-ololo.sh <<'EOF'
#!/bin/sh
systemctl reload ololo-relay
EOF
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-ololo.sh
Настройка master-1
Генерация токена администратора
Мастер-узел не стартует без начальной политики, а начальная политика должна содержать хотя бы один peer с его токеном. Токен нужно сгенерировать заранее — мастер не может создать его сам до первого старта.
Выполните на любой машине с openssl:
# Raw-токен: 32 байта, base64url без символа отступа
MASTER1_TOKEN=$(openssl rand 32 | base64 | tr '+/' '-_' | tr -d '=\n')
echo "Токен (сохраните в надёжном месте):"
echo "$MASTER1_TOKEN"
# SHA-256 от токена — именно это значение идёт в initial-policy.yaml
MASTER1_HASH=$(printf '%s' "$MASTER1_TOKEN" | sha256sum | awk '{print $1}')
echo "SHA-256: $MASTER1_HASH"
Начальная политика (initial-policy.yaml)
Файл загружается мастером только один раз — при первом старте,
когда база данных ещё пуста. После первого старта источником правды
становится bbolt-база; изменения в initial-policy.yaml на следующих
стартах игнорируются.
Создайте файл на master-1:
sudo nano /etc/ololo-relay/initial-policy.yaml
version: 1
peers:
- id: master-1
kind: server
admin: true
roles:
master: true
edge: true
exit: true
addrs: ["master-1.example.com:443"]
token_sha256: "ВСТАВЬТЕ_ЗНАЧЕНИЕ_MASTER1_HASH"
tun_address: "100.64.0.1/32"
tun_mtu: 1420
exit_listen: "0.0.0.0:443"
camouflage:
mode: embedded
routes: []
default:
mode: relay
peers: ["master-1"]
Замените ВСТАВЬТЕ_ЗНАЧЕНИЕ_MASTER1_HASH на шестнадцатеричную строку,
которую напечатал предыдущий шаг.
Конфигурация узла (node.yaml)
sudo nano /etc/ololo-relay/node.yaml
node:
id: master-1
data_dir: /var/lib/ololo-relay
master:
data_file: /var/lib/ololo-relay/policy.bbolt
initial_policy_file: /etc/ololo-relay/initial-policy.yaml
edge:
tun:
name: ololo0
exit:
tls:
cert_file: /etc/letsencrypt/live/master-1.example.com/fullchain.pem
key_file: /etc/letsencrypt/live/master-1.example.com/privkey.pem
Флаг master задаётся только через секцию master: в конфиге — UI
его не меняет. Флаги edge и exit активируются через одноимённые
секции в node.yaml и через roles: в политике.
После создания обоих файлов:
sudo systemctl enable --now ololo-relay
sudo journalctl -u ololo-relay -f
В логе должны появиться строки вида master started и edge ready.
Подключение десктоп-клиента
Запустите ololo-relay-admin и откройте вкладку Настройки. В
первый раз кластер ещё не добавлен — нажмите + в правом
верхнем углу окна, затем заполните форму:

| Поле | Значение |
|---|---|
| Имя кластера | home-relay (любое, только для вкладки) |
| Master | master-1.example.com:443 |
| Admin token | значение MASTER1_TOKEN из шага выше |
Нажмите Сохранить, затем Проверить (WhoAmI) — должен вернуться идентификатор мастера. Если выдаётся ошибка соединения — проверьте доступность порта 443 на мастере и правильность токена.
Просмотр узлов
Переключитесь на вкладку Узлы. Мастер автоматически регистрирует
сам себя при первом старте — вы увидите запись master-1 с флагами
Маст, Edge, Вых и адресом мастер-узла.

Регистрация выходного узла (exit-1)
Добавление через CLI
На машине с ololo-relay-admin (или на любом хосте, где установлен
пакет) выполните:
export OLOLO_RELAY_MASTER=master-1.example.com:443
export OLOLO_RELAY_ADMIN_TOKEN="<MASTER1_TOKEN>"
ololo-relay admin peer add \
--id exit-1 \
--kind server \
--exit \
--addrs "exit-1.example.com:443" \
--tun-address "100.64.0.2/32" \
--exit-listen "0.0.0.0:443" \
--camouflage embedded
Команда зарегистрирует узел в политике и напечатает сниппет с токеном:
Bootstrap snippet for this node (KEEP THIS TOKEN SECRET):
node:
id: exit-1
master_token: <СГЕНЕРИРОВАННЫЙ_ТОКЕН>
Скопируйте значение master_token — оно понадобится для конфига
exit-1. Повторно увидеть токен не получится; при утере используйте
ololo-relay admin peer rotate-token.
Конфигурация exit-1 (node.yaml)
На сервере exit-1:
sudo nano /etc/ololo-relay/node.yaml
node:
id: exit-1
data_dir: /var/lib/ololo-relay
master_token: "<ТОКЕН_ИЗ_ПРЕДЫДУЩЕГО_ШАГА>"
masters:
- addr: master-1.example.com:443
exit:
tls:
cert_file: /etc/letsencrypt/live/exit-1.example.com/fullchain.pem
key_file: /etc/letsencrypt/live/exit-1.example.com/privkey.pem
sudo systemctl enable --now ololo-relay
После старта exit-1 обнаружит свою запись в политике и подключится
к мастеру. В списке Узлы статус изменится с «Офлайн» на «Онлайн».
Настройка маршрутов
Вкладка Маршруты показывает текущую таблицу. Пустой кластер
содержит только встроенный маршрут local-bypass (.local, .lan,
RFC 1918 — всегда напрямую):

Дроп-маршрут
Нажмите + Добавить и создайте маршрут для блокировки:

- Узлы — выберите
drop - Домены — домены или суффиксы, которые нужно блокировать,
например:
.ads-tracker.test, spy-analytics.test - CIDR — можно оставить пустым
Нажмите Применить.
Маршрут через выходной узел
Добавьте ещё один маршрут:
- Узлы — выберите
exit-1 - Домены — суффиксы, трафик к которым должен идти через
выходной узел, например:
.streaming-service.test - CIDR — при необходимости добавьте IP-диапазоны
После применения обновите страницу — маршруты появятся в таблице.
Политика раскатывается на узлы автоматически; статус синхронизации
виден в строке Загружено · policy vN · маршрутов: N под кнопкой
Обновить.
Проверка
С клиентской машины, подключённой через master-1 как edge:
# Трафик должен проходить через exit-1
curl -s https://ifconfig.me # IP должен совпасть с IP exit-1
# Блокируемые домены не должны резолвиться / соединяться
curl -v https://ads-tracker.test 2>&1 | grep -E "Failed|refused|dropped"
Журнал активных соединений и маршрутизации — вкладка Просмотр трафика в десктоп-клиенте.