发生的场景:服务器端接收客户端请求的时候,一般需要进行签名验证,客户端IP限定等情况,在进行客户端IP限定的时候,需要首先获取该真实的IP。
一般分为两种情况:
方式一、客户端未经过代理,直接访问服务器端(nginx,squid,haproxy);
方式二、客户端通过多级代理,最终到达服务器端(nginx,squid,haproxy);
客户端请求信息都包含在HttpServletRequest中,可以通过方法getRemoteAddr()获得该客户端IP。
方式一形式,可以直接获得该客户端真实IP。
方式二中通过代理的形式,此时经过多级反向的代理,通过方法getRemoteAddr()得不到客户端真实IP,可以通过x-forwarded-for获得转发后请求信息。当客户端请求被转发,IP将会追加在其后并以逗号隔开,例如:10.47.103.13,4.2.2.2,10.96.112.230。
请求中的参数:
request.getHeader("x-forwarded-for") : 10.47.103.13,4.2.2.2,10.96.112.230
request.getHeader("X-Real-IP") : 10.47.103.13
request.getRemoteAddr():10.96.112.230
客户端访问经过转发,IP将会追加在其后并以逗号隔开。最终准确的客户端信息为:
x-forwarded-for 不为空,则为逗号前第一个IP ;
X-Real-IP不为空,则为该IP ;
否则为getRemoteAddr() ;
相关请求头的解释:
X-Forwarded-For :这是一个 Squid 开发的字段,只有在通过了HTTP代理或者负载均衡服务器时才会添加该项。
格式为X-Forwarded-For:client1,proxy1,proxy2,一般情况下,第一个ip为客户端真实ip,后面的为经过的代理服务器ip。现在大部分的代理都会加上这个请求头。
Proxy-Client-IP/WL- Proxy-Client-IP :这个一般是经过apache http服务器的请求才会有,用apache http做代理时一般会加上Proxy-Client-IP请求头,而WL-Proxy-Client-IP是他的weblogic插件加上的头。
HTTP_CLIENT_IP :有些代理服务器会加上此请求头。
X-Real-IP :nginx代理一般会加上此请求头。
配置IIS7/IIS8服务器 下载并解压 F5XForwardedFor文件。 根据自己的服务器操作系统版本将x86\Release或x64\Release目录下的F5XFFHttpModule.dll和F5XFFHttpModule.ini拷贝到某个目录,例如C:\F5XForwardedFor\。确保IIS进程对该目录有读取权限。 打开IIS管理器,双击模块功能。
单击配置本机模块,然后在弹出的对话框中,单击注册。
添加下载的.dll文件。
为添加的两个文件授权允许运行ISAPI和CGI扩展。
说明 确保您已经安装了ISAPI和CGI应用程序。
重启IIS服务器,等待配置生效。 配置Apache服务器 执行如下命令,安装Apache的一个第三方模块mod_rpaf。
wget https://github.com/gnif/mod_rpaf/archive/v0.6.0.tar.gz tar zxvf mod_rpaf-0.6.tar.gz cd mod_rpaf-0.6 /alidata/server/httpd/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c 修改Apache的配置文件/alidata/server/httpd/conf/httpd.conf,在最末尾添加以下配置信息。
LoadModule rpaf_module modules/mod_rpaf-2.0.so RPAFenable On RPAFsethostname On RPAFproxy_ips <IP_address> RPAFheader X-Forwarded-For
说明 如果您要获取代理服务器的地址,可以将代理服务器的网段添加到RPAFproxy_ips <IP_address>,如负载均衡的IP地址段100.64.0.0/10(100.64.0.0/10 是阿里云保留地址,其他用户无法分配到该网段内,不会存在安全风险)和高防IP地址段。多个IP地址段用逗号分隔。 添加完成后重启Apache。
/alidata/server/httpd/bin/apachectl restart 配置Nginx服务器 执行如下命令,安装http_realip_module。
wget http://nginx.org/download/nginx-1.0.12.tar.gz tar zxvf nginx-1.0.12.tar.gz cd nginx-1.0.12 ./configure --user=www --group=www --prefix=/alidata/server/nginx --with-http_stub_status_module --without-http-cache --with-http_ssl_module --with-http_realip_module make make install kill -USR2 cat /alidata/server/nginx/logs/nginx.pid
kill -QUIT cat /alidata/server/nginx/logs/ nginx.pid.oldbin
执行如下命令,打开nginx.conf文件。
vi /alidata/server/nginx/conf/nginx.conf 在以下配置信息后添加新的配置字段和信息。
fastcgi connect_timeout 300; fastcgi send_timeout 300; fastcgi read_timeout 300; fastcgi buffer_size 64k; fastcgi buffers 4 64k; fastcgi busy_buffers_size 128k; fastcgi temp_file_write_size 128k; 需要添加的配置字段和信息为:
set_real_ip_from IP_address real_ip_header X-Forwarded-For;
说明 如果您要获取代理服务器的地址,可以将代理服务器的网段添加到set_real_ip_from <IP_address>,如负载均衡的IP地址段100.64.0.0/10(100.64.0.0/10 是阿里云保留地址,其他用户无法分配到该网段内,不会存在安全风险)和高防IP地址段。多个IP地址段用逗号分隔。 执行如下命令,重启Nginx。
/alidata/server/nginx/sbin/nginx -s reload
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。