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

Ячеистая топология

·3 минуты·
Сеть Sigil Gate разделена на ячейки — группы Core-нод, разделяющих один SNI-домен. Ячеистая топология изолирует компрометацию: блокировка одной ячейки не затрагивает остальные. Участники скомпрометированной ячейки восстанавливают доступ через живые ячейки и регенерируют инфраструктуру с нуля.

Что такое ячейка #

Ячейка — это группа Core-нод, которые разделяют один SNI-домен. Когда Entry-под подключается к Core-ноде, в TLS ClientHello указывается SNI этой ячейки — независимо от реального IP-адреса конкретной Core-ноды.

Для DPI-наблюдателя весь трафик ячейки выглядит как gRPC-взаимодействие с одним и тем же сервисом, хотя реально распределён по множеству независимых серверов.

graph TD subgraph "Ячейка A (sni: a.example.com)" CoreA1["Core-нода A1"] CoreA2["Core-нода A2"] CoreA3["Core-нода A3"] end subgraph "Ячейка B (sni: b.example.com)" CoreB1["Core-нода B1"] CoreB2["Core-нода B2"] end Entry["Входной слой"] -->|"SNI: a.example.com"| CoreA1 Entry -->|"SNI: a.example.com"| CoreA2 Entry -->|"SNI: a.example.com"| CoreA3 Entry -->|"SNI: b.example.com"| CoreB1 Entry -->|"SNI: b.example.com"| CoreB2 style CoreA1 fill:#1d4ed8,color:#fff,stroke:#1e40af style CoreA2 fill:#1d4ed8,color:#fff,stroke:#1e40af style CoreA3 fill:#1d4ed8,color:#fff,stroke:#1e40af style CoreB1 fill:#059669,color:#fff,stroke:#047857 style CoreB2 fill:#059669,color:#fff,stroke:#047857 style Entry fill:#0891b2,color:#fff,stroke:#0e7490

Внутри ячейки Core-ноды не взаимодействуют между собой — общий SNI-домен не означает доверия или связности.

Роутинг в ячеистой топологии #

Entry-под знает не только адрес целевой Core-ноды, но и ячейку, к которой она принадлежит. Маршрутная запись в etcd содержит:

  • IP-адрес конкретной Core-ноды (куда подключаться).
  • SNI-домен ячейки (что указывать в TLS ClientHello).
  • Идентификатор сертификата (для проверки mTLS).

Entry подключается напрямую к IP Core-ноды, но использует SNI ячейки — так трафик маскируется под обращение к единому сервису.

Компрометация ячейки #

Под компрометацией ячейки понимается блокировка SNI-домена ячейки системами DPI или другими мерами. Клиенты ячейки теряют связность, но управляющий кластер и другие ячейки продолжают работать.

При компрометации ячейки:

  1. Управляющий кластер фиксирует факт компрометации.
  2. Участники ячейки получают уведомление через Telegram-бот.
  3. Управляющий кластер выдаёт участникам временный доступ к живым ячейкам.
  4. Клиенты обновляют подписку → subscription-сервис возвращает конфигурацию резервной ячейки.
  5. Участники поднимают новые серверы с новым доменом.
  6. Управляющий кластер вводит новую ячейку в строй, выдаёт новые сертификаты.
  7. Клиенты мигрируют на новую ячейку через обновление подписки.
  8. Старая инфраструктура выводится из оборота.
sequenceDiagram participant Mgmt as Управляющий кластер participant Bot as Telegram-бот participant Part as Участник participant Client as Клиент participant Cell as Живая ячейка Mgmt->>Bot: Ячейка X скомпрометирована Bot->>Part: Уведомление + временный доступ Client->>Cell: Обновление подписки → резервный конфиг Part->>Mgmt: Регистрация новой Core-ноды (новый домен) Mgmt->>Client: Подписка → конфиг новой ячейки Part->>Mgmt: Старая нода выведена из оборота

Резервный доступ и паритет трафика #

Живые ячейки предоставляют участникам скомпрометированной ячейки временный резервный выход. Каждый участник самостоятельно определяет квоту трафика, которую он готов отдать другим участникам сети.

Учёт трафика ведётся управляющим кластером. Резервный доступ предоставляется в рамках установленных квот.

Структура ячеек #

ПараметрЗначение
Минимум Core-нод в ячейке1
SNI-доменОдин на ячейку, управляется администратором
Взаимодействие Core-нод внутри ячейкиОтсутствует
Взаимодействие ячеекТолько через управляющий кластер и subscription-механизм
Количество ячеек в сетиНе ограничено