我试图根据在 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_addr
和allow
/deny
指令使用客户端的真实 IP 地址。有关更多信息,请参阅此文档。
理查德的回答已经包含有关如何最好地获取 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)
这里我们分配geo
map,默认值为$allow
0。如果IP地址在子网中192.168.168.0/24
,则$allow
取值为1,请求被允许。
您可以根据geo
需要在块中包含任意数量的行来定义您的 IP 范围。