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

ptr*_*trh 16 nginx

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

到目前为止,我已经设法使用以下代码为单个 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;
}
Run Code Online (Sandbox Code Playgroud)

但是我如何为整个 IP 范围做到这一点?手动指定数百个 IP 没有多大意义。

感谢所有帮助

Ric*_*ith 15

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

您现在应该能够使用$remote_addrallow/deny指令使用客户端的真实 IP 地址。有关更多信息,请参阅此文档


Ter*_*nen 5

理查德的回答已经包含有关如何最好地获取 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这里我们分配geomap,默认值为$allow0。如果IP地址在子网中192.168.168.0/24,则$allow取值为1,请求被允许。

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