Ротация путей Client → Entry
Содержание
Проблема #
Entry-нода — расходный узел с коротким жизненным циклом. При замене сервера меняется IP-адрес. Если клиент подключается напрямую к IP или по жестко заданному домену конкретного сервера, любая ротация Entry требует ручной выдачи новой ссылки каждому пользователю.
При масштабировании сети это становится операционной проблемой.
Привязка к домену, а не к серверу #
Пользователь подключается к домену, а не к IP-адресу конкретного сервера. Домен закреплен за ролью Entry в регионе — и может быть переназначен на новый IP при замене ноды.
| Что меняется при ротации Entry | Что остаётся неизменным |
|---|---|
| IP-адрес сервера | Домен (<DOMAIN>) |
| Запись A в DNS | UUID устройства |
| gRPC serviceName | |
| Subscription URL |
Для пользователя смена Entry выглядит как кратковременный перерыв в подключении во время переключения DNS — не более.
serviceName как адрес эндпоинта #
Клиентский VLESS-трафик идёт не просто на домен, а на конкретный путь — serviceName. Nginx на Entry маршрутизирует запросы именно по этому пути:
https://<DOMAIN>/api.v2.rpc.<serviceName> → Xray
https://<DOMAIN>/* → сайт-прикрытие
serviceName — случайная строка, уникальная для Entry-ноды. Наблюдатель, не знающий пути, не может отличить трафик от обращений к обычному сайту: все неизвестные запросы возвращают легитимный HTML.
При замене Entry новая нода наследует serviceName предыдущей — клиентские ссылки остаются рабочими.
Механизм подписки #
Вместо статической VLESS-ссылки клиент получает subscription URL — адрес эндпоинта, который в любой момент возвращает актуальную конфигурацию подключения.
https://<DOMAIN>/api/<UUID>
Клиент периодически обращается к этому адресу и автоматически обновляет профили подключения. При изменении serviceName или любого другого параметра — пользователь получит актуальную конфигурацию при следующем обновлении подписки, без каких-либо ручных действий.
Subscription-микросервис #
На каждой Entry-ноде развёртывается легковесный HTTP-микросервис — часть стандартной процедуры установки ноды. Nginx направляет запросы вида /api/<UUID> к нему:
location /api/ {
proxy_pass http://127.0.0.1:<PORT>;
}
Микросервис:
- Получает UUID из пути запроса.
- Проверяет, что устройство с таким UUID существует и активно (по локальному клону registry).
- Формирует VLESS-ссылку с актуальным
serviceNameдля этой Entry. - Возвращает конфигурацию в формате, совместимом с клиентами (base64).
Данные берутся из локального клона registry — без обращений к внешним сервисам.
UUID как токен подписки #
UUID устройства выполняет двойную роль: это одновременно идентификатор в Xray (аутентификация VPN-подключения) и токен доступа к subscription-эндпоинту.
Разделять их нет смысла: компрометация subscription URL неизбежно раскрывает UUID из ответа микросервиса. Оба секрета имеют одинаковый уровень чувствительности и единый жизненный цикл — они создаются вместе при регистрации устройства и выводятся из оборота вместе при его архивировании.
Subscription URL не хранится на серверах — он существует только на устройстве пользователя и доставляется однократно при регистрации.
Что происходит при ротации serviceName #
- Новый
serviceNameгенерируется и записывается в registry. - Обновляются конфиги Nginx и Xray на Entry-ноде.
- При следующем обращении клиента к
/api/<UUID>микросервис возвращает ссылку с новымserviceName. - Клиент автоматически обновляет профиль.
Пользователь не вовлечён в процесс.
Что происходит при замене Entry-ноды #
- Поднимается новый сервер.
- Выполняется стандартная процедура развёртывания Entry: устанавливаются Nginx, Xray, subscription-микросервис.
serviceNameи конфигурации пользователей переносятся из registry. - DNS-запись домена переключается на новый IP.
- В registry обновляется привязка домена к новому узлу.
- Старая нода выводится из оборота.
Subscription URL пользователя не меняется — он содержит домен, а не IP.
Что происходит при компрометации устройства #
- Устройство архивируется в registry — UUID выводится из конфига Xray на Entry.
- Создаётся новое устройство с новым UUID.
- Новый subscription URL доставляется пользователю через административный интерфейс.
Схема #
Сводная таблица #
| Компонент | Где хранится | Когда меняется |
|---|---|---|
| UUID | Registry, конфиг Xray | При компрометации или замене устройства |
| Домен | Registry, DNS | Не меняется (переназначается на новый IP) |
| serviceName (Client → Entry) | Registry, конфиг Nginx/Xray | По расписанию ротации или при замене Entry |
| Subscription URL | Только на устройстве | При компрометации устройства (смена UUID) |