Конфигурация Nginx с протоколом прокси HAproxy и внутренней переадресацией

Вопрос или проблема

Мне нужно перенаправить HTTPS-трафик с HAProxy на Nginx без завершения SSL и без потери информации о исходном IP-адресе клиента. К сожалению, я не могу изменить конфигурацию стандартного сайта на 443 порту в Nginx, так как она поддерживается конфигурацией Synology NAS.

Я думал о новом порте прослушивания на Nginx, принимающем протокол прокси от HAProxy, и о некотором внутреннем перенаправлении на локальный 443 порт без декодирования / кодирования SSL, но с передачей оригинального IP-адреса клиента, полученного от HAProxy. Это как-то возможно?

Редактировать: Дело в том, что у меня туннелированный OpenVPN и веб-сервисы на одном внешнем 443 порту, так что на самом деле это выглядит следующим образом:

роутер 443 TCP  ->  HAProxy -> проверка SNI -> stunnel -> OpenVPN
                                  |
                                  ------> Завершение SSL -> Nginx 443 HTTPS

Я использую HAProxy, потому что ngx_stream_ssl_preread_module недоступен в встроенном Nginx от Synology.

Редактировать: Я думаю, что ситуация и вопрос могут быть более общими:

Nginx:
порт X, доступный через протокол прокси с SSL/TLS
порт Y

Как передать поток с порта X на Y с информацией о клиентском IP-адресе источника без завершения SSL? Является ли директива listen с proxy_protocol на порту Y единственным возможным вариантом?

Да, вы можете сделать это с помощью Nginx.

Простой поиск в Google показывает, что директива listen имеет параметр proxy_protocol с версии 1.5.12, который, по соображениям безопасности, вероятно, следует использовать в сочетании с директивой set_real_ip_from:

Обратите внимание, что это неизбежно потребует минимальной модификации конфигурации Nginx, которая в вашем случае поддерживается сторонним инструментом, о котором вы упоминаете; по очевидным соображениям безопасности не должно быть возможности передавать информацию о клиентском IP без какой-либо такой модификации.


Кроме того, обратите внимание, что вам больше не нужен HAProxy — новая функциональность потока в Nginx уже позволяет вам работать с TCP и SSL потоками, включая, начиная с самых последних версий, возможность различия неоткрытых SSL потоков на основе SNI, Server Name Indication — см. ssl_preread и соответствующий $ssl_preread_server_name с версии 1.11.5.

Одно из возможных решений – это осуществление SSL Bridging с HAProxy. Это означает, что HAProxy будет:
1. Декодировать SSL соединение.
2. Вставлять заголовок X-Real-IP.
3. Снова шифровать соединение при общении с Nginx.

Для декодирования SSL соединения HAProxy должен работать в HTTP режиме, но в то же время HAProxy должен получать трафик от stunnel, приходящий на тот же 443 порт. Таким образом, решение, о котором я могу подумать, заключается в том, чтобы сначала разделить оба трафика через фиктивный бэкенд.

Конечно, это приведет к дополнительным накладным расходам на производительность, но это не будет заметно, если нет действительно высокой нагрузки.

frontend ft_ssl
  bind *:443
  mode tcp 
  acl web_traffic req_ssl_sni -i <web-domain>
  acl stunnel_traffic req_ssl_sni -i <stunnel-domain>
  use_backend bk_ssl_dummy if web_traffic
  use_backend bk_ssl_stunnel if stunnel_traffic

backend bk_ssl_stunnel
  mode tcp
  server stunnel1 <IP>:<PORT> check

backend bk_ssl_dummy
  mode tcp 
  server web_ssl_offload 127.0.0.1:8888 send-proxy-v2-ssl-cn check

frontend ft_web_offload
  bind 127.0.0:8888 ssl crt <path-to-crt> accept-proxy
  mode http 
  http-request set-header X-Real-IP %[src]
  default_backend bk_ssl_nginx

backend bk_ssl_nginx
  mode http 
  server nginx1 <sIP>:443 ssl check

Соединения повторно шифруются, когда перенаправляются на Nginx, так как мы используем параметр ssl в строке сервера.

Настройка Nginx для использования proxy-protocol позволит вам иметь гораздо более простую конфигурацию HAProxy, поэтому это решение будет иметь смысл только в том случае, если вы не можете изменить конфигурацию Nginx.

Ответ или решение

Конфигурирование Nginx с использованием протокола прокси и внутренней переадресации представляет собой важный шаг для обеспечения безопасности и производительности веб-приложений. В вашей ситуации, где требуется перенаправление HTTPS-трафика через HAProxy к Nginx без SSL-терминации и без потери информации о оригинальном IP-адресе клиента, необходимо учитывать несколько важных аспектов.

Актуальные детали проблемы

Учитывая, что вы не можете изменить конфигурацию Nginx, поддерживаемую Synology NAS, вам необходимо использовать другой подход. Следующий алгоритм действий покажет, как настроить HAProxy и Nginx для достижения поставленной цели.

Шаг 1: Конфигурация HAProxy

HAProxy будет служить связующим звеном, принимающим входящие соединения на 443 порту и направляющим трафик на Nginx через новый прослушиваемый порт. Мы используем функциональность send-proxy для передачи оригинального IP-адреса клиента.

frontend ft_ssl
    bind *:443
    mode tcp 
    acl web_traffic req_ssl_sni -i ваш-домен
    use_backend bk_nginx if web_traffic

backend bk_nginx
    mode tcp
    server nginx1 127.0.0.1:8888 send-proxy

Шаг 2: Конфигурация Nginx

Для того чтобы Nginx правильно обрабатывал входящие соединения с помощью протокола прокси, вам нужно создать новый слушающий порт, который будет принимать трафик, пришедший из HAProxy.

server {
    listen 8888 proxy_protocol;  # Включаем поддержку Proxy Protocol
    server_name ваш-домен;

    location / {
        proxy_pass https://127.0.0.1:443;  # Перенаправляем трафик на порт 443 без SSL-терминации
        proxy_set_header X-Real-IP $remote_addr;  # Передаем оригинальный IP-адрес клиента
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # Для сохранения цепочки IP-адресов
        proxy_set_header Host $host;
    }
}

Резюме

Таким образом, вы сможете перенаправлять HTTPS-трафик с HAProxy на Nginx, сохраняя информацию об оригинальном IP-адресе клиента, благодаря поддержке proxy_protocol в Nginx. Это решение позволяет вам обходиться без изменения конфигурации по умолчанию в Synology NAS и эффективно управлять трафиком без потерь в производительности.

Дополнительные рекомендации

  • Мониторинг и логирование: Настройте логирование на обоих уровнях (HAProxy и Nginx) для диагностики возможных проблем.
  • Обновление программного обеспечения: Убедитесь, что все сервисы обновлены до последних стабильных версий для использования всех доступных функций и исправления ошибок безопасности.
  • Тестирование: Проведите полное тестирование настройки, чтобы убедиться, что трафик правильно маршрутизируется, а клиентские IP-адреса сохраняются корректно.

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

Оцените материал
Добавить комментарий

Капча загружается...