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