【问题标题】:How to make nginx behind reverse proxy allow access based on IP address from different header如何使反向代理后面的 nginx 允许基于来自不同标头的 IP 地址进行访问
【发布时间】:2019-05-16 11:41:03
【问题描述】:

我正在尝试仅允许特定 IP 地址访问我网站的特定位置。

我有两台服务器:带有 nginx 的负载均衡器和带有 nginx 的应用服务器。 我正在尝试根据客户端的 IP 地址允许对某个位置的请求。 为了调试,我向应用程序添加了标头日志记录,这就是我在那里看到的(即我猜反向代理正确地传输了真实的客户端 IP 地址):

"REMOTE_ADDR": "load.balancer.ip.address",
"HTTP_X_REAL_IP": "real.client.ip.address",

所以我在 nginx 中添加了 location 指令如下:

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 地址?

【问题讨论】:

    标签: nginx


    【解决方案1】:

    尝试将此添加到您的应用服务器 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;
    

    【讨论】:

      【解决方案2】:

      我尝试按照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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-21
        • 2015-09-11
        • 2013-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-01
        • 2021-04-13
        相关资源
        最近更新 更多