← Назад к вопросам

Что такое proxy протокол?

2.0 Middle🔥 81 комментариев
#Сети и протоколы

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Proxy Protocol?

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

Основная проблема и цель протокола

В традиционных архитектурах с прокси-серверами или балансировщиками нагрузки (например, HAProxy, Nginx, AWS ELB), конечный сервер (backend server), принимающий соединение, видит лишь IP-адрес прокси-сервера, а не реального клиента. Это создаёт серьёзные проблемы:

  • Потеря информации о клиенте: Сервер приложения не может узнать реальный IP клиента для целей аналитики, геолокации, контроля доступа или записи в лог.
  • Ограничения в безопасности: Невозможно применять правила фильтрации (например, блокировать нежелательные IP) на уровне приложения.
  • Проблемы с протоколами, требующими сохранения соединения: Например, для SSL/TLS или при работе с протоколами, где IP-адрес является частью логики (например, некоторые реализации FTP).

Proxy Protocol решает эту проблему, добавляя небольшую заголовочную информацию в начало TCP-соединения между прокси и конечным сервером.

Версии Proxy Protocol: v1 и v2

Существуют две основные версии протокола:

Proxy Protocol v1 (Human-readable)

Это текстовый (ASCII) формат. Заголовок добавляется прокси-сервером в самом начале данных, передаваемых серверу-приложению.

Пример заголовка v1 для IPv4:

PROXY TCP4 192.168.1.10 192.168.1.100 55555 80\r\n
  • PROXY — ключевое слово.
  • TCP4 — тип протокола и адресации (TCP, IPv4).
  • 192.168.1.10 — исходный (клиентский) IP-адрес.
  • 192.168.1.100 — IP-адрес прокси-сервера (destination).
  • 55555 — исходный (клиентский) порт.
  • 80 — порт прокси-сервера.

Недостатки v1: Текстовый формат менее эффективен для парсинга, подвержен ошибкам из-за пробелов или нестандартных окончаний строк.

Proxy Protocol v2 (Binary)

Более современная и рекомендуемая версия. Использует компактный двоичный формат, что повышает эффективность и безопасность. Поддерживает IPv6, SSL/TLS информацию (например, наличие TLS), дополнительные флаги.

Структура заголовка v2 начинается с сигнатурного байта 0x0D 0x0A 0x00 0x0D 0x0A 0x51 0x55 0x49 0x54 0x0A (CRLF + "PROXY"), затем версия/командный байт, тип протокола и сами данные адресов.

Как работает Proxy Protocol?

  1. Клиент устанавливает соединение с прокси-сервером (например, HAProxy).
  2. Прокси-сервер принимает это соединение и, если настроен на поддержку Proxy Protocol, устанавливает новое соединение с сервером-приложением (backend).
  3. В самом начале нового TCP-соединения прокси отправляет небольшой заголовок Proxy Protocol (v1 или v2), содержащий информацию о реальном клиенте.
  4. Сервер-приложение, который также должен быть настроен на приём и парсинг Proxy Protocol, читает этот заголовок, извлекает исходные адреса, а затем продолжает обработку обычных данных приложения (HTTP, SSL, etc.).

Конфигурация на практике: пример с HAProxy и Nginx

HAProxy (прокси) может отправлять заголовок. Конфигурация:

# В разделе backend или default в haproxy.cfg
server backend1 10.0.1.5:80 send-proxy-v2

Nginx (как конечный сервер) может принимать и обрабатывать Proxy Protocol. Для этого используется модуль ngx_stream_realip_module.

# Пример конфигурации Nginx для приёма Proxy Protocol v2
http {
    server {
        listen 80 proxy_protocol; # Указываем, что на порт приходит заголовок PP
        set_real_ip_from 10.0.0.0/8; # Доверенный адрес прокси (HAProxy)
        real_ip_header proxy_protocol; # Источник реального IP — заголовок PP

        location / {
            # Теперь переменные $remote_addr, $proxy_protocol_addr содержат реальный IP клиента
            access_log /var/log/nginx/access.log proxy;
        }
    }
}

Ключевые преимущества и области применения

  • Сохранение исходного IP-адреса клиента в логах приложения и для внутренней логики.
  • Работа с SSL/TLS Termination на прокси: Балансировщик может термировать TLS, но передавать информацию о том, что соединение было защищённым, и исходный IP клиента на backend.
  • Поддержка в популярных сервисах: Используется в AWS (Network Load Balancer с поддержкой PP v2), Google Cloud, многих PaaS-платформах.
  • Универсальность: Протокол работает на уровне TCP, поэтому поддерживается для любых протоколов выше TCP (HTTP, SMTP, Redis, итд.).

Важные ограничения и требования

  • Двусторонняя поддержка обязательна: Прокси должен отправлять, а сервер-приложение должен понимать заголовок Proxy Protocol. Если сервер не настроен, он попытается интерпретировать заголовок как часть данных приложения, что приведёт к ошибкам.
  • Порядок данных: Заголовок всегда передаётся первым в потоке данных TCP-соединения. Сервер должен сначала его прочитать и удалить из дальнейшего обработки.
  • Не является заменой X-Forwarded-For: Proxy Protocol работает на транспортном (TCP) уровне, тогда как X-Forwarded-For — это заголовок уровня приложения (HTTP). Они могут дополнять друг друга.

Заключение

Proxy Protocol — это критически важный инструмент в инфраструктуре DevOps и современных микросервисных архитектурах, где балансировка нагрузки и многоуровневая обработка сетевого трака являются нормой. Он обеспечивает прозрачность, позволяя конечным серверам получать истинную информацию о клиентах, что необходимо для безопасности, мониторинга и корректной работы приложений. Использование Proxy Protocol v2 рекомендуется для новых проектов благодаря его эффективности, безопасности и расширенной функциональности.