只允许 nginx 中的本地用户

Big*_*gie 27 nginx

我想限制某些 VHost 的访问,以便只有 127.0.0.1 可以访问它。我总是使用这样的东西来将 VHost 绑定到本地主机而不是外部 IP:

server {
    listen 127.0.0.1;
    server_name myvhost.local;
    location / {
        ....
    }
}
Run Code Online (Sandbox Code Playgroud)

但我注意到一些教程还包含allow针对 localhost 的显式指令并明确拒绝所有其他指令:

server {
    listen 127.0.0.1;
    server_name myvhost.local;
    location / {
        allow 127.0.0.1;
        deny all;
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

当我只在 127.0.0.1 收听时,真的需要这些allow/deny指令吗?

Ita*_*not 20

假设您的网络 ID 是192.168.1.0,请像这样编辑您的 conf 文件:

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;
}
Run Code Online (Sandbox Code Playgroud)

请让我知道它是如何为您工作的。

编辑#1:

是的,根据官方 Nginx wiki,allow 指令是必须的。他们的例子是:

location / {
    allow 192.168.1.1/24;
    allow 127.0.0.1;
    deny 192.168.1.2;
    deny all;
}
Run Code Online (Sandbox Code Playgroud)


Ter*_*nen 20

listen指令告诉操作系统 Web 服务器绑定自己的接口。所以,当你netstat -a启动nginx后查看,你会看到nginx只监听127.0.0.1的IP端口80,这意味着不能通过任何其他接口访问nginx服务器。

绑定到特定 IP 地址在实际网络堆栈中的工作级别低于nginx 配置中的allow/deny指令。

这意味着您不需要在您的用例中使用单独的allow/deny指令,因为网络堆栈中的连接受到限制。

如果您listen 80;只指定并使用allow/deny指令,则 nginx 将向客户端发送 HTTP 错误代码,告知访问被拒绝。

在这种listen 127.0.0.1;情况下,浏览器根本无法连接到服务器,因为没有打开可供浏览器连接的 TCP 端口。


peb*_*x11 6

我想实现相同的功能(只允许 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这个配置文件对我来说很好用,我没有使用任何allow指令,但只有127.0.0.1:80,并且我可以将 nginx 访问限制为仅本地用户!