Назад | Перейти на главную страницу

Разрешить только локальным пользователям в nginx

Я хочу ограничить доступ для некоторых 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 только для локальных пользователей!