我使用nginx作为我们的应用程序Web服务器(gunicorn;它是一个Django应用程序)前面的反向代理。 打这个Web应用程序的大多数用户实际上是通过一个转发代理路由的。
由于请求通过转发代理服务器传递,这些情况下的IP地址始终来自代理服务器,而不是来自原始请求者。 我想纠正这种情况。
来自转发代理的所有请求都包含一个via:proxy的头部。 在这样的请求中,原始请求者IP被发送到称为X-IORG-FBS-UIP (还有X-FORWARDED-FOR )的单独的HTTP报头字段中。
我的问题是,我怎样才能configurationnginx,以便它检测请求是否via:proxy标题,如果是,从X-IORG-FBS-UIP标头logging原始的请求者IP? 一个说明性的例子会很棒; 提前致谢! 我的nginx是v 1.4.6
请注意,我没有使用正向代理的IP范围。 如果我这样做,解决这个问题的一种方法是设置etc/nginx/conf.d/proxies_acl.conf :
set_real_ip_from 1.2.3.0/22; set_real_ip_from 23.22.20.0/22; real_ip_header X-IORG-FBS-UIP;
尝试这个。 有兴趣听到它是否有效。 如果你有任何未翻译的客户,它会打破。
set_real_ip_from 0.0.0.0/0; real_ip_header X-IORG-FBS-UIP;
上面的set_real_ip_from和real_ip_header语句是执行此操作的标准方法。 你的情况和大多数人的唯一区别是你不知道代理的IP地址。 0.0.0.0/0表示“每个IP地址”,所以上面的语句表示“对于每个请求,从X-IORG-FBS-UIP报头获取日志的客户端IP”。 我的猜测是,如果该头不存在,它将使用实际的IP。
在大多数情况下,您可以获取代理的IP地址。 AWS,CloudFlare等。你为什么不知道你的代理的IP?
我还注意到几个月前你问了一个几乎相同的问题,并接受了答案。 如果有人不回答你的问题,不要将其标记为答案。
请求替代方法 – 不起作用
你问了一个基于via:proxy头部的替代方法。 我不相信这是可能的。 我写了这个
if ($http_X_via:proxy) { set_real_ip_from $remote_addr; real_ip_header X-IORG-FBS-UIP; }
但是失败了。 Nginx说set_real_ip_from不能进入if块。 这意味着你必须提前知道你的IP地址,或者使用我上面的其他解决scheme。
指定代理的IP地址有一个很好的理由。 任何人都可以发送代理标题到您的服务器,“真实IP”设置为一些任意的IP地址,打开潜在的安全漏洞,如果你依靠这些头传递的地址。 这就是为什么Real_ip模块被configuration为让你指定信任的转发代理。
如果你的目标只是让nginxlogging假设的真实ip,你不需要改变请求者的IP。 您只需要logging标题X-IORG-FBS-UIP和X-FORWARDED-FOR X-IORG-FBS-UIP X-FORWARDED-FOR 。 如此处所述 ,您可以configurationnginxlogging器来捕获X-FORWARDED-FOR如下所示:
add the following line in your general nginx.conf in the http {} section. log_format main '$http_x_forwarded_for - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent "$http_referer" ' '"$http_user_agent"' ;
我认为为X-IORG-FBS-UIP添加第二个logging器指令将允许您处理两者。 更多关于在这里configurationnginxlogging器。