Дозволити лише локальним користувачам у 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.