nginx获取客户端真实ip

背景:

      公司所有的域名都是通过F5机器设置,其用户请求也都是通过F5转发,项目某些请求需要限制访问,加上运维没有配置F5透传ip功能,故准备在nginx上配置reaIp模块,获取用户真实的ip。

     F5代理转发,或者CDN代理转发之后的请求,获取到的ip一般都是F5的或者CDN的ip地址,其真实ip往往隐藏在请求中。

1,配置realIP模块

默认不会编辑进Nginx

通过--with-http_realip_module启用功能

2,指令解释

Syntax: set_real_ip_from address | CIDR | unix:;

Default: —

Context: http, server, location

#set_real_ip_from:真实服务器上一级代理的IP地址或者IP段,可以写多行

Syntax: real_ip_header field | X-Real-IP | X-Forwarded-For | proxy_protocol;

Default: real_ip_header X-Real-IP;

Context: http, server, location

#real_ip_header:从哪个header头检索出要的IP地址

Syntax: real_ip_recursive on | off;

Default: real_ip_recursive off;

Context: http, server, location

#real_ip_recursive:递归排除IP地址,ip串从右到左开始排除set_real_ip_from里面出现的IP,如果出现了未出现这些ip段的IP,那么这个IP将被认为是用户的IP。

3,透传ip到服务器上

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

增加一个$proxy_add_x_forwarded_for到X-Forwarded-For里去,注意是增加,而不是覆盖,当然由于默认的X-Forwarded-For值是空的,所以我们总感觉X-Forwarded-For的值就等于$proxy_add_x_forwarded_for的值,实际上当你搭建两台nginx在不同的ip上,并且都使用了这段配置,那你会发现在web服务器端通过request.getAttribute("X-Forwarded-For")获得的将会是客户端ip和第一台nginx的ip

4,具体nginx的配置

set_real_ip_from  10.10.1.1;

set_real_ip_from  10.10.1.2;

set_real_ip_from  10.10.1.3;

real_ip_header    X-Forwarded-For;

real_ip_recursive on;

 

 

location /rest {

allow 1.1.1.1;

allow 2.2.2.2;

deny all;

proxy_pass http://ecs-rest;

proxy_redirect off;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

client_max_body_size 100m;#允许客户端请求的最大单文件字节数

client_body_buffer_size 128k;#缓冲区代理缓冲用户端请求的最大字节数,

proxy_connect_timeout 90;#nginx跟后端服务器连接超时时间(代理连接超时)

proxy_send_timeout 90;#后端服务器数据回传时间(代理发送超时)

proxy_read_timeout 90;#连接成功后,后端服务器响应时间(代理接收超时)

proxy_buffer_size 4k;#设置代理服务器(nginx)保存用户头信息的缓冲区大小

proxy_buffers 4 32k;#proxy_buffers缓冲区,网页平均在32k以下的话,这样设置

proxy_busy_buffers_size 64k;#高负荷下缓冲大小(proxy_buffers*2)

proxy_temp_file_write_size 64k;#设定缓存文件夹大小,大于这个值,将从upstream服务器传

}

借鉴:https://www.centos.bz/2017/03/nginx-using-set_real_ip_from-get-client-ip/#3.%E4%BD%BF%E7%94%A8nginx%E8%87%AA%E5%B8%A6%E6%A8%A1%E5%9D%97realip%E8%8E%B7%E5%8F%96%E7%94%A8%E6%88%B7IP%E5%9C%B0%E5%9D%80

相关推荐