Быстрый старт

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

Замените 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-1master, edge, exitmaster-1.example.com:443
exit-1exitexit-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 (любое, только для вкладки)
Mastermaster-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"

Журнал активных соединений и маршрутизации — вкладка Просмотр трафика в десктоп-клиенте.