一、 Forwarded For是什么?
在理解nginxx-forwarded-for之前,我们先了解一下Forwarded For。
简单的说,当我们通过代理访问网站时,网站只会记录代理服务器的IP地址,这样会影响我们运维的判断和处理方式,于是就有了Forwarded For这个标准。
它允许代理服务器在数据包头部加入“X-Forwarded-For”的字段,用于记录原始请求的客户端真实IP地址。
二、为什么要使用nginxx-forwarded-for?
如果你的架构中使用了nginx这个反向代理服务器,而且又想记录用户的真实IP地址,那么就要使用nginxx-forwarded-for配置来保存这个信息。
nginx默认只保存最后一个代理服务器的IP地址,而没有保存前面的IP地址信息,因此它不能完整记录用户的信息。为此,nginx的官方提供了一个设置,即ngx_http_realip_module。
ngx_http_realip_module模块只在HTTP请求的第一个请求头中包含一个IP地址,并且它只改变IP地址。
当启用这个模块后,如果客户端经过代理服务器访问应用,则可以通过nginx的标准变量(如access_log,ngx_http_limit_req_module等),将它们的真正公网IP地址转嫁回应用。
三、怎么使用nginxx-forwarded-for?
1. 安装ngx_http_realip_module模块
如果安装了完整版nginx,则可以通过检查所有已默认安装模块列表来检查是否已安装ngx_http_realip_module:
``` ./configure --help | grep realip ```如果看到了--with-http_realip_module的选项,并且这个选项已启用,则表示已将ngx_http_realip_module模块包含到nginx进程中。
如果没有启用,则必须重新编译nginx,启用它,或使用其他软件源重新安装该软件,带有ngx_http_realip_module模块的nginx。
2. 配置nginx.conf文件
``` http { real_ip_header X-Forwarded-For; set_real_ip_from 10.0.0.0/8; set_real_ip_from 172.16.0.0/12; set_real_ip_from 192.168.0.0/16; real_ip_recursive on; } ```在http{...}内配置,配置real_ip_header,告诉nginx使用哪个请求头来读取客户端真实IP地址。 标准填写为X-Forwarded-For。
set_real_ip_from用于指定信任的代理服务器的IP或范围。如果设置为空,则视为代理服务器具有等同于客户端的权威性,容易受到恶意定义的X-Forwarded-For攻击。
real_ip_recursive,默认情况下,ngx_http_realip_module模块的真正的转发人IP地址是从客户端或从最后一个代理服务器的IP地址中获取的,另一个代理服务器的IP地址是不能获取的,如果要获取,需要开启这一设置。
四、小结
若要获取客户端真实IP,则需要使用ngx_http_realip_module 模块。ngx_http_realip_module 模块在经过代理服务器时,支持从http请求头X-Forwarded-For中获取客户端真实IP,并将客户端真实IP保存到nginx标准变量中。
因此,如果你的应用有代理服务器的话,请建议节省时间,并建议使用ngx_http_realip_module mod。