如何使反向代理后面的Nginx允许基于来自不同标头的IP地址进行访问

时间:2019-05-16 11:41:04

标签: nginx

我试图仅允许访问特定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决定使用allowdeny时,如何强制nginx在不同的标头中检查客户端的IP地址?

2 个答案:

答案 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_fromreal_ip_header。但是由于某些原因,指令allowdeny仍然表现得好像我没有替换真实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;
}