nginx отвергает все запросы к виртуальному хосту. запросы приходят от nginx tcp forwarder

Резюме - нужно добавить ips из белого списка на mysite1.example.com. теперь, когда они добавлены, это не работает, так как каждый запрос приходит как исходящий от сервера балансировщика нагрузки.

Я работаю над установкой с передним сидящим хостом Nginx с бэкендом upstream для балансировки нагрузки всех пакетов tcp на порт 443 к бэкенд-серверам.

Конфиг nginx сервера Loadbalancer, на котором работает nginx - сервер C, выглядит следующим образом

stream {
        upstream stream_backend {
                hash $remote_addr consistent;
                server 10.15.15.3:443;   ## server A
                server 10.15.15.9:443;   ## server B
        }


        server {
                listen     443;
                proxy_pass stream_backend;
                proxy_timeout 5s;
                proxy_connect_timeout 5s;
        }
}

сервер A и сервер B имеют следующие nginx.conf. это идентичные серверы с приложениями.

на каждом из них запущено по два виртуальных хоста. они работают нормально.

http {

    server {
        server_name mysite1.example.com;
        listen *:443 ssl;
        listen [::]:443 ssl;
        
        allow 123.45.85.220; # this seems not working
        deny all; # only this is working

        
        location ^~ /static/ {
            ...
        }
        ...
        
        ssl_certificate        file.pem;
        ssl_certificate_key    file.key;
    }


    server {
        server_name mysite2.example.com;
        listen *:443 ssl;
        listen [::]:443 ssl;
        
        
        location /somethin {
            ...
        }
        location /something2{
            ...
        }
        
        ssl_certificate        file.pem;
        ssl_certificate_key    file.key;
    }
}

мне нужно внести в белый список только несколько ips для виртуального хоста mysite1.example.com. Проблема в том, что nginx, запущенный на серверах A и B, видит Ip балансировщика нагрузки как Ip клиента. Поэтому, когда я пробовал добавить разрешить IP; запретить все, это не работает ни для одного хоста, поскольку IP балансировщика нагрузки на всех запросах является IP клиента.

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

p.s Завершение SSl происходит на внутренних серверах, сервере A и сервере B

Я искал в интернете и нашел эти полезные советы, но так и не смог понять, как заставить все это работать.

https://stackoverflow.com/questions/40873393/nginx-real-client-ip-to-tcp-stream-backend https://www.cyberciti.biz/faq/nginx-redirect-backend-traffic-based-upon-client-ip-address/

3
задан 15 June 2021 в 09:35
3 ответа

Это происходит из-за того, что балансировщик нагрузки nginx устанавливает новое TCP-соединение с вашими веб-серверами nginx, что приводит к потере исходного IP-адреса клиента.

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

Для его настройки необходимо внести следующие изменения:

  • В балансировщике нагрузки включить proxy_protocol; :

     stream {
    server {{{1 }} proxy_pass where; 
    proxy_protocol on; 
     
  • На веб-сервере примите протокол PROXY и включите функцию Real IP для IP-адреса балансировщика нагрузки.

     сервер {
    прослушивание 443 ssl http2 proxy_protocol; 
    прослушивание [::]: 443 ssl http2 proxy_protocol; 
    real_ip_header proxy_protocol; 
    set_real_ip_from ; 
     

Есть дополнительные настройки, которые вы можете внести в протокол PROXY, которые вы можете найти в документации nginx , но это должно помочь вам начать работу и решить непосредственную проблему.

5
ответ дан 28 July 2021 в 11:46

Мой подход был бы следующим:

Фильтр в балансировщике нагрузки с использованием SNI:

В основном: SNI позволяет прокси-серверу видеть имя домена без завершения TLS. Здесь - руководство. А вот документы nginx , чтобы объединить его в решение. Если вы можете это сделать, вы можете отказать на основе $ ssl_preread_server_name .

if ( $ssl_preread_server_name ~* mysite1.example.com && $remote_addr !~* <whitelisted_ip> ) {
           return 404;

Модуль real_ip также кажется хорошим решением.

Править

Протокол PROXY был бы лучше, чем real_ip. Но это все равно будет означать, что ваши внутренние серверы получают запросы, которые в конечном итоге блокируются. Решение SNI улавливает их на балансировщике нагрузки.

4
ответ дан 28 July 2021 в 11:46

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

proxy_set_header X-Real-IP $remote_addr;

можете ли вы проверить логи доступа, какой ip там?

0
ответ дан 28 July 2021 в 11:46

Теги

Похожие вопросы