Вопрос или проблема
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
, вы можете сделать это следующим образом.
-
Создайте файл конфигурации Nginx и откройте его для редактирования. Данный пример будет использовать
nginx.conf
в качестве файла конфигурации. - Добавьте следующие настройки в секцию
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
.