Что такое PROXY protocol?

«Что такое PROXY protocol?» — вопрос из категории Сети, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

PROXY protocol — это легковесный протокол, разработанный HAProxy, который позволяет передавать информацию о клиентском соединении (исходный IP-адрес клиента, порт) через цепочку прокси-серверов или балансировщиков нагрузки к конечному серверу приложения. Без него конечный сервер видит только IP последнего прокси (например, балансировщика), что ломает логирование, геолокацию и механизмы безопасности.

Проблема, которую он решает: В типичной схеме Клиент -> Load Balancer (LB) -> Backend Server backend-сервер видит в TCP/IP-заголовках только IP-адрес LB. PROXY protocol добавляет небольшую служебную информацию в начало TCP-сессии.

Версии:

  • PROXY protocol v1 (текстовый): Устаревший, используется человекочитаемый заголовок. PROXY TCP4 <клиентский IP> <серверный IP> <клиентский порт> <серверный порт>rn
  • PROXY protocol v2 (бинарный): Рекомендуемая версия. Бинарный формат, поддерживает IPv6, TLS-атрибуты, более эффективен.

Пример настройки в HAProxy для передачи клиентского IP на backend:

# Конфигурация HAProxy (haproxy.cfg)
frontend web_front
    bind *:80
    mode tcp  # Важно: PROXY protocol работает на уровне TCP (или HTTP в mode tcp)
    default_backend web_back

backend web_back
    mode tcp
    server backend1 10.0.1.10:8080 check send-proxy-v2  # Ключевая директива

Пример настройки Nginx для приема PROXY protocol:

# Конфигурация Nginx (backend-сервер)
server {
    listen 8080 proxy_protocol;  # Указываем, что на этом порту ожидается заголовок PROXY
    set_real_ip_from 10.0.0.0/8; # Доверяем PROXY-заголовку от IP балансировщика
    real_ip_header proxy_protocol; # Берем IP из PROXY-заголовка

    location / {
        # Теперь $remote_addr содержит реальный IP клиента
        proxy_pass http://localhost:3000;
    }
}

Применение в DevOps:

  1. Сохранение клиентского IP: Для корректного логирования доступа, анализа трафика и работы WAF (Web Application Firewall).
  2. Балансировка TCP-трафика: Особенно критично для не-HTTP протоколов, таких как SMTP, Redis, MySQL, где стандартный HTTP-заголовок X-Forwarded-For неприменим.
  3. Сквозное шифрование (TLS termination на backend): Позволяет балансировщику передавать TLS-соединение на backend, сохраняя информацию о клиенте.
  4. Использование с AWS Network Load Balancer (NLB): AWS NLB поддерживает PROXY protocol v2, что позволяет передавать IP-адреса клиентов на инстансы в Auto Scaling Group.

Важно: PROXY protocol должен поддерживаться как на отправителе (балансировщике), так и на получателе (backend-сервере). Поддерживается HAProxy, Nginx, Apache, Envoy и многими другими.