Zezwalaj tylko lokalnym użytkownikom w nginx

22

Chcę ograniczyć dostęp do niektórych VHostów, aby tylko 127.0.0.1 mogło uzyskać do niego dostęp. Zawsze użyłem czegoś takiego do powiązania VHost z hostem lokalnym, a nie z zewnętrznym adresem IP:

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

Zauważyłem jednak, że niektóre samouczki zawierają również wyraźne allowwytyczne dla hosta lokalnego i wyraźnie zaprzeczają wszystkim innym:

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

Czy te allow/ denydyrektywy są naprawdę potrzebne, gdy słucham już tylko wersji 127.0.0.1?

Biggie
źródło
Spróbuj zmienić linię zezwalania na:allow 127.0.0.1/32;
Itai Ganot,
Moje pytanie brzmi, czy muszę, że alloww ogóle, bo ustawiony listenna 127.0.0.1.
Biggie,

Odpowiedzi:

15

listenDyrektywa mówi o tym, co system operacyjny z interfejsem sama wiąże serwera WWW. Tak więc, kiedy spojrzysz na to netstat -apo uruchomieniu nginx, zobaczysz, że nginx nasłuchuje tylko na porcie 80 127.0.0.1 IP, co oznacza, że ​​do serwera nginx nie można uzyskać dostępu za pośrednictwem innego interfejsu.

Wiązanie z określonym adresem IP działa na niższym poziomie w rzeczywistym stosie sieciowym niż dyrektywy allow/ denyw konfiguracji nginx.

Oznacza to, że nie potrzebujesz osobnych allow/ denydyrektyw w konfiguracji z przypadkiem użycia, ponieważ połączenia są ograniczone niżej na stosie sieciowym.

Jeśli podasz listen 80;tylko i użyjesz allow/ denydyrektyw, nginx wyśle ​​do klienta kod błędu HTTP, informując, że odmowa dostępu.

W takim listen 127.0.0.1;przypadku przeglądarka nie może w ogóle połączyć się z serwerem, ponieważ nie ma otwartego portu TCP, z którym mogłaby się połączyć.

Tero Kilkanen
źródło
1
Okej, zapomniałem wspomnieć, że mam jeszcze kilka VHostów, a niektóre z nich są związane nie tylko z hostem lokalnym. Wszystkie z nich (tylko lokalne i nielokalne) działają na tej samej instancji nginx. W ten sposób netstatpokazuje lokalny adres 0.0.0.0:80(wszystkich interfejsów). Czy mogę nadal ominąć deny/ allowna serwerach lokalnych?
Biggie
W takim przypadku nginx wyświetli zawartość wirtualnego hosta, który został zdefiniowany w listen 80 default_server;dyrektywie, gdy klient poprosi o vhost związany z 127.0.0.1:80. Jeśli nie masz default_serverzdefiniowanego, pokaże to serwer, który listen 80;zdefiniował.
Tero Kilkanen
OK, więc nie ma możliwości, aby użytkownicy listen 127.0.0.1nielokalni mieli dostęp do serwerów, a ja nawet nie potrzebuję allow/denyna tych serwerach?
Biggie,
Tak, nie ma takiej możliwości.
Tero Kilkanen
Odpowiada to na pytanie, w przeciwieństwie do bieżącej górnej odpowiedzi. Dlaczego nie jest top?
Jortstek
16

Powiedzmy, że masz identyfikator sieci 192.168.1.0, edytuj plik conf w następujący sposób:

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

Daj mi znać, jak to działa.

Edycja nr 1:

Tak, zgodnie z oficjalną wiki Nginx jest to konieczne . Ich przykładem jest:

location / {
    allow 192.168.1.1/24;
    allow 127.0.0.1;
    deny 192.168.1.2;
    deny all;
}
Itai Ganot
źródło
1
Naprawdę chcę, aby ograniczyć dostęp do 127.0.0.1;) Moje pytanie brzmi, czy muszę, że alloww ogóle, bo już ustawiony listendo 127.0.0.1.
Biggie,
Sprawdź Edycja nr 1.
Itai Ganot
Nie sądzę, że rozumiesz moje pytanie;) To, co napisałeś, jest (mniej więcej) tym, co napisałem w powyższym pytaniu. Ale to nie jest odpowiedź na moje pytanie.
Biggie,
1
@Biggie Nie musisz ograniczać dostępu do 127.0.0.1, jest on dostępny tylko na komputerze lokalnym.
user9517 obsługuje GoFundMonica
Przypuszczalnie to wszystko prawda, ale w szczególności nie odpowiada na pytanie OP! Akceptowana odpowiedź tak.
Jortstek
4

Chciałem osiągnąć tę samą funkcjonalność (zezwalaj tylko lokalnym użytkownikom w nginx) i doszedłem do wniosku, że mogę zrobić coś takiego:

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

Ten plik konfiguracyjny działa dla mnie dobrze, nie używam żadnej allowdyrektywy, ale tylko 127.0.0.1:80i dzięki temu jestem w stanie ograniczyć dostęp nginx tylko do lokalnych użytkowników!

pebox 11
źródło
świetna i prosta odpowiedź na ograniczenie do lokalnych użytkowników.
new2cpp