Дозволити лише локальним користувачам у nginx


22

Я хочу обмежити доступ до деяких VHosts, щоб лише 127.0.0.1 отримав доступ до нього. Я завжди використовував щось подібне, щоб прив’язати VHost до localhost, а не зовнішній 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.
Біггі

Відповіді:


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на локальних серверах?
Біггі

У цьому випадку nginx покаже вміст віртуального хоста, який був визначений listen 80 default_server;директивою, коли клієнт запитує прив’язаний до vhost 127.0.0.1:80. Якщо у вас немає default_serverвизначеного пункту, він покаже визначений сервер listen 80;.
Теро Кілканен

Гаразд, отже, немає можливості, щоб немісцеві користувачі могли отримати доступ до listen 127.0.0.1серверів, і мені це навіть не потрібно allow/denyна цих серверах?
Біггі

Так, для цього немає можливості.
Tero Kilkanen

Це дає відповідь на питання, на відміну від поточної верхньої відповіді. Чому це не верх?
Jortstek

16

Скажімо, ваш ідентифікатор мережі - 192.168.1.0відредагуйте конф-файл так:

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:

Так, згідно з офіційною вікі-службою 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.
Біггі

Перевірте Правка №1.
Ітаї Ганот

Шри, я не думаю, що ти розумієш моє запитання;) Те, що ви опублікували, є (більш-менш) вже тим, що я написав у своєму запитанні вище. Але це не відповідь на моє запитання.
Біггі

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.