Перейти к содержанию

Core-нода

·4 минуты·
Core-нода — узел ядра сети, который принимает трафик от Entry-нод и маршрутизирует его в открытый интернет. Размещается вне регулируемого региона. Выполняет роль промежуточного CA в PKI-иерархии.

Роль в архитектуре #

graph TD Client["Клиент"] Entry["Entry-нода"] Core["Core-нода"] Internet["Интернет"] Client -->|"VLESS + gRPC
TLS 1.3"| Entry Entry -->|"VLESS + gRPC
TLS 1.3"| Core Core --> Internet style Core fill:#1d4ed8,color:#fff,stroke:#1e40af,stroke-width:3px style Client fill:#64748b,color:#fff,stroke:#475569 style Entry fill:#0891b2,color:#fff,stroke:#0e7490 style Internet fill:#374151,color:#fff,stroke:#1f2937

Core-нода — последнее звено в цепочке перед выходом в открытый интернет. Она принимает зашифрованный трафик от Entry-нод и направляет его к целевым ресурсам.

Характеристики #

ПараметрЗначение
ФункцияМаршрутизация трафика в интернет, промежуточный CA
РасположениеВне регулируемого региона
Жизненный циклДолгоживущая
КомпонентыNginx + Xray-core + сайт-прикрытие + etcd
Открытые порты22 (SSH), 80 (HTTP → HTTPS), 443 (HTTPS)
МаскировкаgRPC API микросервисов

Компоненты #

graph TD subgraph core["Core-нода"] Nginx["Nginx
0.0.0.0:443"] Xray["Xray-core
127.0.0.1:10003"] Site["Сайт-прикрытие"] Nginx -->|"/api.v2.rpc.{path}"| Xray Nginx -->|"/"| Site end Entry["Entry-нода"] -->|"TLS 1.3"| Nginx Xray --> Internet["Интернет"] style Nginx fill:#7c3aed,color:#fff,stroke:#6d28d9 style Xray fill:#2563eb,color:#fff,stroke:#1d4ed8 style Site fill:#64748b,color:#fff,stroke:#475569 style Entry fill:#0891b2,color:#fff,stroke:#0e7490 style Internet fill:#374151,color:#fff,stroke:#1f2937

Nginx #

  • TLS-терминация с сертификатом Let’s Encrypt;
  • маршрутизация по URL path: gRPC-трафик направляется на Xray, все остальные запросы — на сайт-прикрытие;
  • fallback: любой неизвестный запрос возвращает сайт-прикрытие (HTTP 200 OK).

Xray-core #

  • Слушает только на 127.0.0.1 (недоступен извне);
  • протокол: VLESS + gRPC;
  • inbound: принимает трафик от Entry-нод;
  • outbound: freedom — прямой выход в интернет.

Сайт-прикрытие #

  • Полноценный веб-сайт (SPA), доступный по основному домену;
  • при обращении к любому URL без VLESS-заголовков — возвращается сайт-прикрытие;
  • контент уникальный и нейтральный, сайт выглядит «живым» при ручной проверке.

Ядро сети (mesh) #

Core-ноды образуют ядро сетевой топологии core-periphery. Между собой они связаны полносвязной mesh-сетью:

  • Core-ноды проверяют друг друга через общий Root CA;
  • при необходимости Core-ноды могут передавать друг другу административную ответственность за Entry-ноды;
  • выход одной Core-ноды из строя не нарушает работу остальных.
graph TD Core1["Core #1"] Core2["Core #2"] Core3["Core #3"] Core1 ---|"Root CA"| Core2 Core2 ---|"Root CA"| Core3 Core1 ---|"Root CA"| Core3 style Core1 fill:#1d4ed8,color:#fff,stroke:#1e40af style Core2 fill:#1d4ed8,color:#fff,stroke:#1e40af style Core3 fill:#1d4ed8,color:#fff,stroke:#1e40af

Управление Entry-нодами #

Каждая Core-нода административно отвечает за группу Entry-нод:

  • конфигурирование Xray и Nginx на Entry-нодах;
  • ротация gRPC-путей на участке Entry → Core;
  • мониторинг состояния и доступности;
  • выпуск сертификатов для Entry-нод (промежуточный CA).

Core-нода имеет SSH-доступ к своим Entry-нодам по ключу для автоматизации этих операций.

Core-ноды могут передавать свои Entry-ноды другим Core-нодам — например, для вывода Core-ноды из ротации на обслуживание. Механизмы передачи находятся на этапе архитектурного планирования.

Ротация gRPC-путей #

Core-нода периодически генерирует новые случайные gRPC-пути (/api/v2/rpc/{random}/) и обновляет конфигурацию на всех своих Entry-нодах. Процесс:

  1. Генерация нового случайного пути.
  2. Обновление конфигурации Nginx и Xray на Core-ноде.
  3. Валидация новой конфигурации.
  4. Обновление конфигурации на каждой Entry-ноде по SSH.
  5. В случае ошибки — автоматический откат.

Клиентские пути при этом не затрагиваются — ротация касается только участка Entry → Core.

Промежуточный CA (PKI) #

Core-нода выступает промежуточным удостоверяющим центром:

  • получает свой сертификат от Root CA (Root-нода);
  • выпускает сертификаты для Entry-нод;
  • Entry-ноды принимают сертификаты любой Core-ноды сети.
ПараметрЗначение
Источник сертификатаRoot CA (Root-нода)
Срок жизниДолгосрочный
Выпускает сертификаты дляEntry-нод
ОтзывРучной, с Root-ноды

Маскировка трафика #

На участке Entry → Core трафик выглядит как gRPC-вызовы к API микросервисов:

  • стандартный TLS 1.3 handshake;
  • валидный сертификат Let’s Encrypt;
  • HTTP/2 с gRPC content-type;
  • случайные serviceName, имитирующие реальные API.

Этот участок наиболее уязвим для анализа DPI, так как трафик пересекает границу регулируемого региона.

Взаимодействие с хранилищем данных #

Core-ноды играют центральную роль в системе хранения данных сети.

KV-кластер (etcd) #

На начальном этапе Core-ноды хостят узлы распределенного KV-кластера (etcd). Через KV-хранилище выполняются все оперативные задачи:

  • обновление статусов Entry-нод;
  • ротация gRPC-путей;
  • управление пользователями (добавление, изменение, удаление);
  • обновление конфигураций узлов.
ПараметрЗначение
Права доступаЧтение — все данные; запись — оперативные изменения
РазмещениеНа Core-нодах (начальный этап)

Git-репозиторий #

Core-ноды имеют доступ на запись в приватный Git-репозиторий. Каждая Core-нода периодически фиксирует оперативные изменения из KV-хранилища в Git (направление KV → Git). Это обеспечивает непрерывное версионирование и сохранение актуального состояния сети даже при неактивной Root-ноде.

Требования к серверу #

ПараметрМинимум
CPU1 vCPU
RAM512 MB
Диск10 GB SSD
ОСUbuntu 22.04 / Debian 12
IPv4Выделенный белый адрес
ЛокацияВне регулируемого региона

Реагирование на компрометацию #

При компрометации Core-ноды (обнаружение и блокировка DPI):

  1. Уведомить администратора (Root-нода).
  2. Перевести Entry-ноды, привязанные к этой Core-ноде, на другие Core-ноды.
  3. Отозвать сертификат промежуточного CA скомпрометированной Core-ноды.
  4. Перевыпустить сертификаты Entry-нод, которые были привязаны к этой Core-ноде.
  5. При необходимости — развернуть новую Core-ноду.