Chỉ cho phép người dùng cục bộ trong nginx


22

Tôi muốn hạn chế quyền truy cập đối với một số Vhost để chỉ 127.0.0.1 có thể truy cập. Tôi luôn sử dụng một cái gì đó như thế này để liên kết Vhost với localhost chứ không phải IP bên ngoài:

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

Nhưng tôi nhận thấy rằng một số hướng dẫn cũng bao gồm các allowchỉ thị rõ ràng cho localhost và từ chối rõ ràng tất cả các hướng dẫn khác:

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

Những allow/ denychỉ thị này có thực sự cần thiết khi tôi chỉ nghe ở 127.0.0.1 không?


Hãy thử thay đổi dòng cho phép thành:allow 127.0.0.1/32;
Itai Ganot

Câu hỏi của tôi là liệu tôi có cần điều đó không allowvì tôi đặt listenra 127.0.0.1.
Biggie

Câu trả lời:


15

Lệnh listennày cho hệ điều hành biết giao diện nào mà máy chủ web tự ràng buộc. Vì vậy, khi bạn nhìn vào netstat -asau khi bắt đầu nginx, bạn sẽ thấy nginx chỉ nghe trên cổng IP 127.0.0.1, điều đó có nghĩa là máy chủ nginx không thể truy cập qua bất kỳ giao diện nào khác.

Liên kết với một địa chỉ IP cụ thể hoạt động ở mức thấp hơn trong ngăn xếp mạng thực tế so với allow/ denychỉ thị bên trong cấu hình nginx.

Điều này có nghĩa là bạn không cần riêng allow/ denychỉ thị trong cấu hình của bạn với trường hợp sử dụng của bạn, vì các kết nối bị giới hạn thấp hơn trong ngăn xếp mạng.

Nếu bạn chỉ định listen 80;và sử dụng allow/ denychỉ thị, thì nginx sẽ gửi mã lỗi HTTP đến máy khách, thông báo rằng quyền truy cập bị từ chối.

Với listen 127.0.0.1;trường hợp này, trình duyệt hoàn toàn không thể kết nối với máy chủ, vì không có cổng TCP nào mở để trình duyệt kết nối.


1
Được rồi, tôi quên đề cập rằng tôi có thêm một số Vhost và một số trong số chúng bị ràng buộc không chỉ với localhost. Tất cả chúng (chỉ cục bộ và không cục bộ) đang chạy trên cùng một ví dụ nginx. Do đó netstathiển thị một địa chỉ cục bộ của 0.0.0.0:80(tất cả các giao diện). Sau đó tôi có thể bỏ qua deny/ allowtrên các máy chủ chỉ cục bộ không?
Biggie

Trong trường hợp này, nginx sẽ hiển thị nội dung của máy chủ ảo đã được xác định bằng lệnh listen 80 default_server;khi khách hàng yêu cầu vhost ràng buộc 127.0.0.1:80. Nếu bạn chưa default_serverxác định, thì nó sẽ hiển thị một máy chủ đã listen 80;được xác định.
Tero Kilkanen

OK, vì vậy không có khả năng người dùng không phải là người địa phương có thể truy cập máy listen 127.0.0.1chủ và tôi thậm chí không cần allow/denytrên các máy chủ này?
Biggie

Vâng, không có khả năng cho điều đó.
Tero Kilkanen 17/2/2015

Điều này trả lời câu hỏi, không giống như câu trả lời hàng đầu hiện tại. Tại sao nó không đứng đầu?
Jortstek

16

Giả sử ID mạng của bạn là 192.168.1.0, chỉnh sửa tệp conf của bạn như vậy:

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

Xin vui lòng cho tôi biết làm thế nào nó hoạt động cho bạn.

Chỉnh sửa số 1:

Có, chỉ thị cho phép là bắt buộc theo wiki Nginx chính thức . Ví dụ của họ là:

location / {
    allow 192.168.1.1/24;
    allow 127.0.0.1;
    deny 192.168.1.2;
    deny all;
}

1
Tôi thực sự muốn giới hạn quyền truy cập vào 127.0.0.1;) Câu hỏi của tôi là liệu tôi cần điều đó allowở tất cả vì tôi đã được thiết lập listenđể 127.0.0.1.
Biggie

Vui lòng kiểm tra Chỉnh sửa # 1.
Itai Ganot

Sry, tôi không nghĩ bạn hiểu câu hỏi của tôi;) Những gì bạn đã đăng là (ít nhiều) đã là những gì tôi đã viết trong câu hỏi của tôi ở trên. Nhưng đó không phải là một câu trả lời cho câu hỏi của tôi.
Biggie

1
@Biggie Bạn không phải giới hạn quyền truy cập vào 127.0.0.1, nó chỉ khả dụng trên máy cục bộ.
user9517 hỗ trợ GoFundMonica

Có lẽ điều này hoàn toàn đúng, nhưng nó đặc biệt không trả lời câu hỏi của OP! Các câu trả lời bị cáo buộc.
Jortstek

4

Tôi muốn đạt được chức năng tương tự (chỉ cho phép người dùng cục bộ trong nginx) và tôi nhận ra rằng tôi có thể làm một cái gì đó đơn giản như thế này:

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

Tệp cấu hình này hoạt động tốt đối với tôi, tôi không sử dụng bất kỳ allowchỉ thị nào , nhưng chỉ 127.0.0.1:80và tôi có thể hạn chế quyền truy cập nginx đối với người dùng cục bộ!


câu trả lời tuyệt vời và đơn giản để giới hạn cho người dùng địa phương.
new2cpp
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.