Рейтинг:3

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

флаг gb

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

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

Конфигурация nginx сервера Loadbalancer, на котором работает nginx — сервер C, показана ниже.

транслировать {
        восходящий поток stream_backend {
                хеш $remote_addr согласован;
                сервер 10.15.15.3:443; ## сервер А
                сервер 10.15.15.9:443; ## сервер Б
        }


        сервер {
                слушать 443;
                proxy_pass stream_backend;
                прокси_таймаут 5с;
                proxy_connect_timeout 5 с;
        }
}

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

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

http {

    сервер {
        имя_сервера mysite1.example.com;
        слушать *:443 ssl;
        слушать [::]:443 ssl;
        
        разрешить 123.45.85.220; # похоже это не работает
        отрицать все; # работает только это

        
        расположение ^~ /статический/ {
            ...
        }
        ...
        
        файл сертификата ssl.pem;
        ssl_certificate_key файл.ключ;
    }


    сервер {
        имя_сервера mysite2.example.com;
        слушать *:443 ssl;
        слушать [::]:443 ssl;
        
        
        местоположение / что-то {
            ...
        }
        местоположение /что-то2{
            ...
        }
        
        файл сертификата ssl.pem;
        ssl_certificate_key файл.ключ;
    }
}

что мне нужно, так это внести в белый список только несколько IP-адресов для виртуального хоста 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/

djdomi avatar
флаг za
Действительно сложно понять первоначальный запрос - можно ли быть более точным и отформатировать свой вопрос, чтобы его было легче читать?
флаг gb
добавлена ​​сводка и комментарии к конфигу. нужно найти способ внести IP-адреса в белый список и запретить все остальные IP-адреса в mysite.example.com
djdomi avatar
флаг za
самый простой способ ограничить доступ — это использовать «разрешить» и «запретить», но для того, чтобы сначала запретить, а затем разрешить
Рейтинг:5
флаг cz

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

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

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

  • На балансировщике нагрузки установите прокси_протокол включен;:

    транслировать {
        сервер {
            proxy_pass где-то;
            прокси_протокол включен;
    
  • На веб-сервере примите протокол PROXY и включите функцию Real IP для IP-адреса балансировщика нагрузки.

    сервер {
        слушать 443 ssl http2 proxy_protocol;
        слушать [::]:443 ssl http2 proxy_protocol;
        real_ip_header proxy_protocol;
        set_real_ip_from <IP-адрес балансировщика нагрузки>;
    

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

Рейтинг:4
флаг tz

Мой подход был бы таким:

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

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

if ( $ssl_preread_server_name ~* mysite1.example.com && $remote_addr !~* <whitelisted_ip> ) {
           вернуть 404;

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

Редактировать

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

флаг co
Ретрансляция SNI ненадежна, так как браузеры поддерживают расширения ESNI и ECH.
Рейтинг:0
флаг in

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

proxy_set_header X-Real-IP $remote_addr;

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

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.