nginx 允许|拒绝 $realip_remote_addr

nginx allow|deny $realip_remote_addr

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

事情是这样的,我想将任何不是 Cloudflare 或本地主机的 IP 列入黑名单。这被证明是相当困难的,我试过在设置 real_ip 模块设置之前放置它,但没有雪茄。

这可能吗?如果用户不通过 cloudflare,这似乎是一个缺陷,它允许对某个 vhost 进行更多滥用。

有 $realip_remote_addr 变量,但我一辈子都找不到方法让 allow/deny 使用它来代替普通的 $remote_addr。

编辑:我注意到防火墙可以对此有所帮助。不幸的是,我真的只需要几个虚拟主机。

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

您可以为此使用 cloudflare 设置的 http header。每当通过 cloudflare 发出请求时,它会将 $http_cf_connecting_ip 设置为访问您机器的机器的 ip。

所以你可以写一个条件,拒绝所有空 $http_cf_connecting_ip.

的请求

这种简单性可以成就伟大的事情。

使用$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
}

您可以使用地理块轻松做到这一点

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