我试图仅允许访问特定IP地址的网站的特定位置。
我有两台服务器:使用nginx的负载均衡器和使用nginx的应用程序服务器。 我试图允许基于客户端IP地址的请求到达某个位置。 为了进行调试,我在应用程序中添加了标头的日志记录,这就是我在此处看到的内容(即,我认为反向代理正确传输了真实的客户端IP地址):
"REMOTE_ADDR": "load.balancer.ip.address",
"HTTP_X_REAL_IP": "real.client.ip.address",
因此我将位置指令添加到了nginx,如下所示:
location /upload {
allow real.client.ip.address;
deny all;
alias /path/to/upload/folder;
}
现在,当我尝试访问浏览器中的位置/upload/something
时,我看到了nginx的错误403。
但是,当我删除deny all
指令或将real.client.ip.address
更改为load.balancer.ip.address
时,我便能够成功访问该位置。
当nginx决定使用allow
或deny
时,如何强制nginx在不同的标头中检查客户端的IP地址?
答案 0 :(得分:2)
尝试将其添加到您的应用服务器nginx location
:
# Defines trusted addresses that are known to send correct replacement addresses
set_real_ip_from ip.of.load.balancer;
# Defines the request header field whose value will be used to replace the client address.
real_ip_header X-Whatever-Header-Holds-Real-IP;
答案 1 :(得分:0)
我尝试使用Dusan's answer中建议的指令set_real_ip_from
和real_ip_header
。但是由于某些原因,指令allow
和deny
仍然表现得好像我没有替换真实IP地址一样。
所以我改用geo module
geo $http_x_real_ip $is_not_from_office {
default 1;
allowed.ip.address.xxx 0;
}
我将$http_x_real_ip
作为第一个参数,因为真实IP包含在HTTP_X_REAL_IP
标头中。
然后我按如下方式在nginx配置中编辑位置:
location /upload {
if ($is_not_from_office) {
return 403;
}
alias /path/to/upload/directory;
}