awesome-everything EN
↑ Обратно к восхождению

Сети и протоколы

L4 vs L7 балансировка и сохранение IP клиента

Суть L4 маршрутизирует по IP:порту за 1–5 мкс с пропускной способностью 10–40 Гбит/с; L7 парсит HTTP за 100–500 мкс для умной маршрутизации — а X-Forwarded-For, RFC 7239 и PROXY protocol каждый по-своему сохраняют IP клиента.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на middle-высоте — в небе
◷ 11 min

Логи сервиса показывают, что все запросы приходят с одного IP — IP балансировщика. Нельзя применить rate limiting по клиенту, geo-блокировку, нельзя провести аудит. Это цена невнимательного выбора уровня, на котором работает балансировщик.

Layer 4: маршрутизация по IP и порту

L4 балансировщик видит только TCP или UDP заголовок. Маршрутизирует по 4-tuple: IP источника, порт источника, IP назначения, порт назначения. HTTP-payload он никогда не читает.

Механика:

  • Видит TCP SYN от клиента.
  • Выбирает backend по настроенному алгоритму.
  • Либо перезаписывает IP назначения (режим NAT), либо открывает новое TCP-соединение к backend (режим прокси).
  • Передаёт сырые TCP-сегменты в обоих направлениях.

Стоимость: ~1–5 мкс на пакет, <1% CPU. Пропускная способность: 10–40 Гбит/с на сервер.

Что L4 умеет:

  • Маршрутизировать любой TCP/UDP-протокол (PostgreSQL, Redis, MQTT, кастомный бинарный).
  • Обрабатывать миллионы соединений в секунду.
  • Завершать TCP независимо от HTTP.

Что L4 не умеет:

  • Инспектировать или модифицировать HTTP-заголовки, путь или host.
  • Делать retry на HTTP 5xx (он не понимает HTTP).
  • Завершать TLS без понимания формата TLS-записей.
  • Маршрутизировать /api/v1/ и /api/v2/ на разные backends.

Layer 7: маршрутизация по содержимому HTTP

L7 балансировщик завершает HTTP (и TLS) соединение, парсит запрос и применяет правила маршрутизации перед пересылкой на backend.

Механика:

  1. Завершает TLS клиента — видит открытый текст.
  2. Читает HTTP-метод, путь, заголовок Host, кастомные заголовки.
  3. Применяет правила маршрутизации (например, /api/ → пул A, /static/ → пул B).
  4. Открывает новое соединение (или переиспользует пул) к выбранному backend.
  5. Пересылает запрос (добавляя proxy-заголовки, такие как X-Forwarded-For).

Стоимость: ~100–500 мкс на запрос, 5–15% CPU. Пропускная способность: 1–10 Гбит/с на сервер.

Что L7 добавляет к L4:

  • Маршрутизацию по содержимому: путь, hostname, заголовок, cookie.
  • Retry на 5xx (понимает HTTP-семантику).
  • Метрики на endpoint, rate limiting, проверки аутентификации.
  • Завершение TLS один раз на edge LB вместо каждого backend.
  • Разделение трафика (10% → canary, 90% → stable).
L4 vs L7 балансировка
Задержка хопа L4
1–5 мкс
Задержка хопа L7
100–500 мкс
Пропускная способность L4 на сервер
10–40 Гбит/с
Пропускная способность L7 на сервер
1–10 Гбит/с
CPU L4 на пакет
<1%
CPU L7 на запрос
5–15%
Протоколы L4
любой TCP/UDP
Протоколы L7
HTTP, gRPC, WebSocket

Сохранение IP клиента

Когда LB пересылает запрос на backend, backend видит IP LB в качестве TCP-источника — не реальный IP клиента. Существуют три стандарта для восстановления этой информации:

X-Forwarded-For (XFF)

X-Forwarded-For: 203.0.113.195

LB добавляет IP клиента в этот заголовок. Только для HTTP. Тривиально подделывается: вредоносный клиент может отправить X-Forwarded-For: 1.2.3.4, и непроверенный прокси добавит его, а не перезапишет. Надёжен только крайний правый IP, добавленный доверенным прокси.

Заголовок RFC 7239 Forwarded

Forwarded: for=203.0.113.195;proto=https;host=example.com

Стандартизированный (RFC 7239), структурированный формат, сложнее некорректно распарсить. Включает протокол и host вместе с IP. Только для HTTP, но менее подвержен случайному неверному разбору.

PROXY protocol (HAProxy)

Текстовый или бинарный заголовок, добавляемый перед TLS/HTTP-payload:

PROXY TCP4 203.0.113.195 93.184.216.34 35646 80\r\n

Работает для любого TCP/UDP-протокола — HTTP не нужен. TCP-стек backend читает заголовок до любого парсинга на прикладном уровне. Сложнее подделать, чем HTTP-заголовок, поскольку вставляется на транспортном уровне доверенным прокси. Nginx, HAProxy и Envoy поддерживают PROXY protocol.

Что выбрать: HTTP-сервисы за доверенными прокси → XFF или RFC 7239. Не-HTTP-сервисы (PostgreSQL, MQTT, кастомный бинарный) или там, где важна устойчивость к подделке → PROXY protocol.

Проследи
1/4

Проследите запрос, переходящий с L4 на L7 в двухуровневой архитектуре LB.

1
Step 1 of 4
Клиент подключается к L4 балансировщику на порту 443. Что видит L4 LB и по чему может маршрутизировать?
2
Locked
L4 LB пересылает на L7 LB (например, Envoy). L7 LB завершает TLS. Что он видит теперь?
3
Locked
L7 LB добавляет X-Forwarded-For и пересылает на пул backend A. Backend читает XFF. Какое допущение о доверии он должен делать?
4
Locked
Backend нужен реальный IP клиента для rate limiting, но это сырой TCP-сервис (не HTTP). Как получить IP клиента?
Какой RFC?

Какой RFC стандартизирует заголовок Forwarded для сохранения IP клиента через прокси?

Почему это работает

Зачем L4 + L7 последовательно? Многие production-архитектуры используют L4 LB на сетевом edge (BGP anycast, поглощает флуды, обрабатывает миллионы соединений) и L7 LB за ним (завершает TLS, применяет политики маршрутизации, выдаёт метрики на endpoint). L4-уровень дёшево справляется с пакетным потоком; L7-уровень добавляет интеллект без необходимости масштабироваться до пакетной пропускной способности. AWS использует этот двухуровневый паттерн: Network Load Balancer (L4) → Application Load Balancer (L7).

Викторина

Нужно маршрутизировать /api/payments/ на PCI-DSS-совместимый пул backend, а /api/catalog/ на обычный пул. Какой уровень балансировщика может это сделать и почему?

Вспомните перед уходом
  1. 01
    Нужно маршрутизировать по HTTP-пути и делать retry на 5xx. Какой уровень LB требуется и какова его задержка?
  2. 02
    Почему X-Forwarded-For поддаётся подделке, и как PROXY protocol улучшает ситуацию?
  3. 03
    Когда выбирают L4 вместо L7 даже для HTTP-трафика?
Итог

L4 балансировщики маршрутизируют по TCP/UDP 4-tuple — они быстрые (1–5 мкс, 10–40 Гбит/с) и не зависят от протокола, но не могут инспектировать HTTP. L7 балансировщики завершают TLS, парсят HTTP и обеспечивают маршрутизацию по пути/host/заголовку и retry на 5xx — ценой задержки 100–500 мкс и 5–15% CPU. Оба типа скрывают IP клиента от backend; три стандарта для его восстановления: X-Forwarded-For (де-факто, но поддаётся подделке), RFC 7239 Forwarded (структурированный, только HTTP) и PROXY protocol (бинарный, любой TCP/UDP, сложнее всего подделать). Production-архитектуры часто используют L4 на edge и L7 за ним: сырой пакетный поток дёшево на L4, контент-интеллект на L7.

Связанные уроки
встречается в162
Продолжить восхождение ↑Health checks, connection draining и slow start
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.