我正在尝试根据 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_addr
和allow
/指令。请参阅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.
}