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

我试图限制对Nginx后面的资源的访问,基于在X-forwarded-for标头中传递的客户端IP。 Nginx正在Google云端平台上的Kubernetes群集中的一个容器中运行,而实际的客户端ips仅通过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; } 

但是,我怎样才能做到这一点的整个范围的IP? 用手指定数百个IP不会有多大意义。

所有的帮助表示赞赏

使用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; ... } 

您现在应该可以使用$remote_addrallow / deny使用客户端的真实IP地址的指令。 请参阅此文档了解更多

理查德的回答已经包含了如何最好地获得真正的IP地址到Nginx的信息。

同时,说明IP范围的问题,可以使用http://nginx.org/en/docs/http/ngx_http_geo_module.html

geo模块的工作方式与map模块相似,也就是说,variables根据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范围。