Erlaube nur lokale Benutzer in nginx

22

Ich möchte den Zugriff für einige VHosts einschränken, damit nur 127.0.0.1 darauf zugreifen kann. Ich habe immer so etwas verwendet, um den VHost an den localhost und nicht an die externe IP zu binden:

server {
    listen 127.0.0.1;
    server_name myvhost.local;
    location / {
        ....
    }
}

Ich habe jedoch festgestellt, dass einige Tutorials auch explizite allowAnweisungen für den localhost enthalten und alle anderen explizit ablehnen:

server {
    listen 127.0.0.1;
    server_name myvhost.local;
    location / {
        allow 127.0.0.1;
        deny all;
        ...
    }
}

Werden diese allow/ denyAnweisungen wirklich benötigt, wenn ich erst bei 127.0.0.1 höre?

Biggie
quelle
Ändern Sie die Zulassungszeile in:allow 127.0.0.1/32;
Itai Ganot
Meine Frage ist , ob ich das brauchen allowüberhaupt , weil ich festgelegt listenauf 127.0.0.1.
Biggie

Antworten:

15

Die listenDirektive teilt dem Betriebssystem mit, an welche Schnittstelle sich der Webserver bindet. Wenn Sie sich also netstat -anach dem Start von nginx ansehen , werden Sie feststellen, dass nginx nur auf dem 127.0.0.1-IP-Port 80 lauscht, was bedeutet, dass der nginx-Server über keine andere Schnittstelle erreichbar ist.

Das Binden an eine bestimmte IP-Adresse funktioniert im eigentlichen Netzwerkstapel auf einer niedrigeren Ebene als die Anweisungen allow/ denyin der nginx-Konfiguration.

Dies bedeutet, dass Sie für Ihren Anwendungsfall keine separaten allow/ denyDirektiven in Ihrer Konfiguration benötigen , da die Verbindungen im Netzwerkstapel niedriger begrenzt sind.

Wenn Sie listen 80;nur angeben und allow/ denydirectives verwenden, sendet nginx einen HTTP-Fehlercode an den Client und teilt ihm mit, dass der Zugriff verweigert wird.

In diesem listen 127.0.0.1;Fall kann der Browser überhaupt keine Verbindung zum Server herstellen, da für den Browser kein TCP-Port zum Herstellen einer Verbindung geöffnet ist.

Tero Kilkanen
quelle
1
Okay, ich habe vergessen zu erwähnen, dass ich noch mehr VHosts habe und einige von ihnen nicht nur an localhost gebunden sind. Alle von ihnen (nur lokal und nicht lokal) laufen auf derselben nginx-Instanz. Somit netstatwird eine lokale Adresse von 0.0.0.0:80(allen Schnittstellen) angezeigt. Kann ich dann noch deny/ allowauf den lokalen Servern auslassen ?
Biggie
In diesem Fall zeigt nginx den Inhalt des virtuellen Hosts an, der mit der listen 80 default_server;Direktive definiert wurde, wenn ein Client nach einem vhost fragt, an den gebunden ist 127.0.0.1:80. Wenn Sie keinen default_serverdefinierten Server haben, wird ein listen 80;definierter Server angezeigt.
Tero Kilkanen
OK, gibt es also keine Möglichkeit, dass nicht-lokale Benutzer auf Server zugreifen listen 127.0.0.1können und ich allow/denyauf diesen Servern nicht einmal benötige ?
Biggie
Ja, dafür gibt es keine Möglichkeit.
Tero Kilkanen
Dies beantwortet die Frage im Gegensatz zur aktuellen Top-Antwort. Warum ist es nicht top?
Jortstek
16

192.168.1.0Angenommen , Ihre Netzwerk-ID lautet : Bearbeiten Sie Ihre Konfigurationsdatei wie folgt:

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;
}

Bitte lassen Sie mich wissen, wie es bei Ihnen funktioniert.

Bearbeiten Sie # 1:

Ja, die Erlaubnis-Direktive ist laut offiziellem Nginx-Wiki ein Muss . Ihr Beispiel ist:

location / {
    allow 192.168.1.1/24;
    allow 127.0.0.1;
    deny 192.168.1.2;
    deny all;
}
Itai Ganot
quelle
1
Ich möchte den Zugriff auf wirklich einschränken 127.0.0.1;) Meine Frage ist, ob ich das überhaupt brauche, allowweil ich mich schon darauf eingestellt listenhabe 127.0.0.1.
Biggie
Bitte überprüfen Sie Edit # 1.
Itai Ganot
Sry, ich glaube nicht, dass du meine Frage verstehst;) Was du gepostet hast, ist (mehr oder weniger) bereits das, was ich oben in meiner Frage geschrieben habe. Aber das ist keine Antwort auf meine Frage.
Biggie
1
@Biggie Sie müssen den Zugriff nicht auf 127.0.0.1 beschränken, er ist nur auf dem lokalen Computer verfügbar.
user9517 unterstützt GoFundMonica
Vermutlich ist das alles wahr, aber es beantwortet die Frage von OP nicht! Die angenommene Antwort ist richtig.
Jortstek
4

Ich wollte die gleiche Funktionalität erreichen (nur lokale Benutzer in Nginx zulassen) und fand heraus, dass ich so etwas Einfaches tun kann:

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;
    }
}

Diese Konfigurationsdatei funktioniert einwandfrei, ich verwende keine allowDirektive, sondern nur 127.0.0.1:80, und damit kann ich den Nginx-Zugriff nur auf lokale Benutzer beschränken!

pebox11
quelle
großartige und einfache Antwort für die Beschränkung auf lokale Benutzer.
new2cpp