Я хочу ограничить доступ для некоторых VHosts, чтобы только 127.0.0.1 мог получить к нему доступ. Я всегда использовал что-то подобное, чтобы привязать VHost к локальному хосту, а не к внешнему IP:
server {
listen 127.0.0.1;
server_name myvhost.local;
location / {
....
}
}
Но я заметил, что некоторые руководства также включают явное allow
директивы для localhost и категорически запрещают все остальные:
server {
listen 127.0.0.1;
server_name myvhost.local;
location / {
allow 127.0.0.1;
deny all;
...
}
}
Эти allow
/deny
действительно нужны директивы, когда я уже слушаю только 127.0.0.1?
Допустим, ваш сетевой идентификатор 192.168.1.0
, отредактируйте свой файл conf следующим образом:
location / {
# block one workstation
deny 192.168.1.1;
# allow anyone in 192.168.1.0/24
allow 192.168.1.0/24;
# drop rest of the world
deny all;
}
Пожалуйста, дайте мне знать, как это работает для вас.
Редактировать # 1:
Да, директива allow является обязательной в соответствии с Официальная вики Nginx. Их пример:
location / {
allow 192.168.1.1/24;
allow 127.0.0.1;
deny 192.168.1.2;
deny all;
}
В listen
Директива сообщает операционной системе, к какому интерфейсу подключается веб-сервер. Итак, когда вы смотрите на netstat -a
после запуска nginx вы увидите, что nginx прослушивает только 127.0.0.1 IP-порт 80, что означает, что к серверу nginx нельзя подключиться через какой-либо другой интерфейс.
Привязка к определенному IP-адресу работает на более низком уровне в реальном сетевом стеке, чем allow
/ deny
директивы внутри конфигурации nginx.
Это означает, что вам не нужны отдельные allow
/ deny
директивы внутри вашей конфигурации с вашим вариантом использования, потому что соединения ограничены ниже в сетевом стеке.
Если вы укажете listen 80;
только и используйте allow
/ deny
директивы, то nginx отправит клиенту код ошибки HTTP, сообщая, что доступ запрещен.
С listen 127.0.0.1;
В этом случае браузер вообще не может подключиться к серверу, потому что нет открытого TCP-порта, к которому браузер мог бы подключиться.
Я хотел добиться той же функциональности (разрешить только локальным пользователям в nginx), и я понял, что могу сделать что-то простое вроде этого:
server {
listen 127.0.0.1:80;
index index.html index.htm index.nginx-debian.html;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /path/to/folder;
}
location / {
include proxy_params;
}
}
У меня этот файл конфигурации отлично работает, я не использую никаких allow
директива, но только 127.0.0.1:80
, и с этим я могу ограничить доступ nginx только для локальных пользователей!