Вопрос или проблема
Сначала я должен признаться, что я полный новичок в NGINX. Я только делал очень базовые вещи с ним.
Теперь о ситуации. У нас есть реверс-прокси в DMZ, который принимает входящие подключения/запросы и “перенаправляет их” к их пунктам назначения. В данный момент один из них позволяет перенаправлять соединения только из определенной подсети к конкретному веб-серверу. Это нужно для того, чтобы пользователи VPN могли сбросить пароль для конкретного приложения. К сожалению, он перенаправляет любые запросы к URL этого веб-сервера.
Что я хочу: мне нужно это ограничить. Вместо того, чтобы передавать “https://webserver.com/whatever_they_type” на сервер, я хочу заблокировать все, кроме одного конкретного URL. Например: “https://webserver.com/this-url/only” Все остальное будет заблокировано.
У кого-то есть мысли о том, как изменить это местоположение в NGINX для достижения этой цели?
Интересно, сработает ли что-то подобное?
location = /good_page/reset_password.html {
proxy_pass https://1.2.3.4:443;
#### Установить заголовки ####
proxy_set_header Host webserver.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#### Разрешить только OpenVPN сети ###
allow 5.6.7.8/24;
deny all;
}
location ^~ /good_page {
deny all;
}
Nginx всегда сначала пытается сопоставить самое конкретное префиксное местоположение, поэтому вы можете установить два местоположения:
server {
listen 80;
server_name example.com www.example.com;
access_log /<файл доступа> main;
error_log /<файл ошибок> error;
# Это не обязательно (любое местоположение)
location / {
# Вы можете установить index.html с сообщением об ошибке
root /path/folder;
}
# Конкретный префикс
location /this-url/only/ {
proxy_pass http://<IP вашего сервера>;
<конфигурации прокси ...>;
}
}
Заметка: Когда вы обращаетесь к http://example.com/this-url/only/, nginx перенаправляет на ваш сервер http:///this-url/only/. Если вам нужно удалить /this-url/only/, вам потребуется правило переписывания.
Ответ или решение
Чтобы реализовать требуемую функциональность в NGINX и ограничить проксирование конкретного URL, вам необходимо использовать директиву location
для строгого указания разрешенных и запрещенных путей.
Вот пример конфигурации, который должен помочь вам ограничить доступ только к одному конкретному URL и заблокировать все остальные запросы к вашему веб-серверу:
server {
listen 80; # Убедитесь, что это правильный порт, используемый вашим приложением
server_name example.com www.example.com; # Замените на ваше доменное имя
# Логирование (по желанию)
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
# Разрешаем доступ только к определенному URL
location = /this-url/only {
proxy_pass https://1.2.3.4:443; # Замените на IP вашего веб-сервера
# Установка заголовков
proxy_set_header Host webserver.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# Ограничение доступа
allow 5.6.7.8/24; # Замените на вашу подсеть VPN
deny all; # Запретить доступ всем остальным
}
# Запретить доступ ко всем остальным URL
location / {
deny all; # Запретить доступ ко всем другим запросам
}
# (Опционально) Можно добавить индексный файл в корневую директорию или перенаправление на страницу ошибки
location / {
root /path/to/your/root; # Замените на ваш путь
index index.html; # Укажите файл, который будет загружаться по умолчанию
try_files $uri =404; # Вернуть 404, если файл не найден
}
}
Объяснение конфигурации:
-
server: Основной блок серверной конфигурации. Убедитесь, что вы указали правильный порт и имя сервера для своего приложения.
-
location = /this-url/only: Эта директива определяет точное совпадение с URL
/this-url/only
. Весь трафик, который поступает по этому адресу, будет проксироваться на указанный сервер. -
proxy_pass: Указывает, куда NGINX будет перенаправлять запросы, поступающие к
/this-url/only
. -
proxy_set_header: Эти директивы устанавливают определенные заголовки, которые могут потребоваться серверу, к которому вы проксируете запросы.
-
allow / deny: Эти инструкции управляют доступом. В данном случае доступ разрешен только для IP-адресов из указанной подсети, и все остальные запросы будут отклонены.
-
location /: Эта директива блокирует доступ ко всем другим URL. Основная цель — предотвратить доступ к любым другим ресурсам на сервере, кроме разрешенного пути.
После изменения конфигурации не забудьте перезагрузить NGINX, чтобы применить изменения:
sudo systemctl restart nginx
Эта конфигурация обеспечит безопасный доступ только к указанному URL и заблокирует все остальные запросы.