仅允许Nginx中的本地用户


22

我想限制某些VHost的访问,以便只有127.0.0.1可以访问它。我一直使用这样的方法将VHost绑定到本地主机,而不是外部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;
        ...
    }
}

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


尝试将允许线更改为:allow 127.0.0.1/32;
Itai Ganot

我的问题是,allow因为我设置listen为,是否根本需要它127.0.0.1
Biggie

Answers:


15

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端口可供浏览器连接。


1
好的,我忘了提到我还有更多的VHost,其中一些不仅绑定到本地主机。所有这些(仅本地和非本地)都在同一nginx实例上运行。因此netstat显示0.0.0.0:80(所有接口)的本地地址。然后,我仍可以在仅本地服务器上省略deny/ allow吗?
Biggie

在这种情况下,listen 80 default_server;当客户端请求绑定到的虚拟主机时,nginx将显示已通过伪指令定义的虚拟主机的内容127.0.0.1:80。如果没有default_server定义,则它将显示已listen 80;定义的服务器。
Tero Kilkanen

好吧,因此非本地用户不可能访问listen 127.0.0.1-servers,而我甚至不需要allow/deny这些服务器?
Biggie 2015年

是的,那是不可能的。
Tero Kilkanen 2015年

与当前的最高答案不同,这回答了问题。为什么不是顶部?
Jortstek

16

假设您的网络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;
}

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

编辑#1:

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

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
Biggie

请检查编辑#1。
Itai Ganot 2015年

对不起,我认为您不理解我的问题;)您发布的内容(或多或少)已经是我在上面的问题中所写的内容。但这不是我的问题的答案。
Biggie

1
@Biggie您不必限制对127.0.0.1的访问,它仅在本地计算机上可用。
user9517支持GoFundMonica

大概这是对的,但是它并不能专门回答OP的问题!接受的答案是。
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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.