nginx потоковая передача https с пропуском и ограничениями доступа по IP на основе имен хостов

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

nginx потоковая передача https с пропуском и ограничениями доступа по IP на основе имен хостов

Я только что настроил потоковое проходное соединение с использованием ssl_preread в nginx, но я не могу понять, как с помощью этого метода запретить доступ к определённым upstream-серверам для определённых диапазонов IP. Например, host1 не должен позволять 10.0.1.0/24, а host2 не должен позволять 10.0.44.0/24.

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

Для настройки Nginx для потоковой передачи SSL с использованием ssl_preread и ограничения доступа к определенным upstream-серверам на основе IP-адресов, вам нужно будет использовать директивы geo и map. Например, если вам нужно запретить доступ к host1 для подсети 10.0.1.0/24 и к host2 для подсети 10.0.44.0/24, вы можете сделать это следующим образом.

  1. Создайте файл конфигурации Nginx и откройте его для редактирования. Данный пример будет использовать nginx.conf в качестве файла конфигурации.

  2. Добавьте следующие настройки в секцию http вашего конфигурационного файла:
http {
    # Определение недоступных IP адресов для host1
    geo $blocked_host1 {
        default 0;  # Разрешаем доступ всем
        10.0.1.0/24 1;  # Запрещаем доступ из подсети 10.0.1.0/24
    }

    # Определение недоступных IP адресов для host2
    geo $blocked_host2 {
        default 0;  # Разрешаем доступ всем
        10.0.44.0/24 1;  # Запрещаем доступ из подсети 10.0.44.0/24
    }

    stream {
        upstream host1 {
            server host1.com:443;  # IP-адрес или доменное имя вашего upstream-сервера
        }

        upstream host2 {
            server host2.com:443;  # IP-адрес или доменное имя вашего второго upstream-сервера
        }

        server {
            listen 443;  # Порт, на который будет приходить трафик

            ssl_preread on;  # Включаем ssl_preread

            # Проверка доступа для host1
            if ($blocked_host1) {
                return 444;  # Код 444 - закрытие соединения без ответа
            }

            # Обработка трафика для host1
            proxy_pass host1;

            # Проверка доступа для host2
            if ($blocked_host2) {
                return 444;  # Код 444 - закрытие соединения без ответа
            }

            # Обработка трафика для host2
            proxy_pass host2;
        }
    }
}

Пояснение конфигурации:

  • geo: используется для того, чтобы блокировать доступ из определенных IP-адресов или подсетей. Переменная будет равна 1 для IP-адресов, из которых требуется заблокировать доступ.

  • В секции stream мы определили два upstream блока, один для host1 и один для host2.

  • Директива ssl_preread on; используется для того, чтобы Nginx мог извлекать SNI (Server Name Indication) из TLS-соединений. Это позволяет нам определить, на какой хост поступает запрос.

  • Условные операторы if проверяют значение переменной блокировки. Если доступ запрещен, возвращается код ответа 444, что говорит Nginx зак закрыть соединение без отправки каких-либо данных.

Важно:

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

Не забудьте перезапустить Nginx после внесения изменений в конфигурацию:

sudo systemctl restart nginx

Теперь у вас есть рабочая конфигурация для ограниченного доступа к конкретным upstream-серверам по IP-адресам с использованием Nginx stream и ssl_preread.

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

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