如何根据 X-forwarded-for 标头拒绝访问资源

如何根据 X-forwarded-for 标头拒绝访问资源

我正在尝试根据 X-forwarded-for 标头中传递的客户端 IP 来限制对 Nginx 后面资源的访问。Nginx 在 Google Cloud Platform 上的 Kubernetes 集群上的容器中运行,并且仅在 x-forwarded-for 标头中传递真实的客户端 IP

到目前为止,我已经使用以下代码针对单个 IP 完成了此操作:

set $allow false;
if ($http_x_forwarded_for ~* 123.233.233.123) {
    set $allow true;
}
if ($http_x_forward_for ~* 10.20.30.40) {
    set $allow false;
}
if ($allow = false) {
    return 403;
}

但是我如何才能对整个 IP 范围执行此操作?手动指定数百个 IP 没有多大意义。

感谢所有帮助

答案1

使用 RealIP 模块来遵守标头的值X-Forwarded-For。设置set_real_ip_from为反向代理的 IP 地址(当前值为$remote_addr)。

例如:

server {
    ...
    real_ip_header X-Forwarded-For;
    set_real_ip_from 10.1.2.3;
    ...
}

现在,您应该能够使用客户端的真实 IP 地址来使用$remote_addrallow/指令。请参阅deny这个文件了解更多信息。

答案2

Richard 的回答已经包含了如何最好地获取 nginx 真实 IP 地址的信息。

同时,对于指定 IP 范围的问题,您可以使用http://nginx.org/en/docs/http/ngx_http_geo_module.html

geo模块的工作方式类似于map模块,即根据IP地址的值向变量分配值。

一个例子:

geo $allow {
    default 0;
    192.168.168.0/24 1;
}

server {
    real_ip_header X-Forwarded-For;
    set_real_ip_from 10.1.2.3;

    if ($allow = 0) {
        return 403;
    }
}

这里我们分配了geo映射,其中的默认值$allow是0。如果IP地址在子网中192.168.168.0/24$allow则将获取值1,并且允许请求​​。

geo您可以根据需要在块中包含任意多的行来定义您的 IP 范围。

答案3

这些对我有用。

geo $remote_addr $giveaccess {
      proxy 172.0.0.0/8; <-- Private IP range here
      default 0;
      11.22.33.44 1; <-- Allowed IP here
    }


server{
##
    location ^~ /secure_url_here {
        if ($giveaccess = 0){
          return 403; 
        }
        try_files $uri $uri/ /index.php?$args; <-- Add this line specific for your CMS, if required.
    }

参考:http://nginx.org/en/docs/http/ngx_http_geo_module.html

相关内容