Core-нода
Содержание
Роль в архитектуре #
Характеристики #
| Параметр | Значение |
|---|---|
| Владелец | Участник сети |
| Расположение | Вне регулируемого региона |
| Жизненный цикл | Долгоживущая (на усмотрение участника) |
| Инфраструктура | Docker-контейнер |
| Открытые порты | 443 (HTTPS для входного трафика) |
| Маскировка | gRPC API микросервисов |
Модель управления: phone-home #
Core-нода сама инициирует подключение к управляющему кластеру — не наоборот. Управляющий кластер не имеет доступа к серверу участника и не отдаёт ему команды через SSH.
При запуске контейнер:
- Устанавливает исходящее mTLS-соединение с управляющим кластером.
- Регистрирует свой адрес и параметры.
- Получает текущую конфигурацию (клиентские UUID, serviceName).
- Начинает принимать трафик от Entry-подов.
Участник полностью контролирует свой сервер: он платит за него, следит за его состоянием и может отключить его в любой момент.
Изоляция от других Core-нод #
Core-ноды не взаимодействуют между собой — никаких сетевых соединений, никакого доверия. Каждая Core-нода — изолированный участник. Компрометация одной Core-ноды не затрагивает остальные.
Компоненты контейнера #
Xray-core #
- Принимает входящий трафик от Entry-подов по mTLS + VLESS + gRPC.
- Outbound: прямой выход в интернет (freedom).
- Аутентифицирует клиентов по UUID.
Nginx #
- TLS-терминация с сертификатом от публичного CA.
- Маршрутизация: gRPC-трафик (по serviceName ячейки) → Xray, всё остальное → сайт-прикрытие.
- Fallback: при обращении без VLESS-заголовков — HTTP 200 OK с контентом сайта-прикрытия.
Сайт-прикрытие #
- Полноценный веб-сайт, доступный по основному домену.
- Защита от активного зондирования: наблюдатель не может отличить прокси от обычного сайта.
Phone-home агент #
- Поддерживает постоянное mTLS-соединение с управляющим кластером.
- Получает обновления конфигурации: новые UUID, ротацию serviceName.
- Отправляет heartbeat — управляющий кластер знает, что нода жива.
Принадлежность к ячейке #
Каждая Core-нода принадлежит одной ячейке. Ячейка определяет SNI-домен, который Entry-поды указывают в TLS ClientHello при подключении к этой Core-ноде.
Внутри ячейки Core-ноды не взаимодействуют — общий SNI-домен это только параметр сертификата, а не признак доверия.
→ Подробнее: ячеистая топология
Сертификаты #
| Сертификат | Источник | Назначение |
|---|---|---|
| TLS (публичный) | Let’s Encrypt | Защита входящего соединения, маскировка под легитимный HTTPS |
| mTLS (внутренний) | Управляющий кластер (CA) | Аутентификация Entry-подов, phone-home соединение |
Приватный ключ mTLS-сертификата генерируется локально при первом запуске контейнера и никогда не покидает сервер участника.
Требования к серверу #
| Параметр | Минимум |
|---|---|
| CPU | 1 vCPU |
| RAM | 512 MB |
| Диск | 10 GB SSD |
| ОС | Linux (Ubuntu 22.04 / Debian 12) |
| Обязательно | Docker |
| IPv4 | Выделенный белый адрес |
| Локация | Вне регулируемого региона |
Реагирование на инциденты #
При компрометации Core-ноды:
- Участник отключает ноду (или управляющий кластер фиксирует потерю heartbeat).
- Управляющий кластер отзывает mTLS-сертификат ноды.
- Entry-поды перестают направлять трафик на скомпрометированный адрес.
- Клиенты этой Core-ноды получают временный резервный доступ через другую ячейку.
- Участник поднимает новый сервер и проходит онбординг заново.