nginx允许|拒绝$ realip_remote_addr

时间:2016-08-27 02:39:29

标签: nginx proxy cloudflare real-ip

使用nginx,您可以允许和拒绝范围和ips(https://www.nginx.com/resources/admin-guide/restricting-access/)。 使用realip模块,您可以在cloudflare之后将其使用的IP更改为真实IP。 (http://nginx.org/en/docs/http/ngx_http_realip_module.html

现在就是这样,我想将任何不是Cloudflare或localhost的ip列入黑名单。这是相当困难的,我在设置real_ip模块设置之前尝试过它,而且没有雪茄。

这有可能吗?如果用户没有通过cloudflare似乎是一个缺陷,它允许对某个虚拟主机进行更多的滥用。

有$ realip_remote_addr变量,但我不能在我的生活中找到一种方法来允许/拒绝使用而不是正常的$ remote_addr。

编辑:我注意到防火墙可以为此提供帮助。不幸的是,我真的只需要几个vhosts。

3 个答案:

答案 0 :(得分:1)

我认为你想要阻止你机器的直接访问,即通过机器的ip。

您可以使用cloudflare设置的http标头。每当通过cloudflare发出请求时,它会将$http_cf_connecting_ip设置为访问您计算机的计算机的IP。

因此,您可以编写条件,拒绝所有空$http_cf_connecting_ip的请求。

答案 1 :(得分:1)

您可以使用地理区块轻松完成

geo $realip_remote_addr $giveaccess {
      default 0;
      IPBLOCK1 1;
      IPBLOCK2 1;
      …
    }
    server {
       …
       location / {
         if ($giveaccess = 0){
          return 403 "$realip_remote_addr";
          #use it for debug
        }
    }

答案 2 :(得分:0)

这种简单性可以带来很棒的东西。

使用$realip_remote_addr == $remote_addr会更聪明,因为$http_*可能会被发送此类请求的客户端伪造。 (朋友指出我。)

编辑:好的,考虑到上述问题,最好使用Lua模块。

类似于下面的东西。

access_by_lua_block {
    if ngx.var.remote_addr == ngx.var.realip_remote_addr then
            return ngx.redirect("http://somewhere.else.please/");
    end
}