Плоскость данных
Содержание
Входной слой #
Приём трафика #
K8s LoadBalancer принимает входящие соединения и распределяет их по Entry-подам. LoadBalancer работает на уровне L4 — он не терминирует TLS и не видит содержимое трафика. TLS-терминация происходит внутри Entry-пода.
Stateless-роутинг #
Entry-под не хранит таблицу маршрутов локально. При каждом новом клиентском подключении:
- Извлекает UUID клиента из VLESS-заголовков.
- Запрашивает etcd управляющего кластера: «на какую Core-ноду направить UUID X?»
- Получает адрес Core-ноды и SNI-домен ячейки.
- Кеширует результат на время активной сессии.
- Проксирует трафик на Core-ноду через mTLS.
Компрометация Entry-пода раскрывает только маршруты активных в этот момент сессий — не полную таблицу маршрутов сети.
Выходной слой #
Core-нода принимает трафик от Entry-подов по mTLS и направляет его в открытый интернет. Каждая Core-нода принадлежит отдельному участнику и работает автономно.
Связи между Core-нодами нет — они не знают друг о друге и не взаимодействуют напрямую.
Маскировка трафика #
На каждом участке трафик неотличим от легитимной HTTPS-активности.
| Участок | Что видит наблюдатель | Реальность |
|---|---|---|
| Клиент → Entry | HTTPS-запросы к обычному сайту | VPN-туннель (VLESS + gRPC) |
| Entry → Core | gRPC-вызовы к API микросервисов | VPN-туннель (VLESS + gRPC) |
На обоих участках:
- TLS 1.3 handshake — стандартный, неотличимый от обычного.
- Валидный сертификат от публичного CA.
- При обращении без VLESS-заголовков — сайт-прикрытие (HTTP 200 OK).
Протокольный стек #
| Уровень | Технология | Назначение |
|---|---|---|
| Шифрование | TLS 1.3 | Шифрование канала, валидный сертификат |
| Транспорт | gRPC (HTTP/2) | Мультиплексирование, маскировка под API |
| Протокол | VLESS | Легковесный прокси-протокол |
Независимость слоёв #
Входной и выходной слои масштабируются независимо. Количество Entry-подов не обязано совпадать с количеством Core-нод.
| Слой | Масштабирование | Ограничения |
|---|---|---|
| Входной | Добавление K8s worker nodes | Нет — горизонтально |
| Выходной | Подключение новых участников | Один участник = одна Core-нода |