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


22

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


Попробуйте изменить строку разрешения на:allow 127.0.0.1/32;
Итай Ганот

У меня вопрос, нужно ли мне это allowвообще, потому что я настроен listenна 127.0.0.1.
Biggie

Ответы:


15

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-порта для браузера.


1
Хорошо, я забыл упомянуть, что у меня есть еще несколько VHosts, и некоторые из них связаны не только с localhost. Все они (только локальные и не локальные) работают на одном экземпляре nginx. Таким образом netstatпоказывает локальный адрес 0.0.0.0:80(все интерфейсы). Могу ли я тогда опустить deny/ allowна локальных серверах?
Biggie

В этом случае nginx покажет содержимое виртуального хоста, которое было определено с помощью listen 80 default_server;директивы, когда клиент запрашивает привязанный vhost 127.0.0.1:80. Если у вас нет default_serverопределенного, то он покажет сервер, который listen 80;определил.
Теро Килканен

Итак, нет никакой возможности, что нелокальные пользователи могут получить доступ к listen 127.0.0.1-серверам, и мне даже не нужны allow/denyэти серверы?
Biggie

Да, для этого нет возможности.
Теро Килканен

Это отвечает на вопрос, в отличие от текущего верхнего ответа. Почему это не топ?
Jortstek

16

Допустим, у вас есть идентификатор вашей сети 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;
}

1
Я действительно хочу ограничить доступ 127.0.0.1;) Мой вопрос заключается в том, нужно ли мне это allowвообще, потому что я уже настроен listenна 127.0.0.1.
Biggie

Пожалуйста, проверьте Edit # 1.
Итай Ганот

Извините, я не думаю, что вы понимаете мой вопрос;) То, что вы опубликовали, уже (более или менее) уже написано в моем вопросе выше. Но это не ответ на мой вопрос.
Biggie

1
@ Biggie Вам не нужно ограничивать доступ к 127.0.0.1, он доступен только на локальном компьютере.
user9517 поддерживает GoFundMonica

Предположительно, это все правда, но конкретно это не отвечает на вопрос ОП! Признанный ответ делает.
Jortstek

4

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


отличный и простой ответ для ограничения для локальных пользователей.
new2cpp
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.