Заметки программиста

Восстановление исходного IP-адреса клиента

Модуль stream_realip_module в Nginx предназначен для восстановления исходного IP-адреса клиента в случаях, когда запросы проходят через промежуточные прокси-серверы или балансировщики нагрузки. Это особенно полезно, когда сам сервер Nginx выступает в роли обратного прокси или работает за другим уровнем защиты (например, Cloudflare).

Рассмотрим подробнее назначение и принцип работы этого модуля:

Назначение

Nginx поддерживает обработку потоков TCP и UDP с использованием Stream модуля. Если трафик проходит через обратный прокси или балансировщик нагрузки, заголовок реального IP-адреса клиента может потеряться, поскольку сервер видит IP адрес прокси, а не оригинального клиента. Модуль stream_realip_module помогает восстановить реальный IP-адрес отправителя пакета.

Принцип работы

Работа модуля основана на обработке специальных HTTP-заголовков или расширенных полей протоколов, таких как:

Для HTTP-запросов часто используют заголовок X-Forwarded-For, куда помещают оригинальный IP клиента.
В случае TCP-протокола или других ситуаций (например, работа с DNS поверх TLS), используются специальные расширения, например, PROXY протокол.

Конкретнее:

Когда клиент подключается к вашему сайту через стороннего прокси, этот прокси добавляет специальный заголовок (или расширение протокола), содержащий истинный IP-адрес клиента.
Затем модуль stream_realip_module интерпретирует этот заголовок и заменяет показанный в соединении IP прокси на реальный IP клиента.

Это позволяет серверу правильно вести статистику трафика, защищать себя от атак и обеспечивать правильную работу функций аутентификации и мониторинга.

Настройка

Код настройки для восстановления реального IP адреса выглядит примерно следующим образом:

stream {
    map $proxy_protocol_addr $real_ip {
        default $remote_addr;
        ~^(.*)$ $1;
    }
    
    server {
        listen     80 proxy_protocol;
        proxy_pass backend_server;
        
        # Восстанавливаем реальный IP адрес клиента
        set_real_ip_from   0.0.0.0/0;  # Или диапазон доверенных прокси
        real_ip_header     Proxy-Protocol;
    }
}

Заключение

Использование модуля stream_realip_module важно для всех сервисов, работающих за обратными прокси или балансировщиками нагрузки, позволяя видеть правильный IP-адрес клиентов и корректно обрабатывать запросы даже при многослойной инфраструктуре сети.